0

我在 threadx 的移植中看到,在每个线程堆栈的顶部都有保留的未初始化字节,然后是 16 个零字节,然后堆栈才真正开始。

零字节称为backtrace。在 arm 端口,它是 4 个字节未初始化和 4 个零(例如这里),而在 ARC 端口,两者都是 16 字节大小(例如这里)。

更重要的一件事是,如果未定义TX_DISABLE_STACK_FILLING,则未初始化的字节将初始化为 0xef 。

我的问题是:

  1. 为什么 ARC 移植和 ARM 移植之间存在差异?
  2. 为什么这些字节存在?算法中是否有使用这些字节的跟踪工具或其他东西,或者它们只是为了在内存中“手动”查看该内存没有改变?
4

1 回答 1

1

是的,ARM 和 ARC 端口非常不同,即不同的汇编代码、编译指示、内在函数等。同样值得注意的是,不同的开发工具也在发挥作用。例如,ARC的主要开发工具是MetaWare(编译器/调试器),而在ARM上有IAR、ARM、GCC等。

至于堆栈回溯,这通常设置为调试器可以在当前线程代码中存在执行停止或断点时创建调用树。回溯字节模式有效地表示堆栈的顶部,并向调试器发出信号以停止构建调用树。当然,这是每个特定于调试器的,在本例中是 MetaWare 调试器和 ARM 工具调试器之间的区别。至于堆栈上的 0xEF 模式,这对于开发人员的视觉检查很有用。ThreadX 中的运行时堆栈检查功能也使用该模式(请参阅 ThreadX 用户指南文档)。此外,IAR 和 MetaWare 调试器能够通过检查每个线程堆栈中的 0xEF 模式腐蚀来计算堆栈使用情况,并将这些非常有用的信息提供给开发人员。

于 2020-07-20T19:50:05.940 回答