Éti*_*nne 5 assembly arm bare-metal
我有一个用于汇编的裸机ARM的启动代码,我试图了解它是如何工作的.二进制文件写在一些外部Flash中,并在启动时将其自身的一部分复制到RAM中.即使我读过这个维基百科条目,我仍然没有在这种情况下完全获得重定位的概念.RAM映射到低地址窗口,闪存在高地址窗口中.有人可以向我解释为什么我们在这里测试链接寄存器的值吗?
/* Test if we are running from an address, we are not linked at */
bl check_position
check_position:
mov r0, lr
ldr r1, =check_position
cmp r0, r1 /* ; don't relocate during debug */
beq relocated_entry
Run Code Online (Sandbox Code Playgroud)
我的猜测是应用程序从RAM中运行,调试应用程序时,这个作者也许是使用某种引导程序和或JTAG的直接加载测试程序到RAM中,因此没有理由复制和运行(这可能导致崩溃).
你会做这样的事情的另一个原因是避免无限循环.例如,如果您想从闪存(通常必须)启动但是从ram执行,最简单的方法是将整个闪存或整个闪存的一部分复制到ram并且只分支到ram的开头.当你这样做意味着你再次点击"将应用程序复制到ram and branch"循环,以避免它第二次(这可能会让你崩溃),你有一些我从flash运行这个循环或不测试.
| 归档时间: |
|
| 查看次数: |
1794 次 |
| 最近记录: |