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地址相关推荐

  1. RISC-V MCU将常量定义到指定的Flash地址 -- 以CH32V103为例

    Keil MDK开发ARM 内核的MCU时,将常量定义到指定的Flash地址中,使用 _attribute_( at(绝对地址) )即可,如: const u32 myConstVariable_1[ ...

  2. 2.3 Go语言中的字符型和常量定义

    字符类型 字符类型也是常用的类型之一,Go语言中的字符类型使用string关键字,我们对最早的hello, world示例进行改造. package mainimport "fmt" ...

  3. 计组学习笔记2(RISC v版)

    指令集解释 (规定:R[r]表示通用寄存器r的内容,M[addr]表示存储单元addr的内容,SEXT[imm]表示对imm进行符号扩展,ZEXT[imm]表示对imm进行零扩展) 整数运算类 -U型 ...

  4. php中tp常量,tp系统常量定义

    (2013-03-06 14:16:31) 标签: 是已经封装好的系统常量 主要是用在控制器下面的动作当中 这样能很大的提高我们的开发效率 主要有下面的一些 手册上面都有的 __ROOT__ 网站的根 ...

  5. Go 学习笔记(7)— 常量定义、常量使用、枚举用法、iota 常量、不设置初始值常量

    1. 常量定义及分类 1.1 定义 常量是指在程序运行时,不会被修改的量. 常量中的数据类型只可以是布尔型.数字型(整数型.浮点型和复数)和字符串型. 常量的定义格式: const identifie ...

  6. php常量定义表达式,从表达式创建PHP类常量的最佳解决方法?

    我希望能够做到这样的事情: class Circle { const RADIUS_TO_CIRCUMFERENCE = M_PI * 2; // Not allowed private $radiu ...

  7. 基于OHCI的USB主机 —— USB设备常量定义

    USB设备枚举过程中使用到的常量定义如下: /*-------------------------------------------------------------------------  * ...

  8. DCMTK:全局类型和常量定义

    DCMTK:全局类型和常量定义 全局类型和常量定义 全局类型和常量定义 #include "dcmtk/config/osconfig.h" #include "dcmt ...

  9. IOS之通知KVO的常量定义

    IOS之通知KVO的常量定义 首先要创建pch文件,利用全局文件导入 pch包含头文件 #import "LJConst.h" 新建一个Cocoa Touch文件,继承NSObje ...

  10. 阿里巴巴对Java编程【常量定义】的规约

    转载自 阿里巴巴对Java编程[常量定义]的规约 常量定义 1. [强制]不允许任何魔法值 ( 即未经定义的常量 ) 直接出现在代码中. 反例: String key  = " Id # t ...

最新文章

  1. Squid故障与解决方法汇总
  2. 清除Squid缓存的小工具
  3. 鸿蒙 意识结晶,意识的无限性
  4. 耗时3年,集齐102位中国摄影师,央视这部纪录片BBC也无法超越......
  5. Collection和Collections的区别是什么
  6. 转-WSGI Tutorial
  7. PyTorch之torch.nn.Softmax()
  8. Pytest 自动化测试框架
  9. linux 用户空间与内核空间——高端内存详解
  10. Abaqus简单部件受力分析
  11. Turbo码相关学习
  12. Vue + JsBarcode 批量打印标签
  13. 51单片机初学之流水灯程序
  14. 程序员,你准备好回家过年了吗?
  15. 浅谈物联网的关键技术和难点
  16. java通过身份证号码获取出生日期、性别、年龄
  17. 商超霸主之争:天猫节节败退 沦为京东陪练
  18. Excel表格无法重命名工作表
  19. 糗事百科网站服务器,糗事百科神仙道官网
  20. 任正非:为什么华为选择与西工大合作,腾讯T4架构师

热门文章

  1. ubuntu扩容教程
  2. Spark 连接kafka报错: Error while fetching metadata with correlation id xx [topicName=INVALID_REPLICATIO]
  3. Web前端--HTML+CSS+JavaScript酷炫游戏动漫网页设计
  4. android聊天室背景图片,32张漂亮的自然风光微信7.0聊天背景图片推荐 唯美自然风景手机壁纸 (全文)...
  5. 接口邮件发送平台,定时发送邮件信息
  6. hmm 流程图_算法:HMM模型+维特比算法详解
  7. 微信公众号申请需要哪些材料
  8. 2023年天津天狮学院专升本专业课如何线上考试考前准备的要求
  9. windows下安装you-get的简要记录
  10. mono android 开机启动,浅析 Android 平台 mono执行机制 by郡墙