国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

完善資料讓更多小伙伴認(rèn)識你,還能領(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

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

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

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

#pragma CODE_SECTION(InitFlash, "secureRamFuncs")

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

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

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

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

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

SECTIONS {/*** User Defined Sections ***/secureRamFuncs: LOAD = FLASH,PAGE = 0RUN =SECURE_RAM, PAGE = 0//定義FLASH和SECURE_RAM的首地址secureRamFuncs_loadstart和secureRamFuncs_loadstart以代替絕對地址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 平臺。MCU(如:基于Cortex V6M 的Cortex M0+ 等) Code通常運(yùn)行在內(nèi)嵌Flash中。在某些特定應(yī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.編譯時,采用code 與運(yùn)行位置無關(guān)的編譯選項(xiàng) 如 (Keil --apcs /ropi/rwpi), 生成 *.axf;

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

如:

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

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

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

6.定義一個函數(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 的目的,時由于運(yùn)行平臺為 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)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • dsp
    dsp
    +關(guān)注

    關(guān)注

    561

    文章

    8244

    瀏覽量

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

    關(guān)注

    8

    文章

    1399

    瀏覽量

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

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67502

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    dsp報(bào)錯Flash Programmer

    ram里面寫代碼,感覺寫不進(jìn)去,我也沒用到flashflash報(bào)錯,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 ?227次閱讀
    沐渥科技:光罩盒氮?dú)夤竦奶攸c(diǎn)和注意事項(xiàng)

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

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

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

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

    單片機(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)試過程的坑

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

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

    嵌入式系統(tǒng)里,FLASH 的程序代碼并非必須搬到 RAM 運(yùn)行,這得由硬件配置、實(shí)際性能需求和應(yīng)用場景共同決定。就像很多低端單片機(jī),無論是依賴片內(nèi)
    的頭像 發(fā)表于 08-06 10:19 ?1356次閱讀
    嵌入式系統(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é),不同型號的扇區(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)試(含源碼)

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

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

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

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

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