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
    +关注

    关注

    147

    文章

    19285

    浏览量

    405438
  • ARM
    ARM
    +关注

    关注

    135

    文章

    9625

    浏览量

    394874
  • FlaSh
    +关注

    关注

    10

    文章

    1764

    浏览量

    156256
  • 内核
    +关注

    关注

    4

    文章

    1483

    浏览量

    43194
  • RISC-V
    +关注

    关注

    49

    文章

    3001

    浏览量

    53851
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞萨RA MCU如何常量和函数放在Code Flash/ROM指定地址

    在嵌入式系统应用中,有时需要将常量或者函数放在代码闪存(Code Flash)的指定地址,以便后续的功能扩展或代码更新。
    的头像 发表于 06-01 09:57 2059次阅读
    瑞萨RA <b class='flag-5'>MCU</b>如何<b class='flag-5'>将</b><b class='flag-5'>常量</b>和函数放在Code <b class='flag-5'>Flash</b>/ROM<b class='flag-5'>指定</b><b class='flag-5'>地址</b>

    瑞萨RA MCU如何常量和函数放在Code Flash/ROM指定地址

    RA生态工作室关注我们前言在嵌入式系统应用中,有时需要将常量或者函数放在代码闪存(CodeFlash)的指定地址,以便后续的功能扩展或代码更新。本文基于EK-RA4M2,详细介绍了如何在不同编译器
    的头像 发表于 06-02 18:55 232次阅读
    瑞萨RA <b class='flag-5'>MCU</b>如何<b class='flag-5'>将</b><b class='flag-5'>常量</b>和函数放在Code <b class='flag-5'>Flash</b>/ROM<b class='flag-5'>指定</b><b class='flag-5'>地址</b>

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

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

    国产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 MCU入门

    RISC-V MCU入门哪个厂家的资料比较全?
    发表于 11-27 16:51

    RISC-V MCU技术

    GD32VF103系列的MCU,是兆易创新出的,用了基于RISC-V的Bumblebee处理器内核,主要是给物联网还有其他超低功耗的场景用的。这个系列MCU运算主频能到108MHz,片上闪存从16KB
    发表于 01-19 11:50

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

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

    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 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>方法