共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 |