电子产业一站式赋能平台

PCB联盟网

搜索
查看: 91|回复: 0
收起左侧

IAR下如何将工程尽可能多的代码重定向到RAM执行?

[复制链接]

302

主题

307

帖子

1896

积分

三级会员

Rank: 3Rank: 3

积分
1896
发表于 2024-8-25 17:53:00 | 显示全部楼层 |阅读模式
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是在IAR开发环境下将尽可能多的代码重定向到RAM中执行的方法
0 s) w/ g8 A( t' ^5 e0 a" [最近和同事在讨论一个客户案例,客户 APP 工程是基于 IAR 开发环境,客户希望将工程里尽可能多的代码都重定向到 RAM 里执行,仅留必要或者指定的源文件代码在 Flash 中执行。这个需求和痞子衡旧文 《在IAR下将关键函数重定向到RAM中执行的方法》 实现正好相反,正常需求都是指定一些代码重定向到 RAM,客户这次却是要保留一些指定代码在 Flash 中,其余全部都重定向到 RAM。4 n  q+ J6 b; N+ i# [4 a* \
客户的这个需求原则上我们还是可以用老方法去做,即在 IAR 链接文件里将除了指定源文件外的其它 object 全部加入 initialize by copy 语句里,或者直接代码里对相关函数加 __ramfunc 或者 section 属性,但显然这种方式手工活太多比较繁琐,有没有更人性化的方式呢?当然有!这就是痞子衡今天要聊的话题:' a% a  t5 L1 k
  • Note 1:阅读本文前需要对 《IAR链接文件(.icf)》、《IAR映射文件(.map)》 这两种文件有所了解。
  • Note 2:本文使用的 IAR EWARM 软件版本是 v9.50.1。一、代码全部重定向问题在话题开始之前,我们先讨论一个问题。我们是否可以完全借助 IAR 自身特性将 APP 工程代码全部重定向到 RAM 里执行(即 CPU 不会在 Flash 里执行任何代码)?在回答这个问题之前,我们先来回忆一下代码重定向到底是如何完成的。一些被指定重定向的代码在链接时会被放到 RAM 区执行,但是会在 Flash 里留下其代码体机器码数据,这些数据需要从 Flash 里被拷贝到 RAM 里,这个拷贝动作是 IAR 底层函数 __iar_data_init3() 完成的,详见痞子衡旧文 《IAR启动函数流程之段初始化函数__iar_data_init3实现》 。
    9 l& @0 ]" A5 y' {- H: W很显然 IAR 底层函数 __iar_data_init3() 也是 APP 工程代码的一部分,它是需要在 Flash 里执行的,它没法被重定向(因为没有代码负责将这个底层函数机器码再拷贝到 RAM),鉴于此,我们也就没法完全利用 IAR 自身特性去做整个 APP 工程代码的重定向。
      p# ]& I$ w$ O1 X# u7 y如果想实现整个 APP 工程的重定向,则必须额外设计一个在 Flash 里执行的二级 Loader 工程,由这个 Loader 工程将 APP 工程全部数据从 Flash 里全部拷贝到 RAM 里再跳转,具体实现可见痞子衡旧文 《KBOOT形态(ROM/Bootloader/Flashloader)》 里的 2.3.1 小节。2 {* C% X& S1 W, [' C. X
    二、IAR链接语法 initialize {} except {}现在回到正题,要想实现客户需求,我们还得借助 IAR 自身,翻看 \IAR Systems\Embedded Workbench 9.50.1\arm\doc\EWARM_DevelopmentGuide.ENU 手册,可以找到如下关于 initialize 语法的定义,其中有可选的 except 语句,顾名思义,就是可以让一些指定的 object/section 不做 initialize 规定的动作,显然我们可以利用它来实现客户需求。
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表