解析使用RT-Thread Studio指定特殊函数加载到RAM的方法

发布者:chunxing最新更新时间:2024-07-01 来源: elecfans关键字:RT-Thread  Studio  RAM 手机看文章 扫描二维码
随时随地手机看文章

用ITCM给ART-Pi(STM32H7)代码加速 , 这篇文章就提到了,将特殊的函数(如,算法相关)加载到速度更快的 ITCM,但是这篇文章中使用 GCC 编译器的时候,无法保证在断电复位后 RAM 段的代码不消失,所以本文来研究这个问题。


众所周知,RAM 是掉电丢失数据的,为了做到产品中也能使用这种操作,就需要将代码编译到 ROM 中,然后启动的时候,从 ROM 拷贝到 RAM 当中,知道了原理,具体如何操作呢?


二、RT-Thread Studio 指定特殊函数到RAM的办法

为了实现这种操作,需要知道可执行程序的生成过程,预处理- 》编译 -》汇编-》 链接,可以从这几个地方去着手解决这个问题。RTT Studio 使用的是 GCC 的编译器,所以修改相应的 GCC 文件就可以了。


1. 修改链接文件


为了实现这个目的,所以需要在链接文件中增加对应的 .section.


描述 ITCM 的属性


1MEMORY

2{

3ROM(rx):ORIGIN=0x90000000,LENGTH=8192k

4RAM(rw):ORIGIN=0x24000000,LENGTH=512k

5RxDecripSection(rw):ORIGIN=0x30040000,LENGTH=32k

6TxDecripSection(rw):ORIGIN=0x30040060,LENGTH=32k

7RxArraySection(rw):ORIGIN=0x30040200,LENGTH=32k

8ITCM(rx):ORIGIN=0x00000000,LENGTH=64k

9}

ITCM (rx):名字是 ITCM,r: Read-only sections. , x : Sections containing executable code.

ORIGIN =0x00000000: 起始地址

LENGTH =64k:总长度


构造 section


 1SECTIONS

 2{

 3.text:

 4{

 5.=ALIGN(4);

 6_stext=.;

 7KEEP(*(.isr_vector))/*Startupcode*/

 8.=ALIGN(4);

 9*(.text.*)

10*(.rodata)/*read-onlydata(constants)*/

11*(.rodata*)

12*(.glue_7)

13*(.glue_7t)

14*(.gnu.linkonce.t*)

15

16/*sectioninformationforfinshshell*/

17.=ALIGN(4);

18__fsymtab_start=.;

19KEEP(*(FSymTab))

20__fsymtab_end=.;

21

22.=ALIGN(4);

23__vsymtab_start=.;

24KEEP(*(VSymTab))

25__vsymtab_end=.;

26

27/*sectioninformationforutest*/

28.=ALIGN(4);

29__rt_utest_tc_tab_start=.;

30KEEP(*(UtestTcTab))

31__rt_utest_tc_tab_end=.;

32

33/*sectioninformationforatserver*/

34.=ALIGN(4);

35__rtatcmdtab_start=.;

36KEEP(*(RtAtCmdTab))

37__rtatcmdtab_end=.;

38.=ALIGN(4);

39

40/*sectioninformationformodules*/

41.=ALIGN(4);

42__rtmsymtab_start=.;

43KEEP(*(RTMSymTab))

44__rtmsymtab_end=.;

45

46/*sectioninformationforinitial.*/

47.=ALIGN(4);

48__rt_init_start=.;

49KEEP(*(SORT(.rti_fn*)))

50__rt_init_end=.;

51

52.=ALIGN(4);

53

54PROVIDE(__ctors_start__=.);

55KEEP(*(SORT(.init_array.*)))

56KEEP(*(.init_array))

57PROVIDE(__ctors_end__=.);

58

59.=ALIGN(4);

60

61_etext=.;

62}>ROM

63

64.ITCM:

65{

66.=ALIGN(4);

67__itcm_start=.;

68*(.ITCM)

69.=ALIGN(4);

70__itcm_end=.;

71}>ITCMAT>ROM

72__itcm_rom_start=LOADADDR(.ITCM);

73__itcm_size=SIZEOF(.ITCM);

这里链接文件的修改的作用是,将

__attribute__((section('.ITCM'))) int main(void) 

这种指定函数到特殊区域的

ITCM

段的函数,编译后放到 ROM 里面,程序运行的时候从 RAM 取这个函数,这样可以在系统上电之后可以从 ROM 中把数据复制到 RAM 当中,这样就解决了上一篇文章的问题。这里定义了 2 个全局变量方便后续在汇编当中把函数从 ROM 拷贝到 RAM。


2. 修改启动汇编

startup_stm32h750xx.s

这里只做了,已初始化值的数据,从 ROM 拷贝到 RAM 的操作,所以需要增加一些代码来实现把函数从 ROM 拷贝到 RAM

修改部分:


 1Reset_Handler:/*程序复位后的启动地址*/

 2ldrsp,=_estack/*设置SP*/

 3

 4ldrr0,=__itcm_rom_start/*加载放在了ROM当中,需要加载到ITCM中数据的起始地址到R0*/

 5ldrr1,=__itcm_start/*加载ITCM第一个函数的起始放置位置到R1*/

 6ldrr2,=__itcm_size/*加载ITCM的大小到R2*/

 7addr2,r1,r2/*R1加R2的值放到R2*/

 8

 91:

10cmpr2,r1/*比较R1与R2*/

11beq2f/*如果上面的比较之后是相等的则跳转到标签2*/

12ldrr3,[r0],#4/*将 R0寄存器里面存放的地址处的代码,写入到 R3 寄存器里面。然后 R0+ 4 */

13strr3,[r1],#4/*将R3中的数据写入以R1为地址的存储器中,然后R1+4*/

14b1b/*调回到标签1,循环拷贝*/

152:/*以下是未修改之前的GCC启动汇编代码*/

16

17/*CopythedatasegmentinitializersfromflashtoSRAM*/

18movsr1,#0

19bLoopCopyDataInit

这里使用了数字标签,所以跳转时候标签后缀为b或f,b==back ,f == forward。


这里的拷贝方法就是,知道程序下载之后放在了 ROM 的位置,然后从这个位置拷贝到 RAM 中去。


3. 将函数指定链接位置

1__attribute__((section('.ITCM')))

2intmain(void)

3{

4rt_uint32_tcount=0;

5

6rt_pin_mode(LED_PIN,PIN_MODE_OUTPUT);

7}


三, 总结

1、用ITCM给ART-Pi(STM32H7)代码加速提到的方法,MDK 可以实现启动的时候将 ROM 中的函数搬运到 RAM 当中的操作,使用 RTT Studio 也可以实现

2、在 GCC 的链接文件可以描述一个文件的 section 的中数据的存放地址和加载地址不一致。

3、在 RT-Thread Studio 中实现这个操作,确实比 MDK 会复杂很多,对于研究底层的人而言,在 MDK 中很难看到这些细节,喜欢自定义操作的人而言,GCC 就更加的灵活了。


关键字:RT-Thread  Studio  RAM 引用地址:解析使用RT-Thread Studio指定特殊函数加载到RAM的方法

上一篇:第六章 UART串口接收
下一篇:【蓝桥杯物联网】第四章 ​点亮一个LED

推荐阅读最新更新时间:2024-11-08 18:02

嵌入式linux开发 (九) RAM(3) s3c2440外扩sdram
- JZ2440 S3C2440 ARM920T -内置 Steppingstone (4K-Byte SRAM) 无rom -外扩 EM63A165TS-6G:32MB/片,SDRAM,共两片 soc The S3C2440A is developed with ARM920T core, 0.13um CMOS standard cells and a memory complier. The ARM920T implements MMU, AMBA BUS, and Harvard cache architecture with separate 16KB instruction and 16KB
[单片机]
嵌入式linux开发 (九) <font color='red'>RAM</font>(3) s3c2440外扩sdram
Rambus发布CXL™内存互连计划,引领数据中心架构进入新时代
摘要: • 启动研发工作,通过内存扩展和池化解决方案推动数据中心架构转型,实现分解型和可组合的服务器架构 • 结合高速接口、嵌入式安全和服务器内存缓冲区方面的独特专长,研发突破性的下一代数据中心解决方案 • 利用收购PLDA和AnalogX提供的关键构件,推进CXL路线图和市场领先地位 中国北京2021年6月22日——作为业界领先的芯片和IP核供应商,致力于使数据传输更快更安全,Rambus Inc. 今日宣布推出CXL内存互连计划,旨在为先进的数据中心架构定义和开发半导体解决方案,最大限度地提升性能和效率,降低系统成本。为支持服务器工作负载的持续增长和专业化,数据中心正在转向由共享和可扩展的计算和内存资源
[半导体设计/制造]
Rambus发布CXL™<font color='red'>内存</font>互连计划,引领数据中心架构进入新时代
芯片厂商减产为提价做准备 SSD和内存低价恐难延续
目前看来,全球SSD和内存的售价依旧持续走低。面对氛围冷清的市场,尽管部分模组厂和DRAM厂商有较大规模的交易,但是成交价远低于市场价。这也能够看出显示模组厂商尚未感受到行业复苏的趋势,因此依旧采用相对保守的行为方式。 根据最新报价显示,三星SLC的价格相对平稳,但在wafer卖压渐渐浮现后,询单热度明显下降,但双方议价动作呈现断断续续,最终未见明显成交,市场报价维持疲软。SK Hynix SLC颗粒2G/4G有些许询单释出,市场报价微幅振荡,但需求力道有限,无法带动整体颗粒买气,其余颗粒表现较不理想,价格随大盘波动后走弱。 Micron SLC颗粒报价大致持平,虽一度受大盘影响,但因现货供应量不足,价格随后趋向平稳,交易
[半导体设计/制造]
Cadence 推出 Joules RTL Design Studio,将 RTL 生产力和结果质量提升到新的高度
内容提要 • 将 RTL 收敛速度加快 5 倍,结果质量改善 25% • RTL 设计师可快速准确地了解物理实现指标,根据提供的指引有效提升 RTL 性能 • 与 Cadence Cerebrus 和 Cadence JedAI Platform 集成,实现 AI 驱动的 RTL 优化 中国上海,2023 年 7 月 17 日 —— 楷登电子(美国 Cadence 公司,) 近日宣布推出 Cadence® Joules™ RTL Design Studio---这款新的解决方案可为用户提供实用的洞察,有助于加快寄存器传输级(RTL)设计和实现流程。 前端设计人员可以在一个统一的界面使用数字设计分析和调试功能,在进入
[半导体设计/制造]
Cadence 推出 Joules RTL Design <font color='red'>Studio</font>,将 RTL 生产力和结果质量提升到新的高度
搭载展锐芯片!魅蓝6T跑分曝光:四核处理器+2GB内存
日前魅族官方向多家媒体发出邀请函,确认将于今年5月29日在北京三里屯召开魅蓝6T新品发布会,并自我调侃“一大波吐槽正在路上”。今天,这款新机已经亮相GeekBench跑分库,可以看到是紫光展锐(Spreadtrum)28nm工艺的SC9850芯片,为有4个ARM Cortex A7核心,时钟频率为1.3GHz,显卡方面为Mali-820 MP1显卡。 以往,魅蓝系列手机很大程度上依赖于联发科处理器,但随后开始使用高通的骁龙处理器和三星的Exynos处理器。而这次魅蓝选择了展讯处理器。 根据GeekBench跑分库信息,魅蓝6T预装Android 7.1.1 Nougat系统,2GB的内存,单核成绩为460分,多核成绩
[半导体设计/制造]
骁龙652+4GB内存 vivo X7真机首次曝光
    韩国欧巴宋仲基代言的vivo X7最近被炒得火热,但主要的规格却仍是未知数。日前,就在官方披露该机将配备1600万像素摄像头,以及首次采用正面指纹识别和超窄边框设计之后,又有 网友在微博上首次曝光了vivo X7的真机照片和宣传图,并确认将搭载骁龙652处理器,拥有4GB运存和64GB存储容量,预计会在本月底正式推出。 真机首次曝光   从网友此次在微博上放出了vivo X7的真机谍照来看,该机外形与vivo X6系列等机型整体风格比较相似,但正面的Home键不仅有着类似魅族腰圆键的造型,而且还整合了指纹识别功能,具备轻触/按压极速解锁,并提供了 支付宝 和微信指纹支付功能。此外,该机还采用了超窄边框设计,相比过去拥有更
[手机便携]
Intel 10nm服务器超级怪物:LGA4189接口、八通道内存
虽然说这几年Intel处理器在消费级领域进步缓慢,但是在服务器和数据中心市场上,Intel还是很卖力的,而且接下来会更卖力。 旨在为48V输入母线转换低压大电流应用确定标准的Power Stamp Alliance(PSA)联盟扮演了一次“猪队友”的角色,泄露了Intel下两代Xeon平台的一些情况,看上去真的很威猛。 Intel现在的Xeon可扩展平台(划分铂金/金牌/银牌/铜牌)基于14nm Skylake架构,最多28个核心,而今年将推出的下一代产品架构升级为Cascade Lake(Kaby Lake/Coffee Lake太马甲直接跳过),Intel自己此前也公开预告过。 不出意外的话,Cascade Lake平
[嵌入式]
三星Q3仍是内存市场老大 海力士表现最抢眼
11月19日消息,据外电报道,美国的市场研究公司iSuppli称,三星电子在2007年第三季度继续保持了全球DRAM内存市场排名第一的位置,但是,市场份额输给了竞争对手海力士半导体。 iSuppli称,海力士半导体是第三季度全球半导体市场表现最耀眼的明星,增长率超过了所有的主要供应商,缩小了与排名第一的三星电子的差距。 从销售收入看,三星电子今年第三季度的销售收入占全球DRAM内存市场的份额从今年第二季度的28.3%下降到了27.7%。 海力士半导体巩固了排名第二的位置,销售收入的全球市场份额从今年第二季度的20.6%提高到了22.8%。奇梦达(Qimonda)排名第三位,市场份额从第二季度的13.5%下降到了12.2%。
[焦点新闻]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved