0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

IAR下手动拷贝自定义程序段到RAM中执行的方法分享

痞子衡嵌入式 来源:痞子衡嵌入式 2023-11-21 09:38 次阅读

在痞子衡旧文 《IAR下RT-Thread工程自定义函数段重定向失效分析》 里,我们知道 IAR 链接器处理自定义程序段重定向是有一些限制的,只要用户重写了底层 __low_level_init() 函数,那么这个函数里不能调用任何与自定义程序段相关的代码,否则自定义程序段就不会被 IAR 链接器(initialize by copy)正常处理。这其实对用户来说不太友好,既然如此,我们干脆就不用 IAR 链接器来做代码重定向了,今天痞子衡教大家手动拷贝程序段到 RAM 中的方法。

手动拷贝自定义程序段除了解决 IAR 链接器限制之外,还有另外一个用处,那就是拷贝的位置可以由用户决定。比如我们希望将程序重定向到外部 PSRAM 执行,但是在拷贝之前是需要先初始化外部 PSRAM 的,这时候我们完全可以在 main 函数里做完 PSRAM 初始化之后再做程序段的拷贝。

Note 1:阅读本文前需要对 《IAR链接文件(.icf)》、《IAR映射文件(.map)》 这两种文件有所了解。

Note 2:本文使用的 IAR EWARM 软件版本是 v9.30.1。

一、源文件里自定义程序段

首先我们要将需要重定向到 RAM 中执行的全部关键函数放到同一个自定义程序段里,具体方法参见痞子衡旧文 《在IAR下将关键函数重定向到RAM中执行的方法》 里 2.2 小节。

我们以最经典的 SDK_2.13.1_MIMXRT1170-EVKoardsevkmimxrt1170demo_appshello_worldcm7iar 例程( flexspi_nor_debug build)为例,将其 SysTick_DelayTicks() 函数放到自定义程序段 UserRelocateCode 里,写法如下:

#pragmalocation="UserRelocateCode"
voidSysTick_DelayTicks(uint32_tn)
{
g_systickCounter=n;
while(g_systickCounter!=0U)
{
}
}

二、链接文件里处理自定义程序段

有了自定义程序段 UserRelocateCode 后,现在我们需要告诉 IAR 链接器,这个程序段将由用户自己做初始化处理。打开工程链接文件 MIMXRT1176xxxxx_cm7_flexspi_nor.icf 添加如下语句。即将 UserRelocateCode 段重定向到 EXTRAM_region 里执行,并且这里最关键的是 initialize manually 这一句(区别于 SDK CodeQuickAccess 段重定向做法所用的 initialize by copy)。

define symbol m_external_ram_start   = 0x60000000;
define symbol m_external_ram_end     = 0x6003FFFF;
define region EXTRAM_region = mem:[from m_external_ram_start to m_external_ram_end];
initialize manually        { section UserRelocateCode };
place in EXTRAM_region     { section UserRelocateCode };

编译修改后的工程,查看其映射文件(.map),其中和 UserRelocateCode 段相关的内容如下,这里可以看到除了 P10 之外,P1 里还多了一个名为 UserRelocateCode_init 的段,这其实就是自定义程序段机器码在 Flash 里的存放位置(拷贝数据源)。

*******************************************************************************
*** PLACEMENT SUMMARY
***
"P10": place in [from 0x6000'0000 to 0x6003'ffff] { section UserRelocateCode };
initialize manually with packing = none { section UserRelocateCode };

  Section              Kind         Address    Size  Object
  -------              ----         -------    ----  ------
"P1":                                          0x4738
  UserRelocateCode_init           0x3000'6800    0x10  
    Initializer bytes    const    0x3000'6800    0x10  

"P10":                                           0x10
  UserRelocateCode                0x6000'0000    0x10  
    UserRelocateCode-1            0x6000'0000    0x10  
      UserRelocateCode   inited   0x6000'0000    0x10  led_blinky.o [7]
                                - 0x6000'0010    0x10

三、手动拷贝自定义程序段

上一节我们在映射文件里看到 UserRelocateCode_init 段的出现,这其实 IAR 的默认规定,可在 IAR SystemsEmbedded Workbench 9.30.1armdocEWARM_DevelopmentGuide.ENU.pdf 文档找到相应规则,即重定向的自定义段,其初始化值将被放到名为原自定义段名 + _init 后缀的段里。

67de6d6c-879f-11ee-939d-92fbcf53809c.png

一切准备就绪,拷贝代码的实现还是比较简单的,下面是示例拷贝函数 user_code_init()。有了它,我们就可以在 main 函数里自由决定其调用位置了。

#pragmasection="UserRelocateCode"
#pragmasection="UserRelocateCode_init"
voiduser_code_init(void)
{
uint8_t*dest_start,*src_start,*src_end;
uint32_tcodebytes;
dest_start=__section_begin("UserRelocateCode");
src_start=__section_begin("UserRelocateCode_init");
src_end=__section_end("UserRelocateCode_init");
codebytes=src_end-src_start;
while(codebytes--)
{
*dest_start++=*src_start++;
}
}

intmain(void)
{
psram_init();
user_code_init();
//代码省略...
}





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RAM
    RAM
    +关注

    关注

    7

    文章

    1321

    浏览量

    113706
  • IAR
    IAR
    +关注

    关注

    5

    文章

    319

    浏览量

    36283
  • PSRAM
    +关注

    关注

    0

    文章

    32

    浏览量

    13158

原文标题:IAR下如何手动拷贝自定义程序段到RAM中执行?

文章出处:【微信号:pzh_mcu,微信公众号:痞子衡嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Falsh和RAM运行同一代码,执行效率相同吗?

    在Flash运行程序和在RAM运行程序,同一代买执行
    发表于 02-19 07:10

    LabVIEW自定义控件

    首先看下面的 这个例 子:这个程序可以做出一些 动画的 效果,其实实现起来是十分简单的。主要的工作就是将布尔控件和滑动杆控件做了自定义 的处理 。我们在具体的程序,也可以使用
    发表于 01-07 10:57

    IAR小课堂 | 如何将部分程序RAM运行

    在实际项目开发,有时候我们需要将一部分程序从 FLASH 拷贝到 RAM 运行,以提高程序
    发表于 10-31 14:09

    【每日一知识点】IAR 下如何将程序拷贝RAM 运行,你知道怎么做吗?

    中将这部分程序拷贝到RAM 运行。本文中所有例子都是在 IAR v7.2 下,基于 STM32F334 完成的。
    发表于 03-22 13:34

    为什么要将flash操作代码拷贝到ram执行

    升级。比较特别的是,需要将flash操作代码拷贝到ram执行,这是为什么?bootloader程序所在flash空间设置为被保护状态,不会
    发表于 07-16 06:10

    如何从ram运行QSPI演示以测试自定义板上的QSPI Ram

    大家好 是否有程序或教程告诉我如何使其中一个演示应用程序从板载 RAM 运行。 我有一个 MIMXRT1060-EVKB 开发套件以及一个装有 MIMXRT1062 的定制板。 在自定义
    发表于 05-31 10:35

    OpenHarmony自定义组件介绍

    从父组件通过参数传递初始化子组件的成员变量,请参考状态管理。 自定义组件的参数规定 从上文的示例,我们已经了解,可以在build方法或者@Builder装饰的函数里创建
    发表于 09-25 15:36

    IAR下如何将程序拷贝RAM运行

    有时候我们需要将一部分程序从 FLASH 拷贝到 RAM 运行,以提高程序运行的速度。本文基于 IAREmbedded Workbench
    发表于 09-28 06:50

    matlab自定义函数调用的方法

    matlab自定义函数调用的方法 命令文件/函数文件+ 函数文件 - 多
    发表于 11-29 13:14 88次下载

    在Protel中自定义Title Block的方法

    详细介绍了在Protel中自定义Title Block的方法
    发表于 05-24 11:42 0次下载
    在Protel中<b class='flag-5'>自定义</b>Title Block的<b class='flag-5'>方法</b>

    1602自定义字符

    1602液晶能够显示自定义字符,能够根据读者的具体情况显示自定义字符。
    发表于 01-20 15:43 1次下载

    怎么样去开发自定义应用程序

    Atmel小贴士 如何开发自定义应用程序
    的头像 发表于 07-11 00:05 2156次阅读

    如何在IAR环境下将程序拷贝RAM中运行

    有时候我们需要将一部分程序从FLASH拷贝RAM中运行,以提高程序运行的速度。本文基于IAR Embedded Workbench列出了一
    发表于 11-15 17:38 11次下载
    如何在<b class='flag-5'>IAR</b>环境下将<b class='flag-5'>程序</b><b class='flag-5'>拷贝</b>在<b class='flag-5'>RAM</b>中运行

    自定义视图组件教程案例

    自定义组件 1.自定义组件-particles(粒子效果) 2.自定义组件- pulse(脉冲button效果) 3.自定义组件-progress(progress效果) 4.
    发表于 04-08 10:48 14次下载

    应用程序在崩溃时能启动自定义活动的OHOS库

    CustomActivityOnCrash 是一个 OHOS 库,允许在应用程序崩溃时启动自定义活动,而不是显示讨厌的“不幸的是,X 已停止”对话框。 CustomActivityOnCrash
    发表于 04-11 09:32 0次下载