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 的关键所在。


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MCURAM(随机存取存储器)、ROM(只读存储器)和Flash(闪存)是三种常见的存储器类型,它们在MCU具有不同的作用和功能。 首先,ROM是一种只读存储器,用于存储固定的程序代码和数据,它在MCU出厂时就被烧录好,无法进行修改。ROM程序代码和数据可以被CPU直接读取和使用,因此ROM在MCU负责存储启动程序和系统固化的各种功能,确保MCU在上电后能正常运行。 其次,RAM是一种随机存取存储器,用于存储正在运行的程序和临时数据。RAM的数据存储是易失性的,即在断电后数据会丢失。RAMMCU用于存储CPU的运算过程需要读写的数据,提供了程序运行的临时存储空间。因为RAM速度快且可以重写,所以RAMMCU常被用来实现变量的存储和实时数据的缓存,是程序运行过程频繁访问的存储器。 最后,Flash是一种非易失性存储器,也是MCU常见的主要存储介质之一。Flash用于存储程序代码或者其他需要长久保存的数据,其数据存储在断电后不会丢失。Flash具有可擦写、可重写的特点,可以被CPU进行修改操作。它与ROM不同,Flash的内容可以在MCU运行期间被CPU通过特定的操作进行修改。 综上所述,在MCU,ROM用于存储系统启动程序和固化的功能程序RAM用于存储运行过程程序代码和临时数据,而Flash用于存储可修改的程序代码和长期存储的数据。这三种存储器类型在MCU相互合作,为MCU的正常运行和数据的存储提供了基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值