我正在使用基于cortex-a8 cpu的am3352芯片。
我发现有兴趣LR(返回寄存器)的值有误。
这里。它是程序的切入点。
PC存储0x805E535C …
由于您只显示了一些截图而不是完整的代码,我只能推测......
的 屏幕截图1:入口点 强>
除了Windows或Linux之外,微控制器的程序不应该从中返回 主要() 。无处可去。为了防止进一步损坏, LR 指向无限循环。如果你意外地从中返回,那就是程序流程会发生的地方 主要() 。
的 屏幕截图2:IntAINTCInit() 强>
没有问题。
的 截图3:PC = LR 强>
LR 包含输入函数时的返回地址。如果函数调用其他函数,则必须保存 LR (通常在堆栈上)并为其分配一个新值。屏幕截图显示了声明后的状态:
char name_utf8[40] = {0};
如果查看汇编代码,可以看到 memset的 被调用来将40个字节初始化为0.所以确实调用了另一个函数,屏幕截图显示了从返回后的状态 memset的 。每次函数刚刚返回时, 个人计算机 必须平等 LR 因为这就是回报的运作方式。所以一切都很好。
的 屏幕截图4:DNMManager_GetName 强>
屏幕截图显示了进入时的状态 DNMManager_GetName() 。该函数的调用是由以下声明完成的:
805AFECC bl DNMManager_GetName
调用后的语句(需要返回的地方)是0x805AFED0,是什么 LR 包含截图。
请注意,C代码中的单行导致两个函数调用,一个到 DNMManager_GetName() 和一个 的memcpy 。 0x805AFEE4将是第二个函数调用的返回地址。但屏幕截图4显示了第一个函数调用的状态。