【发布时间】:2018-01-15 22:47:41
【问题描述】:
我正在测试一些在 ARM7TDMI 中运行的简单代码,因为我还没有在 QEMU 上找到 ARM7TDMI 模拟器,所以我使用 Cortex-a8 代替(我不确定这是否会导致错误,完全是新手)。
这就是我运行 QEMU 的方式:qemu-system-arm -machine realview-pb-a8 -cpu cortex-a8 -nographic -monitor null -serial null -semihosting -kernel main.elf -gdb tcp::51234 -S
我要测试的代码很简单,函数LoadContext()和SaveContext()是IAR IDE用arm汇编写的,IAR IDE使用ARM7TDMI作为核心。我用 IAR 将这个程序集文件编译成一个目标文件,并将下面的代码链接到 arm-none-eabi-gcc,这会导致不可预知的错误吗? (只是想用 gcc 和 QEMU 代替 IAR...)
int main(void)
{
Running = &taskA;
Running->PC = task1;
Running->SP = &(Running->StackSeg[STACK_SIZE-1]);
LoadContext();
}
void task1(void)
{
register int reg_var = 1;
volatile int vol_var = 1;
SaveContext();
reg_var++;
vol_var++;
SaveContext();
reg_var++;
vol_var++;
LoadContext();
}
所以,当我在 gdb 中设置断点时,它不起作用,我认为它只会进入无限循环。我查看了初始化过程,是:
(gdb)
0x000082f6 in __libc_init_array ()
(gdb)
0x000080e2 in _start ()
(gdb)
0x000080e4 in _start ()
(gdb)
0x000080e6 in _start ()
(gdb)
main () at src/context-demo.c:12
12 int main(void) {
(gdb)
0x000081ea 12 int main(void) {
(gdb)
0x00000008 in ?? ()
(gdb)
0x0000000c in ?? ()
(gdb)
0x00000010 in ?? ()
(gdb)
0x00000014 in ?? ()
(gdb) c
Continuing.
^C
Program received signal SIGINT, Interrupt.
0x00000004 in ?? ()
(gdb) c
Continuing.
^C
Program received signal SIGINT, Interrupt.
0x00000004 in ?? ()
(gdb)
有人对这里发生的事情有任何想法吗?任何帮助表示赞赏,谢谢!
【问题讨论】:
-
你最终会到达 00000000 而不是你应该在的地方......
-
嗯...但它应该在循环中执行
SaveContext(); reg_var++; vol_var++; LoadContext();...并且它可以与 IAR 一起查找