亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:CSDN技術社區(qū) ? 作者:whj123999 ? 2021-11-18 10:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

1. 修改鏈接文件

為了實現(xiàn)這個目的,所以需要在鏈接文件中增加對應的 .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) 這種指定函數(shù)到特殊區(qū)域的ITCM段的函數(shù),編譯后放到 ROM 里面,程序運行的時候從 RAM 取這個函數(shù),這樣可以在系統(tǒng)上電之后可以從 ROM 中把數(shù)據(jù)復制到 RAM 當中,這樣就解決了上一篇文章的問題。這里定義了 2 個全局變量方便后續(xù)在匯編當中把函數(shù)從 ROM 拷貝到 RAM。

2. 修改啟動匯編

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

 1Reset_Handler:/*程序復位后的啟動地址*/
 2ldrsp,=_estack/*設置SP*/
 3
 4ldrr0,=__itcm_rom_start/*加載放在了ROM當中,需要加載到ITCM中數(shù)據(jù)的起始地址到R0*/
 5ldrr1,=__itcm_start/*加載ITCM第一個函數(shù)的起始放置位置到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中的數(shù)據(jù)寫入以R1為地址的存儲器中,然后R1+4*/
14b1b/*調(diào)回到標簽1,循環(huán)拷貝*/
152:/*以下是未修改之前的GCC啟動匯編代碼*/
16
17/*CopythedatasegmentinitializersfromflashtoSRAM*/
18movsr1,#0
19bLoopCopyDataInit

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

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

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

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 可以實現(xiàn)啟動的時候將 ROM 中的函數(shù)搬運到 RAM 當中的操作,使用 RTT Studio 也可以實現(xiàn)

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

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

編輯:jq


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

    關注

    8

    文章

    7306

    瀏覽量

    93667
  • ROM
    ROM
    +關注

    關注

    4

    文章

    578

    瀏覽量

    88359
  • RAM
    RAM
    +關注

    關注

    8

    文章

    1396

    瀏覽量

    119620
  • 代碼
    +關注

    關注

    30

    文章

    4928

    瀏覽量

    72749
  • MDK
    MDK
    +關注

    關注

    4

    文章

    211

    瀏覽量

    33375

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

    scons能生成RT-Thread studio工程嗎?教程中使用scons —target==MDK5來生成MDK工程,怎么生成RT-Thread Stdudio工程呢?
    發(fā)表于 10-13 07:42

    rt-thread studio 導入BSP 失敗怎么解決?

    rt-thread studio 手動導入bsp 失敗。 版本: 2.2.8 構建ID: 202405200930 導入的bsp 是直接從rt-thread 代碼倉庫下載的 .log
    發(fā)表于 10-11 11:07

    請問rt-thread studio可以開發(fā)完整的mcu程序嗎?

    請教一下:rt-thread studio IDE開發(fā)環(huán)境,能完整開發(fā)的rt-thread 的mcu程序嗎? 好多教程的步驟: 1。在rt-thread 的開源的工程中制作BSP包,
    發(fā)表于 10-09 09:21

    rt-thread studio無法離線使用怎么處理?

    在離線狀態(tài)下,無法使用rt-thread studio。一定要逼著你聯(lián)網(wǎng)才能用,許多公司處于保密需要,都是無法聯(lián)網(wǎng)使用的
    發(fā)表于 09-29 10:22

    通過scons生成RT-Thread Studio工程,編譯報rtconfig_preinc.h告警怎么解決?

    我在 github 下載 V5.1.0 的代碼,在 gd32f450 的 bsp 中通過命令 scons --dist-ide 生成能夠在 RT-Thread Studio 下運行的工程。在編譯時會
    發(fā)表于 09-29 09:01

    Win11安裝RT-Thread Studio失敗怎么解決?

    Win11安裝RT-Thread Studio-V2.2.9版本出現(xiàn)錯誤,大家怎么解決的?
    發(fā)表于 09-29 08:06

    rt-thread studio被排除構建的資源如何啟用?

    請問rt-thread studio被排除構建的資源如何啟用? 自己新建了兩個文件夾,里邊寫了些應用程序,原本是可以構建的,在點擊了RT-Thread Settings在保存后這兩個文件夾就被排除構建了,請問應該怎么重新應用?
    發(fā)表于 09-28 07:58

    使用RT-Thread studio 開發(fā)RT-Thread Nano項目的時候 串口的驅動是要自己寫嗎?

    剛入坑。使用RT-Thread studio 開發(fā)RT-Thread 標準板項目的時候直接使用里邊的串口uart_dev=rt_device_find(“uart5”);然后操作設備,
    發(fā)表于 09-26 08:14

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

    --target=eclipse生成 rt-thread studio 工程 在rt-thread studio中,使用sdk Manager 導入配置成功。 配置成功了, 問題:
    發(fā)表于 09-26 06:16

    RT-Thread Studio 2.2.8創(chuàng)建新項目直接構建編譯報錯怎么解決?

    RT-Thread Studio 2.2.8 嘗試了RT-Thread Source Code 5.1.05.0.24.0.34.0.2版本 創(chuàng)建新的項目工程后,沒有任何修改直接構建編譯報錯
    發(fā)表于 09-24 07:28

    RT-Thread studio報錯怎么解決?

    rt-thread studio中創(chuàng)建k210項目,在創(chuàng)建項目時需要選擇開發(fā)板,生成相關文件,配置什么的沒有修改過,運行main.c,打印輸出。編譯就會出現(xiàn)如下報錯。這兩個文件倒是可以找到,但是將其復制到PATH路徑下也沒有用。希望有人能指點下,謝謝!
    發(fā)表于 09-17 06:55

    RT-Thread Studio在Windows Arm上RT-Thread Studio Setting配置項頁面無法顯示怎么解決?

    例如Apple Silicon的MacBook上的Windows 11 Arm版虛擬機,RT-Thread Studio Setting配置項頁面無法顯示。
    發(fā)表于 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,發(fā)現(xiàn)聯(lián)網(wǎng)的時候,會自動覆蓋 另lastet版本
    發(fā)表于 09-16 06:06

    RT-Thread studio如何設置vi/vim編輯模式呢?

    求助,RT-Thread studio如何設置vi/vim編輯模式呢? 嘗試找RT-Thread studio軟件里面的設置,沒找到呢。
    發(fā)表于 09-15 07:44

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

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