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

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

3天内不再提示

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

RTThread物联网操作系统 来源:CSDN技术社区 作者:whj123999 2021-11-18 10:06 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

用ITCM给ART-PiSTM32H7)代码加速 , 这篇文章就提到了,将特殊的函数(如,算法相关)加载到速度更快的 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 就更加的灵活了。

编辑:jq


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

    关注

    8

    文章

    7314

    浏览量

    93972
  • ROM
    ROM
    +关注

    关注

    4

    文章

    578

    浏览量

    88546
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1398

    浏览量

    119822
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73145
  • MDK
    MDK
    +关注

    关注

    4

    文章

    211

    浏览量

    33468

原文标题:使用RT-Thread Studio指定特殊函数加载到RAM的方法

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RT-Thread Studio V2.3.0 版本正式发布!

    支持针对rt-thread版本号大于5.1.0时使用Env2.0.0高版本2新增支持卸载studio时选择是否保留已下载的SDK资源包文件3修复SDK管理器选择了版
    的头像 发表于 11-29 09:29 701次阅读
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Studio</b> V2.3.0 版本正式发布!

    ENV的scons能生成RT-Thread studio工程吗?

    scons能生成RT-Thread studio工程吗?教程中使用scons —target==MDK5来生成MDK工程,怎么生成RT-Thread Stdudio工程呢?
    发表于 10-13 07:42

    rt-thread studio 导入BSP 失败怎么解决?

    rt-thread studio 手动导入bsp 失败。 版本: 2.2.8 构建ID: 202405200930 导入的bsp 是直接从rt-thread 代码仓库下载的 .log
    发表于 10-11 11:07

    请问rt-thread studio可以开发完整的mcu程序吗?

    请教一下:rt-thread studio IDE开发环境,能完整开发的rt-thread 的mcu程序吗? 好多教程的步骤: 1。在rt-thread 的开源的工程中制作BSP包,
    发表于 10-09 09:21

    rt-thread studio无法离线使用怎么处理?

    在离线状态下,无法使用rt-thread studio。一定要逼着你联网才能用,许多公司处于保密需要,都是无法联网使用的
    发表于 09-29 10:22

    通过scons生成RT-Thread Studio工程,编译报rtconfig_preinc.h告警怎么解决?

    我在 github 下载 V5.1.0 的代码,在 gd32f450 的 bsp 中通过命令 scons --dist-ide 生成能够在 RT-Thread Studio 下运行的工程。在编译时会
    发表于 09-29 09:01

    rt-thread studio被排除构建的资源如何启用?

    请问rt-thread studio被排除构建的资源如何启用? 自己新建了两个文件夹,里边写了些应用程序,原本是可以构建的,在点击了RT-Thread Settings在保存后这两个文件夹就被排除构建了,请问应该怎么重新应用?
    发表于 09-28 07:58

    使用RT-Thread studio 开发RT-Thread Nano项目的时候 串口的驱动是要自己写吗?

    刚入坑。使用RT-Thread studio 开发RT-Thread 标准板项目的时候直接使用里边的串口uart_dev=rt_device_find(“uart5”);然后操作设备,
    发表于 09-26 08:14

    如何使用rt-thread studio中,使用 定制化的SDK建立工程?

    --target=eclipse生成 rt-thread studio 工程 在rt-thread studio中,使用sdk Manager 导入配置成功。 配置成功了, 问题:
    发表于 09-26 06:16

    RT-Thread Studio 2.2.8创建新项目直接构建编译报错怎么解决?

    RT-Thread Studio 2.2.8 尝试了RT-Thread Source Code 5.1.05.0.24.0.34.0.2版本 创建新的项目工程后,没有任何修改直接构建编译报错
    发表于 09-24 07:28

    RT-Thread studio报错怎么解决?

    rt-thread studio中创建k210项目,在创建项目时需要选择开发板,生成相关文件,配置什么的没有修改过,运行main.c,打印输出。编译就会出现如下报错。这两个文件倒是可以找到,但是将其复制到PATH路径下也没有用。希望有人能指点下,谢谢!
    发表于 09-17 06:55

    RT-Thread Studio在Windows Arm上RT-Thread Studio Setting配置项页面无法显示怎么解决?

    例如Apple Silicon的MacBook上的Windows 11 Arm版虚拟机,RT-Thread Studio Setting配置项页面无法显示。
    发表于 09-16 06:10

    rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?

    rt-thread studio2.2.9如何使用最新的RT-Thread v5.2.0 released? 原先以为修改index_all.json,发现联网的时候,会自动覆盖 另lastet版本
    发表于 09-16 06:06

    RT-Thread studio如何设置vi/vim编辑模式呢?

    求助,RT-Thread studio如何设置vi/vim编辑模式呢? 尝试找RT-Thread studio软件里面的设置,没找到呢。
    发表于 09-15 07:44

    指定文件下的函数加载到指定ram问题

    问题:mcuxpresso环境,xip模式下我需要使用flexspi将norflash的一部分作为文件系统,将flex以及fatfs相关函数全部加载到ram,发现rodata仍然在flash地址
    发表于 03-12 17:02