本篇文章主要是介紹FSP在e2studio下生成的啟動(dòng)文件的代碼說(shuō)明,讓用戶(hù)對(duì)瑞薩RA MCU的啟動(dòng)過(guò)程有個(gè)初步了解。
瑞薩靈活軟件包(FSP)是一個(gè)靈活配置的軟件包,旨在提供易于使用、可擴(kuò)展、高質(zhì)量的嵌入式系統(tǒng)設(shè)計(jì)軟件。它適用于RA系列的MCU,提供了統(tǒng)一直觀的API,并有詳細(xì)的解釋和例程應(yīng)用,可以按照客戶(hù)不同的需求自動(dòng)生成相應(yīng)驅(qū)動(dòng)程序。
啟動(dòng)文件是程序上電復(fù)位后執(zhí)行的第一個(gè)程序。它一般包括如下幾個(gè):
1.初始化堆棧
2.使能FPU
3.定位中斷向量表
4.配置系統(tǒng)時(shí)鐘
5.啟用CORTEX-M33棧監(jiān)視器
6.初始化C語(yǔ)言運(yùn)行環(huán)境
7.初始化變量SystemCoreClock,這個(gè)變量存放的是處理器時(shí)鐘的頻率
8.初始化用于觸發(fā)NVIC中斷的ELC(事件鏈接控制)
9.BSP初始化
3.1 棧區(qū)(Stack)
一種順序數(shù)據(jù)結(jié)構(gòu),滿(mǎn)足后進(jìn)先出原則。由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。棧特別方便用來(lái)保存/恢復(fù)調(diào)用現(xiàn)場(chǎng)。在函數(shù)被調(diào)用時(shí),其參數(shù)也會(huì)被壓入發(fā)起調(diào)用的進(jìn)程棧中,并待到調(diào)用結(jié)束后,函數(shù)的返回值也會(huì)被存放回棧中。如果函數(shù)調(diào)用時(shí),如果函數(shù)參數(shù)和局部變量較多,寄存器放不下,則需要適當(dāng)增加棧區(qū)的大小。
3.2 堆區(qū)(heap)
通常由程序員手動(dòng)分配,使用malloc和free進(jìn)行分配和釋放。注意,使用完需及時(shí)釋放(free),否則容易造成內(nèi)存泄漏。
3.3 e2Studio中堆棧的設(shè)置
宏“BSP_CFG_STACK_MAIN_BYTES”可以在FSP Configuration的“BSP”屬性欄中的“RA Common”中通過(guò)修改“Main stack size”設(shè)置,默認(rèn)為1KB(0x400 Byte)。
宏“BSP_CFG_HEAP_BYTES”可以在FSP Configuration的“BSP”屬性欄中的“RA Common”中通過(guò)修改“Heap size”設(shè)置,默認(rèn)為1KB(0x400 Byte)。如圖3-3-1所示。
圖3-3-1 堆棧區(qū)的大小設(shè)置
g_main_stack和g_heap分別代表主棧和堆區(qū)的數(shù)組,后面還有屬性修飾。
“BSP_PLACE_IN_SECTION(BSP_SECTION_STACK)”,宏展開(kāi)后為“__attribute__((section( “.stack”))) __attribute__((__used__))”
“BSP_PLACE_IN_SECTION(BSP_SECTION_HEAP)”,宏展開(kāi)后為“__attribute__((section( “.heap”))) __attribute__((__used__))”
其修飾屬性解釋如下:
__attribute__((section( “參數(shù)名”))):可以將變量定義到指定的輸入段“參數(shù)名”中。
__attribute__((__used__)):參數(shù)“__used__”告訴編譯器,這個(gè)變量會(huì)被使用,即使在編譯器優(yōu)化時(shí)沒(méi)有被顯式地調(diào)用。這個(gè)屬性可以防止編譯器將未使用的函數(shù)或變量?jī)?yōu)化掉,確保它們?cè)诔绦蛑写嬖凇?/p>
圖3-3-2 堆棧區(qū)數(shù)組屬性修飾
代碼中的“BSP_ALIGN_VARIABLE(BSP_STACK_ALIGNMENT)” ,宏展開(kāi)后為“__attribute__((aligned(8)))”,代表堆棧區(qū)在分配時(shí),會(huì)按照8字節(jié)對(duì)齊方式進(jìn)行。
__attribute__((weak)):用戶(hù)可以在用戶(hù)文件中重新定義一個(gè)同名函數(shù),最終編譯器編譯的時(shí)候,會(huì)選擇用戶(hù)定義的函數(shù),如果用戶(hù)沒(méi)有重新定義這個(gè)函數(shù),那么編譯器就會(huì)執(zhí)行_weak 聲明的函數(shù),并且編譯器不會(huì)報(bào)錯(cuò)。所以我們可以在別的地方定義一個(gè)相同名字的函數(shù)。該函數(shù)不能在同一個(gè).C文件中。
圖3-3-2 函數(shù)屬性宏定義
定義一個(gè)中斷向量指針數(shù)組__Vectors[16],將此表放入到“.fixed_vectors”的輸入段中。
圖4-1 中斷向量表定義
系統(tǒng)上電或復(fù)位后直接執(zhí)行入口函數(shù)Reset_Handler(),包括兩個(gè)函數(shù):SystemInit()和main()。SystemInit()主要是用BSP對(duì)系統(tǒng)進(jìn)行初始化,隨后通過(guò)main函數(shù)進(jìn)入用戶(hù)代碼。BSP負(fù)責(zé)使MCU從復(fù)位狀態(tài)進(jìn)入到用戶(hù)的應(yīng)用程序。在到達(dá)用戶(hù)的應(yīng)用程序之前,BSP設(shè)置堆棧、時(shí)鐘、中斷、C語(yǔ)言運(yùn)行環(huán)境和堆棧監(jiān)視器。
圖5-1 入口函數(shù)調(diào)用
圖6-1 系統(tǒng)函數(shù)初始化
通過(guò)e2studio打開(kāi)Memory Usage,可以看到各段的定義名稱(chēng),起止地址,占用容量大小、對(duì)齊方式等。也可以通過(guò)打開(kāi)工程文件夾下\e2studio\Debug\*.map文件。
圖7-1 內(nèi)存函數(shù)分配
-
mcu
+關(guān)注
關(guān)注
146文章
17148瀏覽量
351184 -
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68603 -
FSP
+關(guān)注
關(guān)注
0文章
34瀏覽量
7141
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論