bpkt ARM指令冻结了我的嵌入式应用程序

时间:2013-05-06 09:47:40

标签: c arm iar

我正在开发一个使用IAR Embedded Workbench解决方案编译的应用程序。在这个应用程序中,我嵌入了expat库 - 一个工作正常的小型XML解析器 - 它使用time()标准函数生成一个salt,正如你在这段代码中看到的那样:

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-的应用程序时,它根本不起作用链接调试器。

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

BPKT #0xab

通过网络搜索信息,我提出了以下段落:

  

如果需要,调试器可以使用它来存储其他信息   关于断点。 ARM不建议立即使用BKPT指令   为半主机以外的任何目的设置为0xAB的值。

是否是由于这样的问题?我必须承认我在ARM汇编程序方面的知识很差,而且因为我不能在半托管模式下调试我的应用程序,所以我很困惑。

对于您的信息,无论您传递给time()的参数如何,它都会在非半主机模式下冻结。

最后,为了绕过这样的实现,你能建议我做些什么?我可以将另一个导入我的C项目吗? ...

由于

1 个答案:

答案 0 :(得分:1)

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

在这个特定的情况下,看起来你的C库的time实现正在使用半主机来获取调试器连接上的主机时间。如果要将程序与调试器断开连接,则必须提出不同的解决方案。