gpt4 book ai didi

c - bpkt ARM 指令卡住了我的嵌入式应用程序

转载 作者:行者123 更新时间:2023-11-30 15:49:10 29 4
gpt4 key购买 nike

我正在开发一个使用 IAR Embedded Workbench 解决方案编译的应用程序。在此应用程序中,我嵌入了 expat 库 - 一个运行良好的小型 XML 解析器 - 它使用 time() 标准函数生成盐,正如您在这段代码中看到的:

static unsigned long
generate_hash_secret_salt(void)
{
unsigned int seed = time(NULL) % UINT_MAX;
srand(seed);
return rand();
}

看来 time() 函数在半主机模式下工作正常(我猜是在使用 Segger 的 J-link JTAG 设备进行调试时),但当我运行我的程序时根本不起作用没有 j-link 调试器的应用程序。

所以我遇到了 time() 函数的汇编代码 - 它实际上似乎是 IAR 的专有实现 - 并看到了这条指令:

BPKT #0xab

通过网络查找信息,我想出了以下段落:

If required, a debugger can use it to store additional information about the breakpoint. ARM does not recommend the use of the BKPT instruction with an immediate value set to 0xAB for any purpose other than Semi-hosting.

是因为这样的问题吗?我必须承认我对 ARM 汇编程序的了解很差,而且由于我无法在非半托管模式下调试我的应用程序,所以我很困惑。

供您引用,无论您传递给 time() 的参数如何,它在非半主机模式下总是卡住。

最后,您建议我做什么才能绕过这样的实现?我应该将另一个导入到我的 C 项目中吗? ...

谢谢

最佳答案

你是对的,这个断点指令被用来触发某种半主机操作。如果您的代码包含此类指令,则需要始终将其附加到调试器来运行,该调试器知道遇到此类指令时该怎么做。如果您需要独立运行设备,请找出您正在使用的导致半主机操作发生的代码,并确保该代码不在独立版本中。这种情况是设置软件的“调试”和“发布”版本的好机会 - 可以使用#ifdef DEBUG 或类似的方法从发布版本中排除半主机代码。 p>

在这种特定情况下,您的 C 库的 time 实现似乎正在使用半主机通过调试器连接获取主机时间。如果您想在与调试器断开连接的情况下运行程序,则必须想出不同的解决方案。

关于c - bpkt ARM 指令卡住了我的嵌入式应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16396067/

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