当前位置:首页 > 公众号精选 > 嵌入式微处理器
[导读]一.将DSP的Flash里面的函数转移到RAM中 对于独立的嵌入式系统,需要把程序存入non-volitale存储单元中,常用的也就是flash。但是程序在flash中运行相对在RAM中行,速度会变慢很多,具体有多慢,拿28335来说吧,假设系统时钟为150MHz,在RAM中运行时频率还是1



一.将DSP的Flash里面的函数转移到RAM

对于独立的嵌入式系统,需要把程序存入non-volitale存储单元中,常用的也就是flash。但是程序在flash中运行相对在RAM中行,速度会变慢很多,具体有多慢,拿28335来说吧,假设系统时钟为150MHz,在RAM中运行时频率还是150MHz,而放在flash中,频率会降到90-95MHz,参照Ti手册SPRA958L,这对于有些对实时性要求较高的函数功能,是不可接受的。所以在系统上电时,把对实时性要求高的函数转移到RAM中去。


下面以initflash函数为例,具体步骤如下:


(1)、将函数定位到section:

#pragma CODE_SECTION(InitFlash, "secureRamFuncs")

当遇到InitFlash(),就到段secureRamFuncs去运行。

当有多个函数需要转移时,重复使用#pragma CODE_SECTION(“函数名", "secureRamFuncs")即可。

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


(2)、section分配到memory(红色为memory)。

意思是到FLASH去下载InitFlash(),下载到SECURE_RAM,然后要到SECURE_RAM去运行程序,这个过程给出了下载地址和目标地址。注意此时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()将经过#pragmaCODE_SECTION设定的函数从FLASH弄到SECURE_RAM中去。注意不是将FLASH的东西全部弄到SECURE_RAM中。


#include <string.h>//实际应用中这一部分声明可有可无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的内嵌Flash里的部分代码运行在 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 的关键所在。


-END-




推荐阅读



【01】嵌入式系统中常用的IIC与SPI,这两种通讯方式该怎么选?
【02】嵌入式必看:Linux内存管理那些事儿
【03】嵌入式项目是如何评估系统所需的RAM和ROM用量的?
【04】嵌入式和单片机不一样?那它们的区别在哪?
【05】嵌入式开发碰到无法解决的问题?编程的凹凸性有妙用!(附C代码)


免责声明:整理文章为传播相关技术,版权归原作者所有,如有侵权,请联系删除

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

嵌入式ARM

扫描二维码,关注更多精彩内容

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

存储器是计算机系统中的关键组件,负责存储程序指令和数据,是实现计算和信息处理的基础。根据其工作原理、存储容量、访问速度、稳定性以及持久性等诸多特性,存储器可以被细分为多个类别。本篇文章将详细介绍存储器的主要分类,并探讨各...

关键字: 存储器 RAM

在嵌入式系统开发、调试和测试过程中,J-Link作为一种高效的调试工具,为开发者提供了极大的便利。然而,要想充分发挥J-Link的功能,首先需要正确安装其驱动程序。本文将详细介绍J-Link驱动的安装过程,并深入解析其中...

关键字: jlink 嵌入式系统 嵌入式开发

提供业界最高容量的闪存、RAM和GPIO组合,支持Matter over Thread

关键字: 闪存 RAM 物联网

与谷歌的合作使 Nordic 能够在 nRF Connect SDK 中嵌入开发人员软件,以构建与安卓移动设备兼容的谷歌Find My Device和未知跟踪器警报服务

关键字: 谷歌 SoC 嵌入式开发

嵌入式开发作为当今电子工程和信息技术领域的核心分支,涵盖了广泛的软硬件技术和系统集成方法,用于构建高性能、低成本、低功耗、体积小巧且功能专一的嵌入式系统。这些系统无处不在,从微型传感器节点到复杂的工业控制设备,从日常使用...

关键字: 嵌入式开发 Python

嵌入式开发是当今信息技术领域不可或缺的一部分,它融合了硬件设计、软件开发和系统集成等多个学科,专门用于创建那些被嵌入到特定设备或系统中的专用计算机系统。嵌入式开发的主要过程包括利用分立元件或集成器件进行电路设计、结构设计...

关键字: 嵌入式开发 硬件设计 软件开发

嵌入式开发作为一种专业且技术密集型的领域,涵盖了从硬件底层驱动、中间件到应用层软件开发等多个层面的工作,其所需的工具种类繁多,各有针对性,旨在提升开发效率、保证代码质量以及简化调试过程。

关键字: 嵌入式开发 keil

嵌入式开发作为信息技术领域的重要分支,其涉及的语言种类繁多,各具特色。这些语言的选择取决于目标平台的特性、性能需求、开发者的熟练程度以及项目的具体要求。本文将详细介绍几种常见的嵌入式开发语言,包括C语言、C++、汇编语言...

关键字: 嵌入式开发 C语言

嵌入式开发是一项综合了硬件设计、软件编程以及系统整合的技术活动,其目的是为了创造出能够在特定环境中高效、稳定运行的嵌入式系统。这一流程涵盖了多个紧密关联且不可或缺的阶段,从最初的客户需求分析到最终的产品测试和交付,每个环...

关键字: 嵌入式开发 硬件设计

嵌入式开发作为一个融合了计算机软硬件和系统工程的综合性领域,其成功与否往往取决于三个核心要素的有效整合与协调。这三个要素分别是:硬件平台的选择与设计、软件开发及其优化、以及系统级的设计与集成。深入理解并熟练掌握这三个方面...

关键字: 嵌入式开发 ARM
关闭
关闭