完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 Cresta 于 2014-12-25 23:28 编辑 本文来自飞思卡尔官方工程师分享的宝贵经验,希望对大家有帮助。在MDK中指定函数到具体的flash地址的作用是帮助:如果你这个函数自己经常修改的话,如果地址指定,可以到时候直接更新你函数所在的Flash区域就可以了。 本文和一下两篇内容为姐妹篇: FSL官方工程师经验:KL25在IAR中将函数指定到flash地址https://bbs.elecfans.com/jishu_463254_1_1.html FSL官方工程师经验:KL25在CW 10.5中指定函数到具体的flash地址https://bbs.elecfans.com/jishu_463256_1_1.html 一、描述 在之前的经验分享中写了些在KE02下,CW,IAR以及keil的编译环境中,如何定义constant到指定的flash地址。但是实际上,大家在使用我们kinetis的过程中,可能也希望能够灵活的将某个函数直接定义到指定的flash地址,这样,如果改变这个函数,实际上,只需要改变函数所在的flash,而不需要更新所有的flash。所以,为了方便大家操作,我们论坛里已经推出了在CW以及IAR下,如何指定函数到具体的flash地址,本文就讲解下,在MDK的环境下如何实现指定函数到具体的flash地址。 二、在MDK环境下实现 该经验分享要在MDK中实现函数的绝对地址指定,一共有两点需要注意:scatter文件中函数绝对地址的开辟以及程序中将函数定义到定义的绝对地址处。 下面来仔细讲解这两点 1.在.sct文件中定义函数要存放的地址 .sct文件可以在工程的UV4Build文件夹中找到,找到后可以拖进MDK界面中即可以打开,可以使用如下格式定义这个地址:
例如,在本次试验中,希望将函数定义到flash地址:0x0001E000这个地址,靠近flash空间的尾部。实际我们的定义如下图: 另外,每次编译之后,编译器都会重新生成.sct文件,所以为了避免写的代码被刷掉,需要做一些配置,禁止使用编译器每次生成的.sct文件,而是使用指定的.sct文件。修改方法:project->options for target->linker, 不勾选 use memory layout from target dialog. 如下图所示: 这样,你每次修改后的platinum_flash.sct在编译之后就不会被改变掉了。 2、在主函数中定义函数 接下来要做的就是将所定义的函数放到1里面所定义的flash地址段中。 举例定义如下:
此时,这个函数就直接放到了0x001e000地址。 3、测试结果 本次试验的平台是FRDM_KL25,所使用的MDK平台版本为:V5.10.0.2。代码修改是基于KL25_SC的platinum工程上修改的。 测试结果分两部分进行,第一部分是在进入debug的状态下,查看memory。 第二部分是在生成的hex文件中查看。 在测试之前,首先讲一下MDK hex文件生成配置,以及hex文件格式。 (1) MDK环境下hex生成配置 在工程中选择project->options for target->output,勾选Create HEX file,点击ok。如下图: (2)hex文件格式 文件格式为: 起始符“:” 数据长度(1B) 存储地址(2B) 数据类型(1B) 数据(16B) 校验码(1B) 这里举个例子: :1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 : :表示一行的开始 10:表示这一行包含的数据长度,一个字节 00C0:表示存储的地址,两个字节,这里是在flash的地址0x000000c0. 00:表示数据类型,一个字节,00为数据记录;01文件结束记录;02扩展段地址记录;04扩展线性地址记录。 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:代表具体的数据,这里数据都是FF,16个字节。数据的存储是高位地址在前,低位地址在后。 40:表示校验码,一个字节。校验码是0x100-这一行数据总和的低字节,然后取低一个字节。 (3)debug 的memory查看测试 编译后,进入debug,调出memory窗口,方法为:view->memory windows->memory 1, 然后在address中输入要查询的flash地址:0x0001e000,然后按下enter键。结果如下: 可以看到在0x0001e000这个地址的数据为: 29004601 2001DD01 20004770 0000E7FC (4)查看对应的hex文 编译工程之后,Hex文件在工程的buildkeilplatinumUV4Build中,打开后可以看到具体的hex内容,找到地址为E000的地方,可以看到结果如下: 即结果为: 01460029 01DD0120 70470020 FCE70000 和窗口memory中的数据: 29004601 2001DD01 20004770 0000E7FC 相比hex的数据正好是高位地址在前,低位地址在后。 其实这一串数据就是上面定义的char funcInROM(int flag)的十六进制码,可以看到确实是在我们指定的flash地址中,实现了IAR环境下,函数的flash地址指定。 如果屏蔽掉主函数的地址指定: char funcInROM(int flag)__attribute__((section("funflash"))); 会发现,实际上这个函数会被编译器分配到hex的0x0424处,而0XE000处没有相关的函数代码。 三、附件 附件提供了本文的PDF,以及测试代码。
KL25_MDK_funflash.rar
(1.29 MB, 下载次数: 130
)
【经验分享】KL25在MDK中将函数指定到flash地址.pdf
(322.07 KB, 下载次数: 103
)
四、对部分问题的说明 有童鞋反应文章里把函数定义到flash地址:0x0001E000 这样做,试想一下,其他的函数也是定义在以0x0001E000为地址的同一个扇区(或者页)里面 另外,擦除flash,不支持逐个字节擦除,而是整个扇区一起被擦除,甚至是整个页被擦除,那么其他的函数也不就是也被擦除了么??? 说明一下:这里只是举个例子,如果你函数指定具体位置,自己肯定要考虑扇区擦除的问题,最好空出自己的需要用的扇区。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
1912个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36362 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
4400 浏览 0 评论
6055 浏览 1 评论
6765 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4217 浏览 0 评论
620浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
618浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
609浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
695浏览 2评论
799浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 01:11 , Processed in 0.960338 second(s), Total 46, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号