0

我正在开发一个使用 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

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

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

是因为这样的问题吗?我必须承认我在 ARM 汇编器方面的知识很差,而且由于我无法在应用程序未处于半托管模式时对其进行调试,所以我很困惑。

供您参考,无论您传递给 的参数是什么time(),它总是在非半主机模式下冻结。

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

谢谢

4

1 回答 1

1

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

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

于 2013-05-07T18:01:03.037 回答