gpt4 book ai didi

启用功能时代码行为不当(可能的大小限制)

转载 作者:太空宇宙 更新时间:2023-11-04 00:08:25 26 4
gpt4 key购买 nike

我知道这个话题很模糊....所以我会试着解释一下。

我正在 IAR Workbench 中处理一个项目。我已经到了这样的地步,如果我添加一个新功能,比如一个简单的 if 语句,整个代码结构就会崩溃。代码可以正常编译并下载到 8051 设备,但在代码启动序列的中途,我失去了连接。就好像发生了堆栈溢出。如果我暂停调试器,我会看到我的 XdataStack 和 IdataStack 值很低(低于 50%),并且没有要报告的堆栈溢出。

事实上,导致问题的代码甚至没有被应用程序调用。

如果我启用代码中的调试#define 常量,这一点会更加明显。启用此功能会导致将更多字符串常量内置到用于 uart 调试的代码中。

我执行的另一个测试是在一个已经存在的函数中创建一个包含 100 个字符的数组

char hello[100];
memset(hello, 0x00, 100);

这似乎也破解了代码。

我想知道是否有我应该查看的内存区域,看看我是否已经填满了这个设备(具有 128Kb 闪存大小的 CC2540)

IAR 让我调查:

  • 伊达塔
  • 数据
  • 瑞士法郎
  • 逻辑代码
  • 代码
  • 数据
  • 数据

就我的项目配置而言:

筹码量:

  • IDATA: 0xC0
  • PDATA: 0x00
  • 外部数据:0x280

堆大小:

  • 外部数据:0xFF
  • 远:0xFFF
  • Far22:0xFFF巨大的:0xFFF

最佳答案

It's as if there is a stack overflow happening.

这在 8051 中不太可能,因为堆栈的使用不是很频繁。如果没有有效的间接寻址模式,它主要限于保存返回地址(由 MCU 自动管理)和保存的寄存器(主要在 ISR 中)。

Another test I performed was to created an array of 100 chars in a function that already existed [...] And this also seems to break the code.

您的代码基本上等同于:f() { static char hello[100]; ... 编译器管理所有带有覆盖的“局部”变量,以便这 100 个字节仅在 f() 执行时安全使用。这只有在编译器可以判断在执行 f() 时可能调用哪些函数时才有效。如果编译器对调用树的分析是错误的,它会导致局部变量(包括函数的参数需要太多参数以传递到寄存器中)以意想不到的方式被覆盖。

编译器应该足够聪明,可以将 main() 和所有 ISR 视为独立调用树的根。它很容易被计算的跳转、通过函数指针调用以及 RTOS 中的“任务”等概念所愚弄。例如,如果您使用函数指针,则必须告诉编译器(可能作为链接器选项)所有可能从通过指针调用的函数中调用的函数。

关于启用功能时代码行为不当(可能的大小限制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13576497/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com