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

发布时间:2024-07-01  

用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 就更加的灵活了。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>