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

1 post / 0 new
526095766_642
526095766_642的头像
单片机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反汇编,找到对应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的关键所在。

本文转载自:单片机精讲吴鉴鹰
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理。