共2条
1/1 1 跳转至页
arm,thumb 工程模板中arm与thumb究竟是如何切换的?
问
。。。。
BL InitStack ;初始化堆栈 Initialize the stack
LDR R0,=CODEBX
BX R0
CODE16
CODEBX
BL TargetResetInit ;目标板基本初始化ize the target board
BX PC
CODE32
;跳转到c语言入口 Jump to the entry point of C program
B __main //此时还处于ARM模式,怎么跳到main函数里后就切换到了 thumb 模式
_sys_exit
。。。。。
以上是模版Thumb Executable Image for lpc2200中的代码
单步执行程序时 执行到 B __main 时处理器还处在ARM模式
怎么一跳到main函数后就变成了thumb模式 这是如何切换过来的? 切换不是应该用 BX __main 指令吗?
答 1: 应该是用BX来切换的,你再仔细跟踪一下代码。BX跳转时,根据地址的A0位来决定是ARM还是THUMB。 答 2: 单步跟踪 B __main 进入了汇编程序,单步走 怎么走也走不到 c语言的main()函数,而是在做一个汇编循环。真是晕??????连续运行就可到main (此时已经神秘的切换到了thumb模式)
晕????????????????????????
zlg 的工程模版很多比如:Thumb ARM Interworking Image for lpc2200
ARM Executable Image for lpc2200
Thumb Executable Image for lpc2200 .....等等
打开了一个工程怎样知道他是由哪一个模版创建的呢?
通过编译器 连接器的设置能看得出来吗? 答 3: 那个循环应该是内存初始化的。再下去一点应该就到了。你在循环下面设置断点,然后全速,运行到断点,之后再单步跟踪。 答 4: 刚看了下__main的作用,发现和bootloader的功能似乎重叠了:
Initializing the execution environment and executing the application
The entry point of a program is at __main in the C library where library code does the
following:
1. Copies nonroot (RO and RW) execution regions from their load addresses to their
execution addresses.
2. Zeroes ZI regions.
3. Branches to __rt_entry.
If you do not want the library to do this, you CAN define your own __main that branches
to __rt_entry as in Example 4-1.
Example 4-1 __main and __rt_entry
IMPORT __rt_entry
EXPORT __main
ENTRY
__main
B __rt_entry
END
上面这个例程的__rt_entry才是比较重要的,也许我们应该把B __main直接改成B __rt_entry。不知道我这想法对不? 答 5: 单步跟踪发现单步跟踪发现 就是从下面的语句 bleq __rt_entry 跳到c语言的main()函数的,在跳到main之前该语句被执行了多次(4次吧) 这很不好理解??为什么最终是这条语句跳到了main()且把处理器模式从ARM切换到thumb? 而不是一条 bx ... 之类的语句跳到main而切换到thumb呢?
[0xe1520003] cmp r2,r3
[0x0b00006f] bleq __rt_entry
答 6: 请大家关注,这个问题已搞得我寝食难安,肝肠寸断。
。。。。
BL InitStack ;初始化堆栈 Initialize the stack
LDR R0,=CODEBX
BX R0
CODE16
CODEBX
BL TargetResetInit ;目标板基本初始化ize the target board
BX PC
CODE32
;跳转到c语言入口 Jump to the entry point of C program
B __main //此时还处于ARM模式,怎么跳到main函数里后就切换到了 thumb 模式
_sys_exit
。。。。。
以上是模版Thumb Executable Image for lpc2200中的代码
单步执行程序时 执行到 B __main 时处理器还处在ARM模式
怎么一跳到main函数后就变成了thumb模式 这是如何切换过来的? 切换不是应该用 BX __main 指令吗?
答 1: 应该是用BX来切换的,你再仔细跟踪一下代码。BX跳转时,根据地址的A0位来决定是ARM还是THUMB。 答 2: 单步跟踪 B __main 进入了汇编程序,单步走 怎么走也走不到 c语言的main()函数,而是在做一个汇编循环。真是晕??????连续运行就可到main (此时已经神秘的切换到了thumb模式)
晕????????????????????????
zlg 的工程模版很多比如:Thumb ARM Interworking Image for lpc2200
ARM Executable Image for lpc2200
Thumb Executable Image for lpc2200 .....等等
打开了一个工程怎样知道他是由哪一个模版创建的呢?
通过编译器 连接器的设置能看得出来吗? 答 3: 那个循环应该是内存初始化的。再下去一点应该就到了。你在循环下面设置断点,然后全速,运行到断点,之后再单步跟踪。 答 4: 刚看了下__main的作用,发现和bootloader的功能似乎重叠了:
Initializing the execution environment and executing the application
The entry point of a program is at __main in the C library where library code does the
following:
1. Copies nonroot (RO and RW) execution regions from their load addresses to their
execution addresses.
2. Zeroes ZI regions.
3. Branches to __rt_entry.
If you do not want the library to do this, you CAN define your own __main that branches
to __rt_entry as in Example 4-1.
Example 4-1 __main and __rt_entry
IMPORT __rt_entry
EXPORT __main
ENTRY
__main
B __rt_entry
END
上面这个例程的__rt_entry才是比较重要的,也许我们应该把B __main直接改成B __rt_entry。不知道我这想法对不? 答 5: 单步跟踪发现单步跟踪发现 就是从下面的语句 bleq __rt_entry 跳到c语言的main()函数的,在跳到main之前该语句被执行了多次(4次吧) 这很不好理解??为什么最终是这条语句跳到了main()且把处理器模式从ARM切换到thumb? 而不是一条 bx ... 之类的语句跳到main而切换到thumb呢?
[0xe1520003] cmp r2,r3
[0x0b00006f] bleq __rt_entry
答 6: 请大家关注,这个问题已搞得我寝食难安,肝肠寸断。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
Let'sdo第3期任务合集被打赏50分 | |
与电子爱好者谈读图四被打赏50分 | |
Let‘s do 第三季 [电子测光表] 基础任务和进阶任务成果展示被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 |