原创 Kinetis L系列的启动过程及其实现(二)

2013-8-5 14:51 2458 16 17 分类: 消费电子

Kinetis L系列的启动过程及其实现(二)

 

(7) 编译器放置 __startup 的ADDRESS 与真实程序入口点


质朴的思路就是, 作为初始代码, __startup 的 ADDRESS 应该位于 0x000000C0.


事实上不是, 我们假设这完全取决 linker 的安排, 包括运行效率, SIZE的共同优化与平衡的考虑. 实际上, 0x000000C0 是 main() 函数的首地址(见图例13).

分析的依据来源于我们生成的 Linker list 文件, 事实上它被表达为 .MAP 文件.

[图例11: .MAP 文件与各函数入口点LIST]

11.jpg



从源代码编译的 list 文件中, 对应的机器码为:

[图例12: 源文件编译后的 .list文件]

12.jpg


注意到 THUMB 的方式为 16-bit 机器码.


从 __startup 对应的地址: 0x00000129, 我们找到对应的机器码, 并进行标识(见图例13).

从 .bin 文件中, 我们读取 PC 的地址是: 0x0000181, 这说明真正的程序入口点在此,


参考 .MAP 文档, 0x00000181 address 对应程序入口点为: _iar_program_start.

[图例13: 程序入口点在 0x00000180 也就是 IAR IDE 默认生成的 _iar_program_start 函数处]

13.jpg

事实上, 我们进入 debug 后, 顺序执行, 我们将分析到:

_iar_program_start -> _main -> _call_main -> main  的过程.
这与我们设计的程序入口点的初衷并不一致. 我们希望程序进入的是 __startup 执行 BOOT 的过程.

 

(8) 修改程序入口点为 __startup


修改 Project 增加 vectors.h 与 vectors.c 文件
分析 linker 脚本语言, .intvec 被定义在 __ICFEDIT_intvec_start__ (也就是首地址 0x00000000).


分析 vectors.c 将异常中断向量表写在了 .intvec 的位置.


分析 vectors.h 决定了中断向量表中第二个量 VECTOR_001 被定义为 __startup, 也就是我们成功将 IAR 默认 _iar_program_start  为 __startup

[图例14: 从linker config 到 vector.c/vector.h]

14.jpg

最终的, 我们从生成的 .bin 文件中, 确认 PC 指向了新的入口点: 0x00000129, 也就是 __startup

[图例15: 新的 .bin 文件证明程序入口点现在是: __startup]

15-1.jpg

在 debug 中进行调试, 我们也确认单步调试进入了 __startup.

 

(9) 构建C代码 start() 函数执行 SYSTEM SETUP


在步骤(4)中, 我们完成了 .s 汇编函数 __startup, 根据 vectors.h 的定义, 指示这是 PC 指针的"入口点". (事实上, 如上对 .bin 文件和.map 文件分析, IAR 通过 _iar_program_start 实现的是真正的入口点. 我们猜测, 这里不影响我们对这个 "赝程序入口点 __startup" 的理解).


在 __startup 中, 我们清零通用寄存器, 并开启中断后, 跳转至 start() 函数, 也就进入了 SYSTEM SETUP 的过程.

(9.1) Disable watchdog


在 debug mode 下我们会没有机会喂狗, 因此 watchdog 需要disable.

如果没有做 disable, 我们将在 debug mode 下见到不断重启的提示. 进行 diable 后该现象消失.

[图例16: 在 SYSTEM BOOT 中需要 disable watchdog]

16-1.jpg
 

(9.2) Init RAM


包括 (a) 从 flash copy 向量表 to RAM. 我们至少能够作两个功能假定: 首先这个 copyto 过程, 能够保证我们从 RAM BOOT 成功(假设我们有从 RAM BOOT 的需求, 比如说某种机制下的 upgrade firmware). 其次可以想象 Interrupt 的响应速度增加(在 RAM 中寻址而不必从 FLASH 中读取). (b) 初始化数据从 flash copyto RAM. (c) data section 的 zero 初始化数据清零. (d) copy flash 中定义的 ram function 到 RAM(如果它们因某种加速目的或者 IAP 目的存在且被我们所定义).

[图例17: 在 Start() 中完成 Init RAM]

17.jpg



Tip1: 有时我们无法在C源文件中加入调试断点


我们在调试的过程中, 偶尔有问题为何可以在反汇编窗口调试, 但是 breakpoint 却无法建立在c语言的源代码中, 这里我们需要选中 IAR IDE 的 Options -> C/C++ compiler -> Output -> Check "Generate Debug Information" 即可.


可能有调试者会宣称 .out 文件(用于下载到 target board 进行调试) 会显著增加, 但是, 毕竟 .bin 文件不会因为这个 check 而发生任何变化.
 

Kinetis L系列的启动过程及其实现(一)

Kinetis L系列的启动过程及其实现(二)

Kinetis L系列的启动过程及其实现(三)

 

文章评论1条评论)

登录后参与讨论

用户1610239 2013-8-5 09:06

很好的资料啊
相关推荐阅读
allen_zhan 2023-02-27 19:08
对"三极管"译名由来的探讨
想讨论一个有意思的话题:今天中国大陆的电子业界, 为何将 BJT 称呼为 "三极管"? 或因其象形, 前辈自行进行随意的不严谨定义么? 带着疑问我们做了一下延伸查阅, 或得出这样的结论, 即中译名"三...
allen_zhan 2023-02-19 18:15
对知乎提问"为何三极管的一个PN结工作在反偏"的回复
将这个回复, 也发表在博文中, 作为自己的一个学习笔记叭.知乎问题: "三极管里面的PN结相当于二极管,为什么里面PN结加反向电压也能导通?"我的回复:首先, 二极管的"反向"概念, 容易给初学者某种...
allen_zhan 2023-02-18 10:17
从肖特基二极管到PN结与三极管
最近数个工作日的兴趣是回顾电子基础器件的发明/发展历史, 期待夯实技术基础的底蕴. 在学习与搜索资料的过程中, 顺便对知乎的一个同学的基础问题, 进行了回复. 不小心回复一下就成了千字文, 觉得挺有趣...
allen_zhan 2023-01-28 11:53
微功率 ISM 频率探讨相关文档组总结
不知不觉, 自开启关于微功率频率的话题起, 即从第一份文章写就到今天总结之日, 已经接近 10 个工作日左右. 早先的想法是对工程界未来的微功率设备相关项目, 从项目规划开始, 对选择系统, 频率, ...
allen_zhan 2023-01-27 22:50
关于 LoRa 应用场景的讨论
说明: 本文中斜体部分表示来自公告文件的部分内容剪贴或合并整理.1. "第52号文" 对 470MHz 的约束引自 如下:(四)民用计量仪表限在建筑楼宇、住宅小区及村庄等小范围内组网应用,任意时刻限...
allen_zhan 2023-01-25 13:24
ISM 频段中 2.4G 与 5.8GHz 设备的使用与限制
说明: 本文中斜体部分表示来自公告文件的部分内容剪贴或合并整理.1. ISM 频段定义中的 2.4G 与 5.8GHz正如同 文中确定的, 2.4G, 5.8GHz 属于中国大陆 ISM 频段的定义...
我要评论
1
16
关闭 站长推荐上一条 /2 下一条