日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RISC-V MCU将常量定义到指定的Flash地址

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RISC-V MCU将常量定义到指定的Flash地址 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Keil MDK開發ARM 內核的MCU時,將常量定義到指定的Flash地址中,使用?_attribute_( at(絕對地址) )即可,如:

const u32 myConstVariable_1[128] __attribute__((at(0x08001000))) = {0x12345678,0x22221111};//定位在flash中,其他flash補充為0

沁恒RISC-V MCU ,通過Mounriver Studio(MRS)開發時,暫時不支持_attribute_( at(絕對地址) )命令。可通過如下步驟實現:

1、編輯ld鏈接文件,添加SECTIONS段

.flash_test_address :{. = ALIGN(4); /*4字節對齊*/. = ORIGIN(FLASH)+0x1000; /*ORIGIN(FLASH)為 MEMORY定義的FLASH的起始地址(CH32V103為0x08000000),指定到從FLASH起始的0x1000長度的位置*/KEEP(*(SORT_NONE(.test_address_1))) /*鏈接時*KEEP()可以使得被標記段的內容不被清除*/. = ALIGN(4);} >FLASH AT>FLASH

如需將變量定義到Flash的最后,將此段添加到?.text段后面,注意指定的Flash地址要大于程序編譯大小。

2、函數中使用__attribute__((section(".xxx")))定義常量

2.1 定義單字節常量

const uint8_t myConstVariable_1 __attribute__((section(".test_address_1"))) = 0x11;/*地址為0x00001000*/

查看map文件,常量地址如下:

sections .flash_test_address段中以4字節對齊,其余3字節補0。

二進制bin文件0x1000地址信息如下;

2.2 定義連續的多個單字節常量

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 段默認從指定地址開始為其分配連續的地址,查看map文件,常量地址如下:

二進制bin文件0x1000地址信息如下;

2.3 定義多個不連續的常量

此時需要修改ld文件

.flash_test_address :{. = ALIGN(4); /*4字節對齊*/. = ORIGIN(FLASH)+0x1000; /*ORIGIN(FLASH)為 MEMORY定義的FLASH的起始地址(CH32V103為0x08000000),指定到從FLASH起始的0x1000長度的位置*/KEEP(*(SORT_NONE(.test_address_1))) /*鏈接時*KEEP()可以使得被標記段的內容不被清除*/. = ORIGIN(FLASH)+0x1040; /*ORIGIN(FLASH)為 MEMORY定義的FLASH的起始地址(CH32V103為0x08000000),指定到從FLASH起始的0x1040長度的位置*/KEEP(*(SORT_NONE(.test_address_2))) /*鏈接時*KEEP()可以使得被標記段的內容不被清除*/. = ALIGN(4);} >FLASH AT>FLASH

在函數中定義兩個指定地址的常量

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個字節的flash無法分配內容,浪費了,不建議這樣指定,如果實在要這樣做,需要嚴格把控,可根據間隔的大小,指定編譯后小于該間隔的函數存儲到該flash塊。

如指定函數Delay_Init編譯后存放test_address_1塊內,緊跟定義的常量后。

/******************************************************************************* * 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函數編譯后的大小為0x2a,編譯后的map文件如下:

二進制bin文件0x1000地址信息如下:


(新增的A2 4A 04 指令暫時不詳)

總結

以上是生活随笔為你收集整理的RISC-V MCU将常量定义到指定的Flash地址的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。