STM32 进阶教程 11 - RAM中运行程序
前言
上一講我們講到stm32可以將代碼直接下載到RAM中時(shí)行程序調(diào)試,同時(shí)可以有效避開(kāi)STM32 Flash 擦寫次數(shù)有限問(wèn)題,其實(shí)除了仿真調(diào)試時(shí)將程序設(shè)置在RAM中可以解決FLASH擦寫次數(shù)問(wèn)題外,如果程序?qū)嶋H運(yùn)行時(shí)能直接在RAM中運(yùn)行,其代碼的運(yùn)行效率也會(huì)有一定的提高,那么怎么實(shí)現(xiàn)實(shí)際運(yùn)行時(shí)讓程序在RAM中運(yùn)行呢,本節(jié)將帶領(lǐng)大家來(lái)實(shí)現(xiàn)這一操作。
示例詳解
基于硬件平臺(tái): STM32F10C8T6最小系統(tǒng)板, MCU 的型號(hào)是?STM32F103c8t6, 使用stm32cubemx 工具自動(dòng)產(chǎn)生的配置工程,使用KEIL5編譯代碼。
?
?
本示例所用的最小系統(tǒng)板原理圖:
?
?
?
?
?
方法一:通過(guò)#pragma arm section code = “RAMCODE ”和#pragma arm section。這種方式,可以同時(shí)將多個(gè)函數(shù)放到指定的section。具體方法如下:
?
1. 修改.sct文件,自定義一個(gè)叫做RAMCODE的section,放在RW_IRAM1執(zhí)行區(qū)域,地址范圍0x20000000~0x20005000。
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00010000 ?{ ? ?; load region size_region
? ER_IROM1 0x08000000 0x00010000 ?{ ?; load address = execution address
? ?*.o (RESET, +First)
? ?*(InRoot$$Sections)
? ? .ANY (+RO)
?? .ANY (+XO)
? }
? RW_IRAM1 0x20000000 0x00005000 ?{ ?; RW data
? *.o(RAMCODE)
? ?.ANY (+RW +ZI)
? }
}
?
2. 在工程中使用前面修改的.sct文件
3.以#pragma arm section code = “RAMCODE” 開(kāi)頭,以#pragma arm section結(jié)尾。將所有需要放到RAMCODE section的函數(shù)包括進(jìn)來(lái)。編譯時(shí),編譯器會(huì)自動(dòng)將這些函數(shù)放到RAMCODE所在0x20000000開(kāi)始的區(qū)域。?
?
4.從map文件里,可以看到這幾個(gè)函數(shù)都已經(jīng)被放到了SRAM中。
?
方法二:通過(guò)__attribute__((section(“name ”)))
在KEIL中可以通過(guò)__attribute__((at(address)))的方式將變量放到指定的位置。通過(guò)__attribute__((section(“name ”)))的方式將變量或者函數(shù)放到指定的位置。
?
1.同樣,我們需要修改.sct文件,自定義一個(gè)叫做RAMCODE的section,并在工程選項(xiàng)的linker頁(yè)面中,選擇定義好的.sct文件。
?
2.在需要放到RAM中的函數(shù)前,用__attribute__((section("RAMCODE")))聲明該函數(shù)放在RAMCODE section中。注意,該函數(shù)中調(diào)用到的所有函數(shù)也要放到RAMCODE section中。
3.從編譯后的map文件可以看出,ToggleLED以及它調(diào)用到的所有函數(shù)都被到了RAM中。
方法二可以覆蓋方法一,也就是說(shuō)如果你同時(shí)用方法一和方法二對(duì)同一個(gè)函數(shù)的執(zhí)行區(qū)域做了說(shuō)明。最終起作用的是方法二如:
其實(shí)際結(jié)果為:
?
前面我們介紹了將一個(gè)或多個(gè)程序放到指定地址執(zhí)行的方法。如果需要放到指定地址的程序比較多,我們還可以將這些需要放到指定地址的程序集中放到一個(gè)或幾個(gè)C文件中,然后在.sct文件中將這些C文件生成的目標(biāo)文件放到指定地址。在這里,我們將嘗試將整個(gè)程序放到SRAM中執(zhí)行。復(fù)位后程序從FLASH啟動(dòng),之后將從SRAM執(zhí)行所有的程序。下面是具體的步驟:
?
1.將中斷向量表和中斷處理程序放到SRAM中,新建一個(gè)startup_stm32f103xb_ram.s文件并將其放在0x20000000處(在SCT文件中修改),其內(nèi)容為,:
?
?
2,在后面的.sct中將把RESET_ram這個(gè)section放到SRAM開(kāi)始的位置上,并將要放到SRAM中的程序模塊也加到SRAM中,如下圖:
2.在工程的Options for Target ->C/C++選項(xiàng)卡中加入VECT_TAB_SRAM宏定義:
3. 編譯完成后,從map文件可以看到程序的運(yùn)行地址是在SRAM區(qū)間:
如量沒(méi)有將對(duì)應(yīng)的程序模塊加載到SRAM中(SCT文件中沒(méi)加),則是下面的情況:
?
?
OK,本期實(shí)驗(yàn)完成!下期見(jiàn)!同時(shí)如果大家有什么疑問(wèn)或是有想了解的其它內(nèi)容,也歡迎大家留言!!最后喜歡這個(gè)公眾號(hào)的同學(xué)們記得加關(guān)注了,會(huì)有不定期技術(shù)干貨推出!!
文中源碼資料下載,在公眾號(hào)里給十三發(fā)消息:
下載|STM32進(jìn)階教程 11
?
關(guān)注十三公眾號(hào)
總結(jié)
以上是生活随笔為你收集整理的STM32 进阶教程 11 - RAM中运行程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: STM32 进阶教程 10 - RAM中
- 下一篇: STM32 进阶教程 12 - M4的硬