色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    7085

    瀏覽量

    89232
  • ROM
    ROM
    +關注

    關注

    4

    文章

    575

    瀏覽量

    85844
  • RAM
    RAM
    +關注

    關注

    8

    文章

    1369

    瀏覽量

    114785
  • 代碼
    +關注

    關注

    30

    文章

    4803

    瀏覽量

    68762
  • MDK
    MDK
    +關注

    關注

    4

    文章

    209

    瀏覽量

    32095

原文標題:使用RT-Thread Studio指定特殊函數加載到RAM的方法

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    rt-thread studio導入bsp失敗的原因?

    rt-thread studio導入bsp失敗,bsp:gd32470z-lckfb
    發表于 09-27 09:54

    rt-thread studio導入bsp失敗的原因?

    rt-thread studio導入bsp失敗,bsp:gd32470z-lckfb
    發表于 09-13 07:49

    rt-thread studio手動導入bsp失敗的原因?怎么處理?

    rt-thread studio 手動導入bsp 失敗。 版本: 2.2.8 構建ID: 202405200930 導入的bsp 是直接從rt-thread 代碼倉庫下載的
    發表于 09-13 06:45

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

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

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

    RT-Thread Studio導入keil MDK工程失敗
    發表于 07-15 06:56

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

    6月6日下午我們將在杭州舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 05-28 08:35 ?459次閱讀
    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平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 04-16 08:35 ?436次閱讀
    4月25日北京站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

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

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

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

    4月10日我們將在深圳福田舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 03-27 08:34 ?545次閱讀
    4月10日深圳場<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    rt-thread studio執行清空項目的時候發現系統找不到指定的文件怎么解決?

    在基于rt-thread studio開發時,出于嘗試添加了一些組件,后來又刪掉了一些不需要的組件,重新編譯的時候拋出錯誤,錯誤指出刪掉的組件的相關.o文件還是存在,執行清空項目的時候發現系統找不到
    發表于 03-05 06:18

    RT-Thread Studio添加軟件包報錯怎么解決?

    RT-Thread Studio添加軟件包報錯ImportError: No module named psutil
    發表于 03-01 08:41

    使用RT-Thread Studio下載代碼不能運行是為什么?

    直接使用源碼包里面的keil工程下載代碼正常執行,但是使用RT-Thread Studio下載就不行了 使用的是TM4C123H6PM的例程,但是我的芯片是TM4C123H6PZ的,keil上是可以直接下載并正常工作的,但是RT-Thr
    發表于 03-01 08:22

    RT-Thread Studio中的RT-Thread Setting中已經有軟件包管理和組件服務管理了,那還需要env工具嗎?

    RT-Thread Studio中的RT-Thread Setting中已經有軟件包管理和組件服務管理了,那還需要env工具嗎,如果也使用env工具那不是和RT-Thread Sett
    發表于 02-23 07:36

    rt-thread studio地址偏移怎么配置?

    rt-thread studio地址偏移配置,這個再哪配置?
    發表于 02-23 06:24

    RT-Thread Studio為什么沒有找到外部中斷的配置?

    使用版本 RT-Thread Studio 版本: 2.2.7 構建ID: 202308112000 使用接口 使用RT-Thread,STM32因為默認是屏蔽掉外部中斷的接口代碼的 這樣用起來
    發表于 02-22 07:01
    主站蜘蛛池模板: 噜噜噜狠狠夜夜躁精品| 精品午夜久久影视| 久久国产欧美日韩精品免费| 亚洲AV噜噜88| 国产乱对白精彩在线播放| 我和黑帮老大第365天第2季在线 | 2017必看无码作品| 久久免费黄色| 97视频在线播放| 青青草国产偷拍在线av| 嘟嘟嘟在线视频免费观看高清中文 | 色色噜一噜| 国产香蕉视频| 伊人久久网国产伊人| 美女被男人撕衣舔胸| xxx日本免费| 午理论理影片被窝| 久久99国产视频| 99欧美精品| 无码日韩人妻精品久久蜜桃免费| 国内精品久久久久影院亚洲| 中文字幕天堂久久精品| 欧美兽交YOYO| 贵妃高h荡肉呻吟np杨玉环| 亚洲 综合 自拍 精品 在线| 久久精品国产在热亚洲| 99精品久久| 色婷婷激婷婷深爱五月小蛇| 国产在线观看99| 99精品视频免费观看| 天天影视网网色色欲| 久久久久久久久久毛片精品美女| 99在线精品免费视频| 午夜国产羞羞视频免费网站| 久久爽狠狠添AV激情五月| 草莓视频在线观看完整高清免费| 亚洲a视频在线| 欧美精品高清在线观看| 国产在线精品视频二区| 99亚洲精品色情无码久久| 亚洲高清视频在线观看|