我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1687|回复: 2

[技术讨论] 加快基于Flash的嵌入式应用的三大步骤

[复制链接]
  • TA的每日心情

    昨天 13:17
  • 签到天数: 67 天

    [LV.6]常住居民II

    1万

    主题

    8192

    回帖

    5万

    积分

    三级逆天

    积分
    53623

    终身成就奖特殊贡献奖原创先锋奖金点子奖优秀斑竹奖宣传大使奖

    发表于 2018-12-31 12:01:56 | 显示全部楼层 |阅读模式
    大多数现代嵌入式软件应用都是从Flash(Flash)存取和执行的。为了加快基于Flash的应用运行时间,开发人员可以选择一些关键功能从RAM执行,让速度更大幅提升......
    大多数现代嵌入式软件应用都是从Flash(Flash)存取和执行的。Flash为基于微控制器(MCU)的应用提供了便宜且快速的储存介质。这些应用通常都是实时的,对运行时间和确定性行为有严格要求。虽然Flash速度已经很快,但还是不如从RAM执行程序代码那么快。为了加快基于Flash的应用运行时间,开发人员可以选择一些关键功能从RAM执行,以获得额外的速度提升。

    为了从RAM执行一项功能,开发人员通常需要遵循三个步骤,包括:

    1.在功能链接器中创建RAM区域
       
    2.指定哪些功能应储存在RAM

    3.在启动时将这些功能复制到RAM

    让我们详细探讨一下这个过程。

    步骤#1:在功能链接器中创建RAM区域



    每个编译程序都使用不同的语法来定义MCU内的储存区域。对于本文的示例,我们将使用基于GCC的Code Composer Studio以及与TI C2000系列一起使用的语法,我相信它可以提供一个很好的例子。

    当我们修改链接器档以包含将从RAM执行的功能时,需要创建一个内存单元来指定功能将从哪里加载到RAM,以及将加载到RAM中哪个位置。

    链接器文件将包含指定重要程序分配的区域,例如:

    ●cinit

    ●text

    ●codestart

    ●stack

    ●constants

    开发人员需要为其RAM功能创建一个区域,可以使用以下程序代码完成:

    embeded18123102 0910f8abe6f2e8668f5987e1c992a515.jpg

    如你所见,这是在RAM中创建一个名为ramfuncs的区域。RAM区域将储存在FLASH A扇区的功能加载,它被指定在RAM区RAML0中运行。然后有一些定义用于指定RAM功能的开始和结束位置以及它们的大小。这些值在步骤#3中就显出重要性了。

    步骤#2:指定哪些功能应储存在RAM



    一旦在链接器中创建了一个RAM区域来储存指定的功能,我们需要指定功能应该驻留其中的链接器。最常用于执行此操作的方法是使用#pragma。通常,我们应该尽量避免在程序代码中使用#pragma,因为它是依赖于编译程序的。这意味着如果编译程序发生改变,开发人员很可能就必须修改#pragma行。对于我们要达到的目的,这没关系,因为我们无论如何都必须修改一个新的链接器档,我们需要找出正确的语法来指定如何将一个功能放入内存区域。

    通常从RAM执行的一组通用功能是与存取和控制Flash相关的功能。原因是当我们想要写入或擦除Flash时,大多数MCU都不允许同时执行Flash程序代码!因此,无论如何我们需要将这些功能放入RAM中。我们可以使用类似如下的程序代码将Flash_Init等功能放入RAM区域:

    embeded18123102 7304281b404461779dcb89e6a9ff8e08.jpg

    你可以从这一语句中看到我们正在使用自定义编译程序标识CODE_SECTION来指定Flash_Init功能应放入链接器中的ramfuncs区域。该语句通常应该直接放在功能定义的上方,以提示任何操作该功能的开发人员要将它放到RAM中。 (这也使我们更容易找到它,如果我们认为该功能不需要放在RAM中的话)。

    步骤#3:在启动时将功能复制到RAM

    该过程的最后一步是确保在微控制器启动期间将我们想要在RAM中执行的功能真正被复制到RAM中。最简单的方法是使用memcpy。我通常在配置系统频率和中断向量表之后执行这一复制操作,但要在初始化板载外围和应用程序代码之前。我在步骤#1中提到过,我们定义的几个变量会在以后派上用场。它们是RamfuncsRunStart、RamfuncsLoadStart和RamfuncsLoadSize。我们将使用memcpy和这些变量将功能复制到RAM中,按照以下语句:

    embeded18123104 410c6128275de56241ee0fe6bdac94de.jpg

    就这么简单。完成后,开发人员只需简单调用功能,就像通常那样,该功能就可以在RAM中执行。

    总结



    总之,当开发人员从Flash执行应用程序代码时,他们可以将这些功能复制到RAM中,以加速执行程序代码的关键部份。从RAM执行一个功能将透过消除可能与从Flash存取指令相关的任何等待状态来提高执行速度。这种额外的提升可确保关键功能以尽可能快的速度执行。正如我们所看到的,一旦你操作一两次后,就会发现将功能加载到RAM中并执行其实非常简单。
    回复

    使用道具 举报

    该用户从未签到

    129

    主题

    5360

    回帖

    491

    积分

    PADS-181015高级班

    积分
    491

    社区居民忠实会员社区劳模终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖金点子奖

    发表于 2018-12-31 12:40:58 | 显示全部楼层
    最后成功的人往往不是最有才华的人,而是那些默默付出直到最后一刻也不放弃的那些人!
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-6-14 16:03
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    0

    主题

    1万

    回帖

    7618

    积分

    二级逆天

    积分
    7618

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2019-1-1 10:48:05 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表