这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » arm,thumb 工程模板中arm与thumb究竟是如何切换的?

共2条 1/1 1 跳转至

arm,thumb 工程模板中arm与thumb究竟是如何切换的?

院士
2006-09-17 18:14:16     打赏
arm,thumb 工程模板中arm与thumb究竟是如何切换的?



关键词: thumb     工程     模板     竟是     如何     切换    

院士
2006-12-22 22:43:00     打赏
2楼
问      
     。。。。

       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 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]