2013-05-06 48 views
0

我正在开发一个应用程序,我使用IAR Embedded Workbench解决方案进行编译。在这种应用中,我已经嵌入了expat库 - 一个很小的XML解析器工作正常 - 它使用time()标准函数生成盐,你可以在此块的代码中看到:bpkt ARM指令冻结了我的嵌入式应用程序

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

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

所以我碰到time()功能的汇编代码 - 这实际上似乎是由IAR一个专有实现 - 并且看到这个单指令:

BPKT #0xab 

通过网页查找信息,我来与以下段落:

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

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

对于您的信息,无论您可能传递给time()的参数如何,在非半主机模式下它总是处于冻结状态。

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

感谢

+2

BKPT会将cpu置于调试模式,您需要找到一种方法来使构建不同以摆脱它。 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/CIHEDHIF.html – auselen 2013-05-06 09:53:29

+0

对我来说,这听起来像一个'assert'或类似的射击。您的BSP(板卡支持包)是否可能没有实现'时间'的必要功能,因此时间说“抱歉不能这样做”。 – 2013-05-06 10:05:31

+0

您是否尝试在发布模式下编译代码?也许这会使BKPT指令消失。 – Adi 2013-05-06 11:57:31

回答

1

你说的没错,这个断点指令被用来触发某种半主机操作的。如果你的代码包含这样的指令,你需要总是运行它连接到一个调试器,该调试器在遇到这样的指令时知道该怎么做。如果您需要单独运行设备,请查明您使用的代码是否会导致半主机操作发生,并确保代码不在独立版本中。这种情况是设置软件的“调试”和“发布”版本的好机会 - 可能使用#ifdef DEBUG或这些行中的内容从发布版本中排除半主机代码。

在这种具体情况下,它看起来像你的C库的time实现使用半主机,并得到了调试器连接的主机的时间。如果你想从调试器中断开你的程序,你必须想出一个不同的解决方案。