我想使用__sync_fetch_and_add
之类的GCC内置函数,但是我用Keil编译我的代码,如果我在代码中使用这些函数,它将显示如下错误:
Error: L6218E: Undefined symbol __sync_fetch_and_add_4 (referred from XXXX.o).
我发现Keil's documents中有一些关于GNU atomic memory access functions
的描述,所以我猜keil可能支持这些功能,但是我不知道如何使用它们。我应该在keil中包含一些头文件还是添加一些配置?
答案 0 :(得分:0)
我不是专家,但是链接似乎与ARM DS-5有关,后者是一个单独的编译器,即与Keil的MDK不同。因此该文档不适用。
实现这些功能并不困难。如果其他所有方法都失败了,我将查看GCC的编译器输出,然后重新实现它。
或者阅读LDREX
/ STREX
指令以及有关内存障碍的指令,并尽享乐趣! :)
UPDATE :我认为__sync_fetch_and_add_4()
是新的,但Keil仅支持GCC的较旧的内置套件。请注意,__sync_fetch_and_add_4
并未出现在他们说支持的功能列表中。 This GCC manual page说:
在GCC 4.7之前,使用了较旧的
__sync
内部函数。在不受支持的主机上使用__sync_fetch_and_add
导致的未定义符号的示例是缺少对__sync_fetch_and_add_4
的引用。
所以Keil似乎正在跟踪旧版本的GCC?另一方面,我确实在列表中看到了__sync_fetch_and_add()
,并且我猜想如果将其用于32位数量,则会“神奇地”生成对__sync_fetch_and_add_4()
的调用。很奇怪。