0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

解析使用RT-Thread Studio指定特殊函數(shù)加載到RAM的方法

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:whj123999 ? 2021-11-18 10:06 ? 次閱讀

用ITCM給ART-PiSTM32H7)代碼加速 , 這篇文章就提到了,將特殊的函數(shù)(如,算法相關(guān))加載到速度更快的 ITCM,但是這篇文章中使用 GCC 編譯器的時(shí)候,無(wú)法保證在斷電復(fù)位后 RAM 段的代碼不消失,所以本文來(lái)研究這個(gè)問(wèn)題。

眾所周知,RAM 是掉電丟失數(shù)據(jù)的,為了做到產(chǎn)品中也能使用這種操作,就需要將代碼編譯到 ROM 中,然后啟動(dòng)的時(shí)候,從 ROM 拷貝到 RAM 當(dāng)中,知道了原理,具體如何操作呢?

二、RT-Thread Studio 指定特殊函數(shù)到RAM的辦法

為了實(shí)現(xiàn)這種操作,需要知道可執(zhí)行程序的生成過(guò)程,預(yù)處理- 》編譯 -》匯編-》 鏈接,可以從這幾個(gè)地方去著手解決這個(gè)問(wèn)題。RTT Studio 使用的是 GCC 的編譯器,所以修改相應(yīng)的 GCC 文件就可以了。

1. 修改鏈接文件

為了實(shí)現(xiàn)這個(gè)目的,所以需要在鏈接文件中增加對(duì)應(yīng)的 .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:總長(zhǎng)度

構(gòu)造 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) 這種指定函數(shù)到特殊區(qū)域的ITCM段的函數(shù),編譯后放到 ROM 里面,程序運(yùn)行的時(shí)候從 RAM 取這個(gè)函數(shù),這樣可以在系統(tǒng)上電之后可以從 ROM 中把數(shù)據(jù)復(fù)制到 RAM 當(dāng)中,這樣就解決了上一篇文章的問(wèn)題。這里定義了 2 個(gè)全局變量方便后續(xù)在匯編當(dāng)中把函數(shù)從 ROM 拷貝到 RAM。

2. 修改啟動(dòng)匯編

startup_stm32h750xx.s這里只做了,已初始化值的數(shù)據(jù),從 ROM 拷貝到 RAM 的操作,所以需要增加一些代碼來(lái)實(shí)現(xiàn)把函數(shù)從 ROM 拷貝到 RAM
修改部分:

 1Reset_Handler:/*程序復(fù)位后的啟動(dòng)地址*/
 2ldrsp,=_estack/*設(shè)置SP*/
 3
 4ldrr0,=__itcm_rom_start/*加載放在了ROM當(dāng)中,需要加載到ITCM中數(shù)據(jù)的起始地址到R0*/
 5ldrr1,=__itcm_start/*加載ITCM第一個(gè)函數(shù)的起始放置位置到R1*/
 6ldrr2,=__itcm_size/*加載ITCM的大小到R2*/
 7addr2,r1,r2/*R1加R2的值放到R2*/
 8
 91:
10cmpr2,r1/*比較R1與R2*/
11beq2f/*如果上面的比較之后是相等的則跳轉(zhuǎn)到標(biāo)簽2*/
12ldrr3,[r0],#4/*將 R0寄存器里面存放的地址處的代碼,寫入到 R3 寄存器里面。然后 R0+ 4 */
13strr3,[r1],#4/*將R3中的數(shù)據(jù)寫入以R1為地址的存儲(chǔ)器中,然后R1+4*/
14b1b/*調(diào)回到標(biāo)簽1,循環(huán)拷貝*/
152:/*以下是未修改之前的GCC啟動(dòng)匯編代碼*/
16
17/*CopythedatasegmentinitializersfromflashtoSRAM*/
18movsr1,#0
19bLoopCopyDataInit

這里使用了數(shù)字標(biāo)簽,所以跳轉(zhuǎn)時(shí)候標(biāo)簽后綴為b或f,b==back ,f == forward。

這里的拷貝方法就是,知道程序下載之后放在了 ROM 的位置,然后從這個(gè)位置拷貝到 RAM 中去。

3. 將函數(shù)指定鏈接位置

1__attribute__((section(".ITCM")))
2intmain(void)
3{
4rt_uint32_tcount=0;
5
6rt_pin_mode(LED_PIN,PIN_MODE_OUTPUT);
7}

三, 總結(jié)

1、用ITCM給ART-Pi(STM32H7)代碼加速提到的方法,MDK 可以實(shí)現(xiàn)啟動(dòng)的時(shí)候?qū)?ROM 中的函數(shù)搬運(yùn)到 RAM 當(dāng)中的操作,使用 RTT Studio 也可以實(shí)現(xiàn)

2、在 GCC 的鏈接文件可以描述一個(gè)文件的 section 的中數(shù)據(jù)的存放地址和加載地址不一致。

3、在 RT-Thread Studio 中實(shí)現(xiàn)這個(gè)操作,確實(shí)比 MDK 會(huì)復(fù)雜很多,對(duì)于研究底層的人而言,在 MDK 中很難看到這些細(xì)節(jié),喜歡自定義操作的人而言,GCC 就更加的靈活了。

編輯:jq


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7224

    瀏覽量

    90194
  • ROM
    ROM
    +關(guān)注

    關(guān)注

    4

    文章

    576

    瀏覽量

    86351
  • RAM
    RAM
    +關(guān)注

    關(guān)注

    8

    文章

    1383

    瀏覽量

    115517
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4858

    瀏覽量

    69551
  • MDK
    MDK
    +關(guān)注

    關(guān)注

    4

    文章

    209

    瀏覽量

    32260

原文標(biāo)題:使用RT-Thread Studio指定特殊函數(shù)加載到RAM的方法

文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    指定文件下的函數(shù)加載到指定ram問(wèn)題

    問(wèn)題:mcuxpresso環(huán)境,xip模式下我需要使用flexspi將norflash的一部分作為文件系統(tǒng),將flex以及fatfs相關(guān)函數(shù)全部加載到ram,發(fā)現(xiàn)rodata仍然在flash地址
    發(fā)表于 03-12 17:02

    請(qǐng)問(wèn)使用RT-Thread Studio在程序進(jìn)Hardfault時(shí)怎么方便查看調(diào)用棧?

    求助各位大神 使用RT-Thread Studio在程序進(jìn)Hardfault時(shí)怎么方便的查看調(diào)用棧 使用MDK的時(shí)候可以方便的看調(diào)用堆棧,從而很快速的找到問(wèn)題,使用RT-Thread Stud
    發(fā)表于 03-03 08:10

    RT-Thread上CAN實(shí)踐

    開(kāi)箱測(cè)試RT-Thread官方已完成了對(duì)英飛凌XMC7200EVK的移植,通過(guò)shell可以看到做好了uart3的console。本文將介紹如何進(jìn)行RT-ThreadCan移植。接下來(lái)我們要完成CAN_FD的驅(qū)動(dòng)移植,并正常啟動(dòng)RT-T
    的頭像 發(fā)表于 11-13 01:03 ?1575次閱讀
    <b class='flag-5'>RT-Thread</b>上CAN實(shí)踐

    rt-thread studio導(dǎo)入bsp失敗的原因?

    rt-thread studio導(dǎo)入bsp失敗,bsp:gd32470z-lckfb
    發(fā)表于 09-27 09:54

    rt-thread studio導(dǎo)入bsp失敗的原因?

    rt-thread studio導(dǎo)入bsp失敗,bsp:gd32470z-lckfb
    發(fā)表于 09-13 07:49

    rt-thread studio手動(dòng)導(dǎo)入bsp失敗的原因?怎么處理?

    rt-thread studio 手動(dòng)導(dǎo)入bsp 失敗。 版本: 2.2.8 構(gòu)建ID: 202405200930 導(dǎo)入的bsp 是直接從rt-thread 代碼倉(cāng)庫(kù)下載的
    發(fā)表于 09-13 06:45

    如何在RT-thread studio的裸機(jī)例程上移植freertos?

    如何在RT-thread studio的裸機(jī)例程上移植freertos
    發(fā)表于 09-13 06:32

    2024 RT-Thread全球巡回 線下培訓(xùn)火熱來(lái)襲!

    親愛(ài)的RT-Thread社區(qū)成員們:我們非常高興地宣布,2024年RT-Thread全球開(kāi)發(fā)者線下培訓(xùn)即將拉開(kāi)帷幕!24年全球巡回培訓(xùn)將覆蓋超10座城市及國(guó)家,為開(kāi)發(fā)者提供一個(gè)深入學(xué)習(xí)RT-Thread嵌入式開(kāi)發(fā)的絕佳機(jī)會(huì)。
    的頭像 發(fā)表于 08-07 08:35 ?1832次閱讀
    2024 <b class='flag-5'>RT-Thread</b>全球巡回 線下培訓(xùn)火熱來(lái)襲!

    RT-Thread Studio導(dǎo)入keil MDK工程失敗的原因?怎么解決?

    RT-Thread Studio導(dǎo)入keil MDK工程失敗
    發(fā)表于 07-15 06:56

    【ch32v307_RTT】1、使用RT-Thread studio新建工程

    【前言】 ch32v307有成熟的RT-Thread 支持,使用RT-Thread studio可以快速的建立工程,我將分享系列文章,這一篇是如何快速建立工程。 【前題】 安裝好RT-Thre
    發(fā)表于 06-29 18:25

    6月6日杭州站RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    6月6日下午我們將在杭州舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺(tái)上實(shí)現(xiàn)同時(shí)運(yùn)行RT-Thread和linux,本次workshop邀請(qǐng)到RT-Thread資深
    的頭像 發(fā)表于 05-28 08:35 ?526次閱讀
    6月6日杭州站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月25日北京站RT-Thread線下workshop,探索RT-Thread混合部署新模式

    4月25日,下午我們將在北京舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺(tái)上實(shí)現(xiàn)同時(shí)運(yùn)行RT-Thread和linux,本次workshop邀請(qǐng)到RT-Thread資深
    的頭像 發(fā)表于 04-16 08:35 ?507次閱讀
    4月25日北京站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    4月10日深圳場(chǎng)RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    4月10日我們將在深圳福田舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺(tái)上實(shí)現(xiàn)同時(shí)運(yùn)行RT-Thread和linux,本次workshop邀請(qǐng)到RT-Thread資深嵌入式軟件工程師農(nóng)曉明老師為您講
    的頭像 發(fā)表于 03-27 11:36 ?955次閱讀
    4月10日深圳場(chǎng)<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月10日深圳場(chǎng)RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    4月10日我們將在深圳福田舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺(tái)上實(shí)現(xiàn)同時(shí)運(yùn)行RT-Thread和linux,本次workshop邀請(qǐng)到RT-Thread資深
    的頭像 發(fā)表于 03-27 08:34 ?628次閱讀
    4月10日深圳場(chǎng)<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    恩智浦半導(dǎo)體正式加入RT-Thread全球合作伙伴計(jì)劃!

    前不久,恩智浦半導(dǎo)體正式加入RT-Thread全球合作伙伴計(jì)劃,成為RT-Thread高級(jí)會(huì)員合作伙伴。同時(shí),RT-Thread現(xiàn)已成為恩智浦注冊(cè)合作伙伴(RT-Thread| 簡(jiǎn)介合
    的頭像 發(fā)表于 03-14 10:40 ?735次閱讀
    恩智浦半導(dǎo)體正式加入<b class='flag-5'>RT-Thread</b>全球合作伙伴計(jì)劃!