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

    文章

    16022

    浏览量

    343686
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8653

    浏览量

    361847
  • FlaSh
    +关注

    关注

    10

    文章

    1551

    浏览量

    146699
  • 内核
    +关注

    关注

    3

    文章

    1309

    浏览量

    39862
  • RISC-V
    +关注

    关注

    41

    文章

    1906

    浏览量

    45056
收藏 人收藏

    评论

    相关推荐

    RISC-V 基础学习:RISC-V 基础介绍

    , 支持整数指令、乘除法指令、原子指令和压缩指令。 9.3 指令集模块 指令集模块是一款CPU架构的主要组成部分,是CPU 和 上层软件交互的核心,也是cpu主要功能体现。 RISC-V 规范只定义
    发表于 03-12 10:25

    国产RISC-V MCU推荐

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

    如何在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应用领域的拓展

    RISC-V的市场也在持续扩张,Semico预计2025年全球市场的RISC-V核心数达到624亿,其中工业应用占据167亿颗核心。而根据Tractica预测,
    发表于 06-18 20:57

    RISC-V MCU开发 (一):集成开发环境

    近年来,RISC-V生态获得了空前的繁荣发展,国内外众多科技公司纷纷下场布局、行业应用层出不穷,搭载RISC-V内核的MCU也逐渐走入了工程师的日常开发工作中。 工欲善其事必先利其器,要想实现
    发表于 09-22 14:44

    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开发相关资料分享

    RISC-V MCU开发 (二):工程创建与管理MounRiver® Studio(MRS)内置了GD、WCH等芯片厂家的RISC-V/ARM以及RISC-V通用指令集系列的芯片工程模
    发表于 12-09 08:14

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

    RISC-V MCU开发 (十一):跨内核工程转换大多数嵌入式工程师使用Keil进行开发,但Keil目前不支持RISC-V内核,只支持ARM内核。MounRiver® Studio(MRS)同时支持
    发表于 02-11 06:17

    RISC-V MCU开发实战(一) :DHT11

    近年来,RISC-V生态获得了空前的繁荣发展,国内外众多科技公司纷纷下场布局、行业应用层出不穷,搭载RISC-V内核的MCU也逐渐走入了工程师的日常开发工作中。工欲善其事必先利其器,要想实现
    发表于 03-06 15:17

    目前国内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地址方法

    Keil中使用使用.sct来决定代码编译出来的程序与常量等在Flash中的分布位置。 Keil ->Target Option ->Linker,如下
    发表于 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>方法