重庆时时彩机人工计划 时时彩计划 时时彩平台计划群 大发时时彩交流群 汪彩时时彩 新疆时时彩走势 重庆时时彩微信群多少 时时彩玩法介绍图 重庆时时彩讨论吧 9时时彩平台怎样 时时彩功夫计划 天津福利彩票时时彩开奖结果 新疆时时彩三星综合走势图 奇特的时时彩跨度算法 买时时彩有什么技巧吗 重庆时时彩前二和值走势图 分分时时彩全天计划 卓越计划时时彩软件 重时时彩三星走势图 重庆时时彩连出大 重庆时时彩人工稳计划 腾龙时时彩缩水工具 时时彩4星稳定条件做号 时时彩后三乘以0.618 时时彩源代码 时时彩稳赚实战大全 时时彩计划软件哪个准 时时彩软件哪个好用 时时彩计划群发软件 天津时时彩app

您当前的位置:首页 > 基础知识 > 单片机  > 单片机常见问题

单片机MCU如何实现让部分代码运行在RAM中?看这里

来源:21ic整理 关键字:单片机   MCU   RAM   

 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 反汇编,?#19994;蕉杂rogram_word2addr 实现部分, 并将routine ?#26434;?#30340;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 的目?#27169;?#26102;由于运行平台为 Cortex V6M , 采用的thumb指令集,根据ARM Spec 要 求完成。

callFlashPrg2Address (address, data); 则是实现RAM运行program_word2addr 的关键所在。

时时彩保本1124打法