?

優化單片機性能的課程實驗教學改革

2024-01-19 00:41
濟寧學院學報 2023年6期
關鍵詞:內核代碼總線

高 歌

(濟寧學院 產業學院,山東 曲阜 273155)

隨著現代工業的快速發展,單片機(Micro controller Unit,簡稱MCU)技術迅速發展,在工業控制、智能家用電器、通訊和軍事等眾多領域得到了越來越廣泛的應用,社會對掌握該技術的人才需求越來越大?!皢纹瑱C原理及應用”課程作為自動化類專業的基礎課程,要求學生不僅需要掌握單片機大量的理論知識,還要進行理論和實踐相結合,才能更深入地理解單片機知識。實驗教學作為課程教學的一個教學環節在整個教學中具有重要的作用,它不僅可以使學生加深對理論知識的理解,還能夠培養他們的動手操作能力,開拓他們的思維[1]153-154。

單片機課程實驗教學中,由于MCU資源有限,單片機的實驗教學面臨著很大的挑戰,如何在有限的資源下提高MCU的工作效率變得十分重要。實驗教學中需要在提高性能和效率的前提下盡可能降低功率,按照當前研究來看,大多數MCU實驗的思路都是通過提高工作效率來盡快完成當前任務,然后使單片機進入低功率狀態,這樣不僅能夠減少資源的浪費,還能從整體上提高效率。提高嵌入式單片機的性能是當前研究人員廣泛關注的課題之一,不同的架構和系統功能的內部運行方式往往存在一些細微差別,而這些差別會影響到系統的表現。

論文以飛思卡爾Kinetis K系列MCU為例,分析影響系統性能的因素,通過在實驗中提高MCU運行效率來對系統的性能進行優化,確保學生提高對MCU的認識和理解,能夠獲得更好的實驗教學效果。Kinetis K系列芯片是2010年Freescale公司推出的基于ARM?CortexTM-M4內核的芯片,MCU的基本結構示意圖[2]如圖1所示。

圖1 MCU的基本結構圖

一、Kinetis K 系列架構和主要硬件概述

Kinetis K系列的系統主要由Kinesis內核總線、SRAM靜態存儲器、系統緩存、閃存控制器(FMC)、交叉開關(AXBS)組成。經過多年的發展,Kinetis K系列逐漸成熟,簡化結構框圖[3]如圖2所示。

圖2 Kinetis K系列的簡化結構框圖

Kinesis K系列的系統架構是影響單片機整體性能最重要的因素之一。內核總線中,系統總線周期的時序取決于訪問類型。系統總線的數據訪問在內核無附加延時,而指令訪問則會在內核增加一個等待狀態。Kinetis系統的存儲器映像匯總了地址在0x2000_0000以下的主要存儲器區域,使得從外部存儲器執行代碼時發揮最大性能[4]2。

SRAM靜態存儲器是負責存儲代碼和數據的區域,內核端口可通過CODE總線和系統總線訪問SRMA,MCU片上的非內核主機也可通過后門端口訪問SRAM,所有Kinetis K系列器件都含有兩個片上SRAM塊。第一個塊(SRAM_L)映射于CODE總線,第二個塊(SRAM_U)則映射于系統總線。由于SRAM控制器處理的訪問端口比SRAM塊要多,因此SRAM控制器具有內部的仲裁邏輯。仲裁過程通過MCM_CR中的字段進行控制,給每個SRAM塊預留了可編程的仲裁模式。

Kinetis器件中含有可顯著提高性能的系統緩存,系統緩存實際上包含兩個獨立的8KB高速緩存塊。第一個8KB緩存用于CODE總線訪問,第二個8KB緩存用于系統總線訪問。高速緩存的設置通過使用預定義的地址區域進行配置。系統緩存的存在,使得在從外部存儲器執行代碼時,速度優勢尤為明顯。

閃存控制器(FMC)是閃存塊和系統的接口。在典型配置中,內核總線和系統總線的時鐘速度比閃存時鐘的速度要快得多。FMC具有的一些特性可用來加速閃存訪問,FMC緩存和預取推理緩沖器可使FMC響應閃存訪問時無附加等待狀態。只要請求的信息在緩存和預取緩沖器中可用,FMC的響應無附加等待狀態。

交叉開關是微控制器的主要總線互連結構。交叉開關負責處理總線主控器和從端口之間的連接,當多個主控器同時嘗試訪問同一從端口時,還負責處理主控器之間的仲裁。

二、實驗教學中存在的問題

在單片機(MCU)實驗教學過程中,作為課堂教學的一個教學環節,通常是教師提供實驗程序,學生在規定的時間內按照規定的步驟完成實驗內容。學生在實驗中很少涉及實際的電路編程內容,導致學生對設計類實驗無從下手,不知道如何進行系統設計。在實驗教學中,通常存在以下問題:

1.實驗教學內容與最新技術的整合不足。隨著技術的快速發展,實驗教學需要與最新的技術和平臺進行整合,以提供更全面、實用和前沿的教學內容。對于一些老舊的Kinetis單片機型號,可能無法利用最新技術進行教學和開發,因此需要合理地利用一些隱藏式的功能來提高教學效果。

2.實驗教學案例相對缺乏。對于初學者來說,缺乏實際的教學案例可能導致理論知識與實際應用脫節。所以需要提供豐富的教學案例,來幫助學生更好地理解和應用Kinetis系列單片機的功能和特點。

3.教學過程中互動與實踐環節相對較少。在課程實驗教學中,應注重互動與實踐環節的設計。缺乏互動和實踐的環節可能導致學生對Kinetis系列單片機的理解和應用存在局限性,無法真正掌握相關技能。

三、實驗教學性能優化方案分析

針對實驗教學中存在問題,以Kinetis K系列單片機為例,通過盡可能多地使用SRAM_L塊存儲關鍵代碼和數據、使用MUC系統緩存、閃存控制器(FMC)中固有的閃存加速特性、合理使用代碼優化功能、采用DMA傳輸大塊數據、采用錯誤檢測和冗余設計等措施來優化系統,提高單片機的性能和可靠性,提高實驗教學效果和實驗效率。

(一)盡可能多地使用SRAM_L塊存儲關鍵代碼和數據

所有Kinetis K系列單片機都設置有兩個片上SRAM塊。第一個塊(SRAM_L)映射于CODE總線,第二個塊(SRAM_U)則映射于系統總線。訪問存儲器本身僅需一個周期,但由于指令訪問系統總線時在內核延時一個時鐘周期,所以SRAM_U的指令訪問至少需要兩個時鐘周期。SRAM_L是唯一能存放代碼也能存放數據的存儲器,并且始終保證內核訪問僅需一個周期。因此,盡可能多地使用SRAM_L塊具有很大意義,它是存放關鍵代碼的良好區域。

SRAM_L和SRAM_U是Kinetis K系列單片機內部的兩個獨立的RAM區域,它們的地址空間是連續的,但是訪問方式不同。SRAM_U是通過系統總線訪問的,SRAM_L是通過代碼總線訪問的。這意味著SRAM_U可以更快地存儲和讀取數據,而SRAM_L可以更快地執行代碼[5]5。

Kinetis K系列單片機提供了修改SRAM_L和SRAM_U配置的方法,具體可以通過采取以下步驟來實現:

1.修改鏈接器配置文件(ICF文件),定義SRAM_L和SRAM_U的起始和結束地址,以及相應的內存區域[6]3。如:

define symbol __ICFEDIT_region_RAM_start__ = 0x1FFFC000;

define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFFFF;

define symbol __region_RAM2_start__ = 0x20000000;

define symbol __region_RAM2_end__ = 0x20003FFF;

define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];

define region RAM2_region = mem:[from __region_RAM2_start__ to __region_RAM2_end__];

place in RAM2_region {section MY_RAM2};

2.在程序文件中,使用特殊的關鍵字或屬性來指定變量或函數的存儲位置。如,在IAR編譯器中,可以使用@符號來進行絕對定位[7]3。

uint8_t buffer[1024]@“MY_RAM2”;//將buffer數組放在SRAM_U中

void my_function(void)@“MY_RAM2”;//將my_function函數放在SRAM_U中

3.在對變量和函數進行定義時不要超過16KB,否則會導致編譯器報錯。如果需要使用大于16KB的數組或結構體,可以將它們分割成兩個或多個小于16KB的部分,并分別放在SRAM_L和SRAM_U中。

因此,通過步驟1-3的自由組合,可以配置SRAM_L和SRAM_U的具體地址和內存區域,將重要的指令存儲在代碼執行較快的SRAM_L中,并且將超過16KB的數組或結構體分割,存儲在數據訪問較快的SRAM_U中,從而提高單片機程序的運行效率。

(二)盡量使用MUC系統緩存

緩存是一種高速的內存,它可以存儲單片機頻繁訪問的代碼或數據,從而減少對慢速的外部存儲器(如Flash或SDRAM)的訪問[8]35。Kinetis K系列單片機內部集成了一個4KB的系統緩存(System Cache),它可以用于加速對Flash和FlexRAM(可作為EEPROM使用)的訪問。系統緩存可以配置為四種模式之一:禁用模式、寫回模式、寫通過模式、只讀模式。

論文設計了一個互動和實踐結合的實驗,來引導學生了解如何優化系統緩存,提高訪問速度。根據系統提供的現有功能,讓學生在系統緩存四種模式之下分別運行同樣的測試程序,并對比不同緩存模式下測試程序對Flash和FlexRAM的訪問速度,自行總結出最優選擇。

實驗設計思路為:首先,創建一個新的工程,添加系統緩存驅動程序和頭文件,編寫主函數和測試函數,分別用于初始化系統緩存和測試對Flash和FlexRAM的訪問速度。其次,編譯并下載程序到開發板上,分別設置系統緩存為禁用模式、寫回模式、寫通過模式和只讀模式,觀察并記錄串口終端上顯示的結果。再次,將四種緩存模式下對Flash和FlexRAM的訪問時間進行比較和分析。最后,總結出系統緩存對單片機性能的影響。

通過實驗,可得到如下結果:

1.禁用模式。在這種模式下,系統緩存沒有起到任何作用,所有對Flash和FlexRAM的訪問都直接通過總線進行,因此訪問速度最慢。根據實驗代碼,假設每次讀取一個字(4字節),那么訪問Flash和FlexRAM各需要1000次,總共需要2000次。假設總線頻率為60MHz,那么每次訪問需要16.67ns,那么總共需要33.34μs[9]。

相關部分代碼如下:

......

cache_mode=kCacheDisableMode;//設置緩存模式為禁用模式

CACHE_DRV_Init(cache_mode);//初始化系統緩存,并設置其工作模式

print_string(“Cache mode:Disable ”);//打印緩存模式

test_flash();//測試對Flash的訪問速度

test_flexram();//測試對FlexRAM的訪問速度

......

2.寫回模式。在這種模式下,系統緩存被啟用,并且當緩存行被替換時,它會將修改過的數據寫回到Flash或FlexRAM中。這種模式可以提高對Flash和FlexRAM的讀取速度,但也會增加對Flash和FlexRAM的寫入時間。根據實驗代碼,假設每次讀取一個字(4字節),那么訪問Flash和FlexRAM各需要1000次,總共需要2000次。假設系統緩存命中率為80%,那么緩存命中時的訪問時間為0.1ns,緩存未命中時的訪問時間為16.67ns,總共需要6.68μs。但是,由于系統緩存是寫回模式,當緩存行被替換時,還需要將其寫回到Flash或FlexRAM中。假設每次寫入一個字(4字節),那么寫入Flash和FlexRAM各需要250次(假設每個緩存行有4個字),總共需要500次。假設寫入Flash和FlexRAM的時間分別為100μs和10μs,那么總共需要55000μs。因此,寫回模式下的總時間為55006.68μs[10]13。

相關代碼如下:

......

cache_mode=kCacheWriteBackMode;//設置緩存模式為寫回模式

CACHE_DRV_Init(cache_mode);//初始化系統緩存,并設置其工作模式

print_string(“Cache mode:Write Back ”);//打印緩存模式

test_flash();//測試對Flash的訪問速度

test_flexram();//測試對FlexRAM的訪問速度

......

3.寫通過模式。在這種模式下,系統緩存被啟用,并且當緩存行被修改時,它會同時更新Flash或FlexRAM中的數據。這種模式可以提高對Flash和FlexRAM的讀取速度,但也會增加對Flash和FlexRAM的寫入時間。根據實驗代碼,假設每次讀取一個字(4字節),那么訪問Flash和FlexRAM各需要1000次,總共需要2000次。假設系統緩存命中率為80%,那么緩存命中時的訪問時間為0.1ns,緩存未命中時的訪問時間為16.67ns,總共需要6.68μs。但是,由于系統緩存是寫通過模式,當緩存行被修改時,還需要同時更新Flash或FlexRAM中的數據。假設每次修改一個字(4字節),那么修改Flash和FlexRAM各需要1000次,總共需要2000次。假設修改Flash和FlexRAM的時間分別為100us和10us,總共需要220000μs。因此,寫通過模式下的總時間為220006.68μs[11]。

相關代碼如下:

......

cache_mode = kCacheWriteThroughMode;//設置緩存模式為寫通過模式

CACHE_DRV_Init(cache_mode);//初始化系統緩存,并設置其工作模式

print_string(“Cache mode:Write Through ”);//打印緩存模式

test_flash();//測試對Flash的訪問速度

test_flexram();//測試對FlexRAM的訪問速度

......

4.只讀模式。在這種模式下,系統緩存被啟用,但只用于讀取Flash或FlexRAM中的數據,不允許寫入。這種模式可以最大程度地提高對Flash和FlexRAM的讀取速度,而不會增加對Flash和FlexRAM的寫入時間。根據實驗代碼,假設每次讀取一個字(4字節),那么訪問Flash和FlexRAM各需要1000次,總共需要2000次。假設系統緩存命中率為80%,那么緩存命中時的訪問時間為0.1ns,緩存未命中時的訪問時間為16.67ns。那么總共需要6.68μs。由于系統緩存是只讀模式,不會對Flash或FlexRAM進行任何寫入操作,因此不會產生額外的時間開銷,只讀模式下的總時間為6.68μs[12]。

相關代碼如下:

......

cache_mode = kCacheReadMode;//設置緩存模式為只讀模式

CACHE_DRV_Init(cache_mode);//初始化系統緩存,并設置其工作模式

print_string(“Cache mode:Read Only ”);//打印緩存模式

test_flash();//測試對Flash的訪問速度

test_flexram();//測試對FlexRAM的訪問速度

......

綜上,四種模式下訪問Flash和FlexRAM的時間如表1所示,顯然當使用系統緩存時,能夠減少對Flash和FlexRAM的讀時間,但是由于寫回模式和寫通過模式下需要對Flash和FlexRAM進行寫操作,反而極大的增加了操作的總時間。因此,如果需要提高系統運行效率,應當設置系統緩存為只讀模式。

表1 四種模式下訪問Flash和FlexRAM的時間

(三)其他優化方案

此外,還有一些常見的單片機性能優化方法,主要包括:

1.預先對數據傳送和代碼位置進行計劃,選擇合適的總線和外設來傳輸數據,以避免沖突和延遲。選擇合適的存儲器來存放代碼,以提高執行速度和效率,選擇合適的緩存模式可以優化閃存和SRAM的訪問。

2.充分利用閃存控制器(FMC)中固有的閃存加速特性。利用FMC提供的FlexMemory功能,將部分閃存作為EEPROM使用。這樣可以在不增加外部存儲器的情況下,實現數據的非易失性存儲和快速訪問。FlexMemory還支持分區功能,可以根據應用需求靈活地配置EEPROM和閃存的大小。利用FMC提供的安全訪問功能,保護閃存中的敏感數據或代碼。FMC可以設置不同的訪問權限,如只讀、只寫、讀寫或禁止訪問,以及不同的訪問范圍,如字節、頁或扇區。FMC還支持閃存保護單元(FPU),可以對閃存中的特定區域進行加密或解密。

3.合理使用代碼優化功能。編譯器通常為優化速度或空間提供了一個選擇,表面上看來,優化速度是優化性能的最佳方案,但事實并非總是如此。如果對空間的優化可以為SRAM塊中的模式代碼留有余地,或者更利于在緩存中容納函數,那么優化空間可能更利于提升系統性能。實驗可以設置相應的開關選項,以確定最佳的編譯器設置。如,在IAR Embedded Workbench中,可以通過Project->Options->C/C++ Compiler->Optimizations來設置優化級別和相關選項。在Keil MDK中,可以通過Project->Options for Target->C/C+±>Optimizations來設置優化級別和相關選項[13]。

4.采用DMA傳輸大塊數據。DMA傳輸數據比內核的效率更高。使用DMA還可釋放內核,便于內核執行其他任務(更加并行化)。在Kinetis K系列單片機中,有一個eDMA(增強型直接內存訪問)模塊,它可以支持多達16個DMA通道,每個通道可以配置不同的觸發源、傳輸屬性和中斷選項。eDMA模塊可以與I2C(串行總線)模塊配合使用,實現I2C讀取或寫入大塊數據的功能[14]60-65。

5.采用錯誤檢測和冗余設計等措施來優化系統可靠性,如使用校驗算法定期檢查存儲器中的數據是否錯誤。錯誤檢測和冗余設計是兩種常用的可靠性優化措施,它們可以提高系統的容錯能力和抗干擾能力。具體來說,錯誤檢測是指通過一定的算法或電路,檢測系統中是否存在錯誤或異常,并及時報告或糾正。冗余設計是指在系統中增加額外的元件或功能,以備原有的元件或功能出現故障時替代使用。

以上單片機性能優化的思路,就是下一步實驗教學的改進方向,希望能在以后的工作中持續深化。

結語

論文通過優化實驗教學方法,整合新技術和平臺,并提供實際實驗案例,改進了教學環節,提高了高校實驗教學的趣味性和實用性,達到了較好的教學目的。在實驗案例的設計上,通過引導學生編寫測試程序驗證不同設置下的單片機運行效率,使學生們直觀地了解了系統性能優化的方法、過程和意義,從而提升了教學效果。

猜你喜歡
內核代碼總線
強化『高新』內核 打造農業『硅谷』
基于嵌入式Linux內核的自恢復設計
Linux內核mmap保護機制研究
基于PCI Express總線的xHC與FPGA的直接通信
機載飛控1553B總線轉以太網總線設計
創世代碼
創世代碼
創世代碼
創世代碼
微生物內核 生態型農資
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合