久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
關于MCU和PC在代碼加載和運行上的區別
[打印本頁]
作者:
906213444
時間:
2018-10-28 22:47
標題:
關于MCU和PC在代碼加載和運行上的區別
MCU 異于 資源豐富的linux 平臺。 MCU(如: 基于Cortex V6M 的Cortex M0+ 等) Code 通常運行在內嵌Flash 中。 在某些特定應用場合,需要將部分函數運行于RAM 中。 昨天,為解決次問題,實現了一種解法,具體做法如下:
1. 實現要運行在RAM的 routine, 本routine 使用純匯編實現, 如:
__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 與運行位置無關的編譯選項 如 (Keil --apcs /ropi/rwpi), 生成 *.axf;
3. 通過fromelf -c 將生成 *.axf 反匯編,找到對應program_word2addr 實現部分, 并將routine 對應的binary code Copy 到所要應用的 Code 中,以只讀數組的形式出現:
如:
const staic uint16_t s_flashProg2AddressCode[16] = {...., ....}
4. 定義 一個全局數組, 如 static uint16_t g_code[16], size正好等于 s_flashProg2AddressCode的長度;
5. 定義一個函數指針, 如 static void (*callFlashPrg2Address)(uint32_t addr, uint32_t data)
6. 定義一個函數實現將Code 運行與 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 運行于RAM中。
callFlashPrg2Address = (void (*)(uint32_t addr, uint32_t data))((uin32_t)g_code + 1); +1 的目的,時由于運行平臺為 Cortex V6M , 采用的thumb指令集,根據ARM Spec 要 求完成。
callFlashPrg2Address (address, data); 則是實現RAM運行program_word2addr 的關鍵所在
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
欧美日韩中文在线
|
国产激情一区二区三区
|
久草福利
|
久久久久久久影院
|
91av视频
|
国产精品免费在线
|
欧美男人天堂
|
精品亚洲一区二区三区四区五区
|
久久久久久久久国产
|
久久久久久久
|
国产精品一区二区三区免费
|
亚洲综合五月天婷婷丁香
|
国产三级在线播放
|
亚洲久久久
|
午夜精品久久久久久久99黑人
|
亚洲精品影院
|
国产美女一区二区
|
色天堂影院
|
国产com
|
日韩在线欧美
|
亚洲欧美在线视频
|
日本公妇乱偷中文字幕
|
国产三级午夜理伦三级
|
在线中文字幕
|
аⅴ资源新版在线天堂
|
亚洲在线一区
|
久久不雅视频
|
亚洲三级视频
|
天天插天天
|
四虎av
|
午夜av在线
|
日韩av专区
|
一级大片免费看
|
白白色免费视频
|
成人在线a
|
国产黄a三级三级三级看三级男男
|
黄色xxxxx
|
日韩黄色一级视频
|
成年人午夜视频
|
欧美视频a
|
欧美性猛交xxxx免费看久久久
|