Keil MDK開發(fā)ARM 內(nèi)核的MCU時,將常量定義到指定的Flash地址中,使用 _ attribute _( at(絕對地址) ) 即可,如:
const u32 myConstVariable_1[128] __attribute__((at(0x08001000))) = {0x12345678,0x22221111};//定位在flash中,其他flash補充為0
沁恒RISC-V MCU ,通過Mounriver Studio(MRS)開發(fā)時,暫時不支持 _ attribute _( at(絕對地址) ) 命令。可通過如下步驟實現(xiàn):
1、編輯ld鏈接文件,添加SECTIONS段
.flash_test_address :
{
. = ALIGN(4); /*4字節(jié)對齊*/
. = ORIGIN(FLASH)+0x1000; /*ORIGIN(FLASH)為 MEMORY定義的FLASH的起始地址(CH32V103為0x08000000),指定到從FLASH起始的0x1000長度的位置*/
KEEP(*(SORT_NONE(.test_address_1))) /*鏈接時*KEEP()可以使得被標(biāo)記段的內(nèi)容不被清除*/
. = ALIGN(4);
} >FLASH AT>FLASH
如需將變量定義到Flash的最后,將此段添加到 .text段后面,注意指定的Flash地址要大于程序編譯大小。
2、函數(shù)中使用__attribute__((section(".xxx")))定義常量
2.1 定義單字節(jié)常量
const uint8_t myConstVariable_1 __attribute__((section(".test_address_1"))) = 0x11;/*地址為0x00001000*/
查看map文件,常量地址如下:
sections .flash_test_address段中以 4字節(jié)對齊 ,其余3字節(jié)補0。
二進制bin文件0x1000地址信息如下;
2.2 定義連續(xù)的多個單字節(jié)常量
const uint8_t myConstVariable_1 __attribute__((section(".test_address_1"))) = 0x11; /*地址為0x00001002*/
const uint8_t myConstVariable_2 __attribute__((section(".test_address_1"))) = 0x22; /*地址為0x00001001*/
const uint8_t myConstVariable_3 __attribute__((section(".test_address_1"))) = 0x33; /*地址為0x00001000*/
ld文件中flash_test_address 段默認(rèn)從指定地址開始為其分配連續(xù)的地址,查看map文件,常量地址如下:
二進制bin文件0x1000地址信息如下;
2.3 定義多個不連續(xù)的常量
此時需要修改ld文件
.flash_test_address :
{
. = ALIGN(4); /*4字節(jié)對齊*/
. = ORIGIN(FLASH)+0x1000; /*ORIGIN(FLASH)為 MEMORY定義的FLASH的起始地址(CH32V103為0x08000000),指定到從FLASH起始的0x1000長度的位置*/
KEEP(*(SORT_NONE(.test_address_1))) /*鏈接時*KEEP()可以使得被標(biāo)記段的內(nèi)容不被清除*/
. = ORIGIN(FLASH)+0x1040; /*ORIGIN(FLASH)為 MEMORY定義的FLASH的起始地址(CH32V103為0x08000000),指定到從FLASH起始的0x1040長度的位置*/
KEEP(*(SORT_NONE(.test_address_2))) /*鏈接時*KEEP()可以使得被標(biāo)記段的內(nèi)容不被清除*/
. = ALIGN(4);
} >FLASH AT>FLASH
在函數(shù)中定義兩個指定地址的常量
const uint8_t myConstVariable_1[8] __attribute__((section(".test_address_1"))) = {0x11,0x22,0x33,0x44}; /*首地址為0x00001000*/
const uint8_t myConstVariable_2[4] __attribute__((section(".test_address_2"))) = {0x55,0x66}; /*首地址為0x00001040*/
查看map文件,常量地址如下:
二進制bin文件0x1000地址信息如下;
這樣指定的方式會造成中間段有56個字節(jié)的flash無法分配內(nèi)容,浪費了 ,不建議這樣指定,如果實在要這樣做,需要嚴(yán)格把控,可根據(jù)間隔的大小,指定編譯后小于該間隔的函數(shù)存儲到該flash塊。
如指定函數(shù)Delay_Init編譯后存放test_address_1塊內(nèi),緊跟定義的常量后。
/*******************************************************************************
* Function Name : Delay_Init
* Description : Initializes Delay Funcation.
* Input : None
* Return : None
*******************************************************************************/
__attribute__((section(".test_address_1"))) void Delay_Init(void)
{
p_us=SystemCoreClock/8000000;
p_ms=(uint16_t)p_us*1000;
}
Delay_Init函數(shù)編譯后的大小為0x2a,編譯后的map文件如下:
二進制bin文件0x1000地址信息如下:
(新增的A2 4A 04 指令暫時不詳)
-
mcu
+關(guān)注
關(guān)注
146文章
17171瀏覽量
351486 -
ARM
+關(guān)注
關(guān)注
134文章
9104瀏覽量
367816 -
FlaSh
+關(guān)注
關(guān)注
10文章
1637瀏覽量
148125 -
內(nèi)核
+關(guān)注
關(guān)注
3文章
1373瀏覽量
40310 -
RISC-V
+關(guān)注
關(guān)注
45文章
2292瀏覽量
46205
發(fā)布評論請先 登錄
相關(guān)推薦
評論