痞子衡嵌入式:在IAR开发环境下手动拷贝自定义程序段到RAM中执行的方法
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是IAR下手动拷贝自定义程序段到RAM中执行的方法。
在痞子衡旧文 《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-EVK\boards\evkmimxrt1170\demo_apps\hello_world\cm7\iar 例程( flexspi_nor_debug build)为例,将其 SysTick_DelayTicks() 函数放到自定义程序段 UserRelocateCode 里,写法如下:
#pragma location = "UserRelocateCode"
void SysTick_DelayTicks(uint32_t n)
{
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 <Block>
Initializer bytes const 0x3000'6800 0x10 <for UserRelocateCode-1>
"P10": 0x10
UserRelocateCode 0x6000'0000 0x10 <Block>
UserRelocateCode-1 0x6000'0000 0x10 <Init block>
UserRelocateCode inited 0x6000'0000 0x10 led_blinky.o [7]
- 0x6000'0010 0x10
三、手动拷贝自定义程序段
上一节我们在映射文件里看到 UserRelocateCode_init 段的出现,这其实 IAR 的默认规定,可在 \IAR Systems\Embedded Workbench 9.30.1\arm\doc\EWARM_DevelopmentGuide.ENU.pdf 文档找到相应规则,即重定向的自定义段,其初始化值将被放到名为原自定义段名 + _init 后缀的段里。
一切准备就绪,拷贝代码的实现还是比较简单的,下面是示例拷贝函数 user_code_init()。有了它,我们就可以在 main 函数里自由决定其调用位置了。
#pragma section = "UserRelocateCode"
#pragma section = "UserRelocateCode_init"
void user_code_init(void)
{
uint8_t *dest_start, *src_start, *src_end;
uint32_t codebytes;
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++;
}
}
int main(void)
{
psram_init();
user_code_init();
// 代码省略...
}
至此,IAR下手动拷贝自定义程序段到RAM中执行的方法痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。
痞子衡嵌入式:在IAR开发环境下手动拷贝自定义程序段到RAM中执行的方法的更多相关文章
- 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...
- 痞子衡嵌入式:在MDK开发环境下将关键函数重定向到RAM中执行的几种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在MDK开发环境下将关键函数重定向到RAM中执行的几种方法. 这个关键函数重定向到 RAM 中执行系列文章,痞子衡已经写过 <IA ...
- 痞子衡嵌入式:MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法. 前段时间痞子衡写了一篇 <在IAR开发环境下将关键函数重 ...
- 痞子衡嵌入式:在IAR开发环境下RT-Thread工程函数重定向失效分析
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下RT-Thread工程函数重定向失效分析. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...
- 痞子衡嵌入式:在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...
- 痞子衡嵌入式:在IAR开发环境下为工程开启CRC完整性校验功能的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下为工程开启CRC完整性校验功能的方法. CRC校验在嵌入式领域里的应用非常广,比如在通信领域,CRC检验值可以作为数据 ...
- 痞子衡嵌入式:IAR内部C-SPY调试组件配套宏文件(.mac)用法介绍
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR内部C-SPY调试组件配套宏文件(.mac)用法. 痞子衡之前写过一篇 <JLink Script文件基础及其在IAR下调用 ...
- 痞子衡嵌入式:大话双核i.MXRT1170之在线联合调试双核工程的三种方法(IAR篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170下在线联合调试双核工程的方法(基于IAR). 前段时间痞子衡写过一篇<双核i.MXRT1170之单独在线调试从 ...
- 痞子衡嵌入式:IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致(J-Link / CMSIS-DAP)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致. 做Cortex-M内核MCU嵌入式软件开发,可用的集成开发环境( ...
- 痞子衡嵌入式:其实i.MXRT下改造FlexSPI driver同样支持AHB方式去写入NOR Flash
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT下改造FlexSPI driver以AHB方式去写入NOR Flash. 痞子衡前段时间写过一篇 <串行NAND Fl ...
随机推荐
- Powe AutoMate: 条件判断语句
大纲 学习使用条件判断语句 使用条件判断 功能描述 判断用户输入的年龄,并显示对应的信息 使用if 判断是否是未成年人: 使用else if 判断大于18岁,小于28岁的人群 运行效果 使用else ...
- vs code 上传代码到码云
git init //初始化git仓库 git add . //添加所有文件到git暂存区 git add README.md(如果项目中没有这个文件,会在后面几个操作中报错,解决方法是通过命令合并: ...
- (转)[Android测试] Android Studio+Appium+Java+Windows 自动化测试之二:Appium环境安装搭建
一.需要下载安装的东西 1. 文件下载 网上也有挺多安装教程的,这里我提供我的安装方法.Win10 64位.一些文件我在后面打包. 2016.9.12号本人安装记录. SDK: 由于我是搞Androi ...
- el-date-picker 在表单中宽度(width)问题
在使用element-plus的日期选择组件 el-date-picker的时候,发现form表单内的日期选择框并不能跟el-input 一样把宽度撑满.而是要小一圈. 这样在排版中显得不太整齐,但是 ...
- SpringBoot 启动流程追踪(第二篇)
上一篇文章分析了除 refresh 方法外的流程,并着重分析了 load 方法,这篇文章就主要分析 refresh 方法,可以说 refresh 方法是 springboot 启动流程最重要的一环,没 ...
- 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(2)
在前面随笔<循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(1)>中介绍了Mvvm 的开发,以及一些界面效果,本篇随笔继续深入探讨 ...
- Visual Studio 2022 设置代码补全
Visual Studio 2022 设置代码补全 VS默认使用 Tab 键进行代码补全. 若要使用回车补全需要重新设置,具体路径如下: 工具----选项----文本编辑器----C/C++--- ...
- Python基于Flask的高校舆情分析,舆情监控可视化系统
一.前言在当今社会,舆情监控越来越被重视.随着互联网技术的发展,我们从传统媒体渠道.官方报告.调查问卷等方式搜集到的舆情信息,逐渐被网络上的内容所替代.因为网络上的内容传播速度快.及时性强.覆盖范围广 ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-17-处理鼠标悬停
1.简介 有些测试场景或者事件,playwright根本就没有直接提供方法去操作,而且也不可能把各种测试场景都全面覆盖提供方法去操作.比如:就像鼠标悬停,一般测试场景鼠标悬停分两种常见,一种是鼠标悬停 ...
- stata中回归分析常用方法
// 按键盘上的PageUp可以使用上一次输入的代码(Matleb中是上箭头)// 清除所有变量clear// 清屏 和 matlab的clc类似cls // 导入数据(其实是我们直接在界面上粘贴过来 ...