0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

CHANBAEK 来源:CSDN-借过风景 作者:CSDN-借过风景 2023-02-15 11:47 次阅读

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

image

sections .flash_test_address段中以 4字节对齐 ,其余3字节补0。

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

image

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

image

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

image

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

image

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

image

这样指定的方式会造成中间段有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文件如下:

image

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

image

(新增的A2 4A 04 指令暂时不详)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16984

    浏览量

    350232
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9043

    浏览量

    366744
  • FlaSh
    +关注

    关注

    10

    文章

    1621

    浏览量

    147736
  • 内核
    +关注

    关注

    3

    文章

    1362

    浏览量

    40221
  • RISC-V
    +关注

    关注

    44

    文章

    2228

    浏览量

    46004
收藏 人收藏

    评论

    相关推荐

    拥抱RISC-V的开发世界 兆易创新推GD32VF103系列RISC-V MCU

    兆易创新推出GD32V系列RISC-V内核32位通用MCU新品,现在,直接使用GD32V系列32位通用MCU以创意灵感拥抱
    发表于 08-23 10:05 7951次阅读

    从授权自研内核,汽车MCU大厂倒戈RISC-V

    CPU核心,而这一核心未来也集成瑞萨的32位MCU上。   率先开始授权RISC-V核心的瑞萨   尽管瑞萨宣布自研RISC-V核心,
    的头像 发表于 12-05 00:20 1955次阅读
    从授权<b class='flag-5'>到</b>自研内核,汽车<b class='flag-5'>MCU</b>大厂倒戈<b class='flag-5'>RISC-V</b>?

    国产RISC-V MCU推荐

    高速PHY收发器(480Mbps)、千兆以太网MAC及10兆物理层收发器等。 沁恒的另一颗芯片 xiaolinen认为在选择国产RISC-V MCU时,需要重点考虑生态问题,碰到问题是否能快速的找到
    发表于 04-17 11:00

    RISC-VMCU与ARM对比

    RISC-VMCU与ARM在多个方面存在显著的区别,以下是两者的对比: 开源与专有 RISC-VRISC-V是一种开源的指令集架构(ISA),允许任何人免费使用、修改和贡献
    发表于 05-27 15:58

    risc-vmcu对RTOS兼容性如何

    RISC-VMCU对RTOS(实时操作系统)的兼容性主要取决于多个因素,包括RTOS的版本、RISC-V指令集的实现、以及芯片制造商提供的支持。以下是关于RISC-V
    发表于 05-27 16:26

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

    RISC-V内核+接口底层根技术”的自研体系,深度剖析了全栈研发模式在推动RISC-V应用落地上的原生优势。 青稞RISC-V芯片技术自主进一步深入
    发表于 08-30 17:37

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

    文件工程中2 确保汇编器的include路径中包含描述芯片实现细节的头文件3在FreeRTOSConfig.h中定义一个常量或linker变量指定中断堆栈的
    发表于 11-29 15:54

    为什么选择RISC-V

    。例如,如果工程师在FPGA中实现软RISC-V内核,则通常可以使用RTL源代码。由于RISC-V免版税,这为基于RISC-V的设计从FPGA移植
    发表于 07-27 17:38

    RISC-V MCU开发 (六):代码下载

    RISC-V/ARM内核MCU工程的代码下载功能。其中,对于CH56x、CH57x、CH58x等型号,MRS还支持关闭两线仿真调试接口功能;对于CH32Fx、CH32Vx型号,MRS支持代码读保护查询
    发表于 10-08 13:28

    RISC-V MCU开发相关资料分享

    RISC-V MCU开发(一):集成开发环境近年来,RISC-V生态获得了空前的繁荣发展,国内外众多科技公司纷纷下场布局、行业应用层出不穷,搭载RISC-V内核的
    发表于 11-10 07:50

    目前国内RISC-V架构的MCU从程序从arm移植RISC-V难度大吗?

    目前国内RISC-V架构的MCU从程序从arm移植RISC-V难度大吗?
    发表于 03-09 10:00

    RISC-V架构

    ,相比ARM内核具备成本、可拓展性、可控性等多方面优势:(1)RISC-V基础的ISA和IP核开源免费,并且从底层设计上模块化、允许自定义拓展,使得芯片设计厂商拥有更高的研发自由度,前期投入成本较低;(2
    发表于 04-03 15:29

    RISC-V MCU编译过程分析

    ,并优化后生成对应的汇编代码,生成 .s 文件。 RISC-V MCU的工程采用GCC编译,官方工具链地址:https://github.com/riscv/riscv-gnu-toolchain
    发表于 08-30 14:29

    Keil中指定代码段与常量Flash地址方法

    图 分配代码文件Flash指定位置方法 在.sct文件中指定代码输出文件(.o格式)
    发表于 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分享
    发表于 07-14 17:15 0次下载