0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RISC-V MCU將常量定義到指定的Flash地址

CHANBAEK ? 來源:CSDN-借過風(fēng)景 ? 作者:CSDN-借過風(fēng)景 ? 2023-02-15 11:47 ? 次閱讀

Keil MDK開發(fā)ARM 內(nèi)核的MCU時(shí),將常量定義到指定的Flash地址中,使用 _ attribute _( at(絕對地址) ) 即可,如:

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

沁恒RISC-V MCU ,通過Mounriver Studio(MRS)開發(fā)時(shí),暫時(shí)不支持 _ attribute _( at(絕對地址) ) 命令。可通過如下步驟實(shí)現(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)))  /*鏈接時(shí)*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文件,常量地址如下:

image

sections .flash_test_address段中以 4字節(jié)對齊 ,其余3字節(jié)補(bǔ)0。

二進(jìn)制bin文件0x1000地址信息如下;

image

2.2 定義連續(xù)的多個(gè)單字節(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文件,常量地址如下:

image

二進(jìn)制bin文件0x1000地址信息如下;

image

2.3 定義多個(gè)不連續(xù)的常量

此時(shí)需要修改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)))  /*鏈接時(shí)*KEEP()可以使得被標(biāo)記段的內(nèi)容不被清除*/
        . = ORIGIN(FLASH)+0x1040;  /*ORIGIN(FLASH)為 MEMORY定義的FLASH的起始地址(CH32V103為0x08000000),指定到從FLASH起始的0x1040長度的位置*/
        KEEP(*(SORT_NONE(.test_address_2)))  /*鏈接時(shí)*KEEP()可以使得被標(biāo)記段的內(nèi)容不被清除*/
        . = ALIGN(4);
    } >FLASH AT>FLASH

在函數(shù)中定義兩個(gè)指定地址的常量

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文件,常量地址如下:

image

二進(jìn)制bin文件0x1000地址信息如下;

image

這樣指定的方式會造成中間段有56個(gè)字節(jié)的flash無法分配內(nèi)容,浪費(fèi)了 ,不建議這樣指定,如果實(shí)在要這樣做,需要嚴(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文件如下:

image

二進(jìn)制bin文件0x1000地址信息如下:

image

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16667

    瀏覽量

    347784
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    8967

    瀏覽量

    365038
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1598

    瀏覽量

    147338
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1336

    瀏覽量

    40084
  • RISC-V
    +關(guān)注

    關(guān)注

    44

    文章

    2141

    瀏覽量

    45711
收藏 人收藏

    評論

    相關(guān)推薦

    擁抱RISC-V的開發(fā)世界 兆易創(chuàng)新推GD32VF103系列RISC-V MCU

    兆易創(chuàng)新推出GD32V系列RISC-V內(nèi)核32位通用MCU新品,現(xiàn)在,直接使用GD32V系列32位通用MCU以創(chuàng)意靈感擁抱
    發(fā)表于 08-23 10:05 ?7892次閱讀

    從授權(quán)自研內(nèi)核,汽車MCU大廠倒戈RISC-V?

    CPU核心,而這一核心未來也集成瑞薩的32位MCU上。 ? 率先開始授權(quán)RISC-V核心的瑞薩 ? 盡管瑞薩宣布自研RISC-V核心,
    的頭像 發(fā)表于 12-05 00:20 ?1806次閱讀
    從授權(quán)<b class='flag-5'>到</b>自研內(nèi)核,汽車<b class='flag-5'>MCU</b>大廠倒戈<b class='flag-5'>RISC-V</b>?

    國產(chǎn)RISC-V MCU推薦

    高速PHY收發(fā)器(480Mbps)、千兆以太網(wǎng)MAC及10兆物理層收發(fā)器等。 沁恒的另一顆芯片 xiaolinen認(rèn)為在選擇國產(chǎn)RISC-V MCU時(shí),需要重點(diǎn)考慮生態(tài)問題,碰到問題是否能快速的找到
    發(fā)表于 04-17 11:00

    RISC-VMCU與ARM對比

    RISC-VMCU與ARM在多個(gè)方面存在顯著的區(qū)別,以下是兩者的對比: 開源與專有 RISC-VRISC-V是一種開源的指令集架構(gòu)(ISA),允許任何人免費(fèi)使用、修改和貢獻(xiàn)
    發(fā)表于 05-27 15:58

    risc-vmcu對RTOS兼容性如何

    RISC-VMCU對RTOS(實(shí)時(shí)操作系統(tǒng))的兼容性主要取決于多個(gè)因素,包括RTOS的版本、RISC-V指令集的實(shí)現(xiàn)、以及芯片制造商提供的支持。以下是關(guān)于RISC-V
    發(fā)表于 05-27 16:26

    RISC-V Summit China 2024 | 青稞RISC-V+接口PHY,賦能RISC-V高效落地

    RISC-V內(nèi)核+接口底層根技術(shù)”的自研體系,深度剖析了全棧研發(fā)模式在推動RISC-V應(yīng)用落地上的原生優(yōu)勢。 青稞RISC-V芯片技術(shù)自主進(jìn)一步深入
    發(fā)表于 08-30 17:37

    如何在RISC-V處理器上使用FreeRTOS?

    文件工程中2 確保匯編器的include路徑中包含描述芯片實(shí)現(xiàn)細(xì)節(jié)的頭文件3在FreeRTOSConfig.h中定義一個(gè)常量或linker變量指定中斷堆棧的
    發(fā)表于 11-29 15:54

    為什么選擇RISC-V

    。例如,如果工程師在FPGA中實(shí)現(xiàn)軟RISC-V內(nèi)核,則通??梢允褂肦TL源代碼。由于RISC-V免版稅,這為基于RISC-V的設(shè)計(jì)從FPGA移植
    發(fā)表于 07-27 17:38

    RISC-V MCU開發(fā) (六):代碼下載

    RISC-V/ARM內(nèi)核MCU工程的代碼下載功能。其中,對于CH56x、CH57x、CH58x等型號,MRS還支持關(guān)閉兩線仿真調(diào)試接口功能;對于CH32Fx、CH32Vx型號,MRS支持代碼讀保護(hù)查詢
    發(fā)表于 10-08 13:28

    RISC-V MCU開發(fā)相關(guān)資料分享

    RISC-V MCU開發(fā)(一):集成開發(fā)環(huán)境近年來,RISC-V生態(tài)獲得了空前的繁榮發(fā)展,國內(nèi)外眾多科技公司紛紛下場布局、行業(yè)應(yīng)用層出不窮,搭載RISC-V內(nèi)核的
    發(fā)表于 11-10 07:50

    目前國內(nèi)RISC-V架構(gòu)的MCU從程序從arm移植RISC-V難度大嗎?

    目前國內(nèi)RISC-V架構(gòu)的MCU從程序從arm移植RISC-V難度大嗎?
    發(fā)表于 03-09 10:00

    RISC-V架構(gòu)

    ,相比ARM內(nèi)核具備成本、可拓展性、可控性等多方面優(yōu)勢:(1)RISC-V基礎(chǔ)的ISA和IP核開源免費(fèi),并且從底層設(shè)計(jì)上模塊化、允許自定義拓展,使得芯片設(shè)計(jì)廠商擁有更高的研發(fā)自由度,前期投入成本較低;(2
    發(fā)表于 04-03 15:29

    RISC-V MCU編譯過程分析

    ,并優(yōu)化后生成對應(yīng)的匯編代碼,生成 .s 文件。 RISC-V MCU的工程采用GCC編譯,官方工具鏈地址:https://github.com/riscv/riscv-gnu-toolchain
    發(fā)表于 08-30 14:29

    Keil中指定代碼段與常量Flash地址方法

    圖 分配代碼文件Flash指定位置方法 在.sct文件中指定代碼輸出文件(.o格式)
    發(fā)表于 11-20 14:36 ?20次下載
    Keil中<b class='flag-5'>指定</b>代碼段與<b class='flag-5'>常量</b>在<b class='flag-5'>Flash</b>中<b class='flag-5'>地址</b>方法

    推出采用GD32 RISC-VMCU

    推出采用GD32 RISC-VMCU ppt分享
    發(fā)表于 07-14 17:15 ?0次下載