91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

將DSP的Flash里面的函數(shù)轉(zhuǎn)移到RAM中

GReq_mcu168 ? 來源:玩轉(zhuǎn)單片機(jī) ? 2020-08-04 17:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一.將DSP的Flash里面的函數(shù)轉(zhuǎn)移到RAM

對(duì)于獨(dú)立的嵌入式系統(tǒng),需要把程序存入non-volitale存儲(chǔ)單元中,常用的也就是flash。但是程序在flash中運(yùn)行相對(duì)在RAM中行,速度會(huì)變慢很多,具體有多慢,拿28335來說吧,假設(shè)系統(tǒng)時(shí)鐘為150MHz,在RAM中運(yùn)行時(shí)頻率還是150MHz,而放在flash中,頻率會(huì)降到90-95MHz,參照Ti手冊(cè)SPRA958L,這對(duì)于有些對(duì)實(shí)時(shí)性要求較高的函數(shù)功能,是不可接受的。所以在系統(tǒng)上電時(shí),把對(duì)實(shí)時(shí)性要求高的函數(shù)轉(zhuǎn)移到RAM中去。

下面以initflash函數(shù)為例,具體步驟如下:

(1)、將函數(shù)定位到section:

#pragma CODE_SECTION(InitFlash, "secureRamFuncs")

當(dāng)遇到InitFlash(),就到段secureRamFuncs去運(yùn)行。

當(dāng)有多個(gè)函數(shù)需要轉(zhuǎn)移時(shí),重復(fù)使用#pragma CODE_SECTION(“函數(shù)名", "secureRamFuncs")即可。

即使有多個(gè)#pragma CODE_SECTION,后面的步驟只需要一次。

(2)、section分配到memory(紅色為memory)。

意思是到FLASH去下載InitFlash(),下載到SECURE_RAM,然后要到SECURE_RAM去運(yùn)行程序,這個(gè)過程給出了下載地址和目標(biāo)地址。注意此時(shí)SECURE_RAM中還沒有代碼。

SECTIONS {/*** User Defined Sections ***/secureRamFuncs: LOAD = FLASH,PAGE = 0RUN =SECURE_RAM, PAGE = 0//定義FLASH和SECURE_RAM的首地址secureRamFuncs_loadstart和secureRamFuncs_loadstart以代替絕對(duì)地址LOAD_START(_secureRamFuncs_loadstart),LOAD_SIZE(_secureRamFuncs_loadsize),RUN_START(_secureRamFuncs_runstart),}

(3)、用memcpy()將經(jīng)過#pragmaCODE_SECTION設(shè)定的函數(shù)從FLASH弄到SECURE_RAM中去。注意不是將FLASH的東西全部弄到SECURE_RAM中。

#include //實(shí)際應(yīng)用中這一部分聲明可有可無extern unsigned intsecureRamFuncs_loadstart;extern unsigned intsecureRamFuncs_loadsize;extern unsigned intsecureRamFuncs_runstart;void main(void){/* Copy the secureRamFuncs section */memcpy(&secureRamFuncs_runstart,&secureRamFuncs_loadstart,(Uint32)&secureRamFuncs_loadsize);/* Initialize the on-chip flash registers*/InitFlash();}

二.將MCU的內(nèi)嵌Flash里的部分代碼運(yùn)行在 RAM 中

MCU 異于資源豐富的linux 平臺(tái)。MCU(如:基于Cortex V6M 的Cortex M0+ 等) Code通常運(yùn)行在內(nèi)嵌Flash中。在某些特定應(yīng)用場(chǎng)合,需要將部分函數(shù)運(yùn)行于RAM 中。為解決次問題,筆者實(shí)現(xiàn)了一種解法,具體做法如下:

1. 實(shí)現(xiàn)要運(yùn)行在RAM的 routine, 本routine 使用純匯編實(shí)現(xiàn), 如:

__asm void program_word2addr(uint32_t addr, uint32_t data){ push {r3, r4, r5, lr} ;save some regsiters /*your code for this routine*/ pop {r3, r4, r5, pc} }

2.編譯時(shí),采用code 與運(yùn)行位置無關(guān)的編譯選項(xiàng) 如 (Keil --apcs /ropi/rwpi), 生成 *.axf;

3.通過fromelf -c 將生成 *.axf 反匯編,找到對(duì)應(yīng)program_word2addr 實(shí)現(xiàn)部分, 并將routine 對(duì)應(yīng)的binary code Copy 到所要應(yīng)用的 Code 中,以只讀數(shù)組的形式出現(xiàn):

如:

const staic uint16_t s_flashProg2AddressCode[16] = {...., ....}

4.定義 一個(gè)全局?jǐn)?shù)組, 如 static uint16_t g_code[16], size正好等于 s_flashProg2AddressCode的長(zhǎng)度;

5. 定義一個(gè)函數(shù)指針, 如 static void (*callFlashPrg2Address)(uint32_t addr, uint32_t data)

6.定義一個(gè)函數(shù)實(shí)現(xiàn)將Code 運(yùn)行與 RAM如:

void run_prgcode_onram(uint32_t addr, uint32_t data){ memcpy(g_code,s_flashProg2AddressCode,32 ); callFlashPrg2Address = (void (*)(uint32_t addr, uint32_t data))((uin32_t)g_code + 1); callFlashPrg2Address (address, data); }

run_prgcode_onram, 便可以將program_word2addr 運(yùn)行于RAM中。

callFlashPrg2Address = (void (*)(uint32_t addr, uint32_t data))((uin32_t)g_code + 1); +1 的目的,時(shí)由于運(yùn)行平臺(tái)為 Cortex V6M , 采用的thumb指令集,根據(jù)ARM Spec 要求完成。

callFlashPrg2Address (address, data); 則是實(shí)現(xiàn)RAM運(yùn)行program_word2addr 的關(guān)鍵所在。

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

    關(guān)注

    561

    文章

    8248

    瀏覽量

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

    關(guān)注

    8

    文章

    1399

    瀏覽量

    120606
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67549

原文標(biāo)題:嵌入式開發(fā)中,如何將Flash中的程序轉(zhuǎn)移到RAM中運(yùn)行?

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    dsp報(bào)錯(cuò)Flash Programmer

    ram里面寫代碼,感覺寫不進(jìn)去,我也沒用到flash,flash報(bào)錯(cuò),ccs4.2版本,dsp28335,xds100v2 usb仿真器,他
    發(fā)表于 01-09 11:12

    沐渥科技:光罩盒氮?dú)夤竦奶攸c(diǎn)和注意事項(xiàng)

    光罩是半導(dǎo)體制造光刻工藝所使用的圖形轉(zhuǎn)移工具或母版,它承載著設(shè)計(jì)圖形,通過光刻過程圖形轉(zhuǎn)移到光刻膠上,再經(jīng)過刻蝕等步驟轉(zhuǎn)移到襯底上,是集
    的頭像 發(fā)表于 01-05 10:29 ?234次閱讀
    沐渥科技:光罩盒氮?dú)夤竦奶攸c(diǎn)和注意事項(xiàng)

    單片機(jī)位操作指令

    8031的位尋址區(qū)??磮D1??梢娺@里面的每一個(gè)RAM的每個(gè)位我們都可能直接用位地址來找到它們,而不必用字節(jié)地址,然后再用邏輯指令的方式。 能位尋址的特殊功能寄存器 8031有一些S
    發(fā)表于 01-05 06:48

    Infineon SEMPER NOR Flash與HYPERRAM? 2.0 Gen2 Flash+RAM MCP產(chǎn)品解析

    啟動(dòng)代碼,用RAM進(jìn)行暫存擴(kuò)展內(nèi)存。英飛凌(Infineon)推出的Flash+RAM多芯片封裝(MCP)Gen 2產(chǎn)品,SEMPER? NOR Flash和HYPERRAM? 2.
    的頭像 發(fā)表于 12-20 16:20 ?1210次閱讀

    單片機(jī)的條件轉(zhuǎn)移指令

    ,#00H AJMP L2 L1: MOV R1,#0FFH L2: SJMP L2 END 在執(zhí)行上面這段程序前如果R0的值是0的話,就轉(zhuǎn)移到L1執(zhí)行,因此最終的執(zhí)行結(jié)果是R1的值為0FFH。而
    發(fā)表于 12-15 08:01

    復(fù)雜的軟件算法硬件IP核的實(shí)現(xiàn)

    轉(zhuǎn)移到硬件完成(起到類是圖像處理的顯卡 的作用),從而實(shí)現(xiàn)應(yīng)用處理的加速。 圖 1.2 ASP Mode 2.C to Hardware 工作流程 CHC 編譯器
    發(fā)表于 10-30 07:02

    如何從 flash 把代碼搬運(yùn)到 ram 運(yùn)行的?

    沒有已經(jīng)移植適配過的芯片 運(yùn)行機(jī)制是從 flash 把代碼搬運(yùn)到 ram 運(yùn)行的
    發(fā)表于 09-28 11:03

    【六岳微LY-F335開發(fā)板試用體驗(yàn)】OLED顯示和調(diào)試過程的坑

    添加或用工程文件管理器添加,只要將兩個(gè)CMD文件加入工程就行,FlashRAM的CMD文件同時(shí)只能一個(gè)使用(關(guān)鍵是不同同時(shí)編譯,可以兩個(gè)都添加,但是不用于編譯使用)。 在DSP28335工程文件里
    發(fā)表于 09-22 19:17

    嵌入式系統(tǒng),FLASH 的程序代碼必須搬到 RAM 運(yùn)行嗎?

    嵌入式系統(tǒng)里,FLASH 的程序代碼并非必須搬到 RAM 運(yùn)行,這得由硬件配置、實(shí)際性能需求和應(yīng)用場(chǎng)景共同決定。就像很多低端單片機(jī),無論是依賴片內(nèi)
    的頭像 發(fā)表于 08-06 10:19 ?1372次閱讀
    嵌入式系統(tǒng)<b class='flag-5'>中</b>,<b class='flag-5'>FLASH</b> <b class='flag-5'>中</b>的程序代碼必須搬到 <b class='flag-5'>RAM</b> <b class='flag-5'>中</b>運(yùn)行嗎?

    FLASH模擬EEPROM

    \flash.h 里面的宏配置 ― FLASH_SECTOR_SIZE:定義扇區(qū)大小,單位是字節(jié),不同型號(hào)的扇區(qū)大小不一樣,詳情見表2; ― FLASH_CODE_SIZE:定義程
    發(fā)表于 07-16 15:13

    TLE9893 怎么代碼放在ram運(yùn)行?

    如題,我希望將我的中斷回調(diào)函數(shù)放進(jìn)ram運(yùn)行以保證他的運(yùn)行速度更快。那么我該怎么修改程序才能做到呢?或者有沒有相關(guān)的例程給我參考一下。
    發(fā)表于 07-14 08:00

    【中科昊芯Core_DSC280025C開發(fā)板試用體驗(yàn)】+3.DSP基礎(chǔ)外設(shè)調(diào)試(含源碼)

    是個(gè)人習(xí)慣哈,大家看看就行。 我會(huì)按照我的習(xí)慣,外設(shè)進(jìn)行劃分。 bsp_gpio.c主要就LED顯示、輸入輸出電平檢測(cè)與控制 bsp_timer.c主要是一個(gè)時(shí)基準(zhǔn),默認(rèn)中斷1Ms,與單片機(jī)里面的
    發(fā)表于 07-13 16:07

    【中科昊芯Core_DSC280025C開發(fā)板試用體驗(yàn)】+2.RAM工程與FLASH工程對(duì)比

    斷點(diǎn)只支持2個(gè)。程序運(yùn)行稍慢一些,但是可以通用修飾語句,讓某些函數(shù)加載到RAM里面,已達(dá)到運(yùn)行提速的目的。 所以,通常開發(fā)DSP的時(shí)候,大家是先在R
    發(fā)表于 07-04 10:37

    使用AD7616時(shí),轉(zhuǎn)換完成發(fā)送一次寫指令0x00就能將所有通道的數(shù)據(jù)轉(zhuǎn)移到SPIFIFO嗎?

    我在使用AD7616時(shí),轉(zhuǎn)換完成發(fā)送一次寫指令0x00就能將所有通道的數(shù)據(jù)轉(zhuǎn)移到SPIFIFO嗎?DMA又是怎么配置,我是讀取的SPIFIFO嗎?轉(zhuǎn)換兩次讀進(jìn)fifo的時(shí),第二次是接著第一個(gè)還是直接覆蓋了第一次的?
    發(fā)表于 04-24 06:02

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

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