我想使用像__sync_fetch_and_add
这样的GCC内置函数,但我用Keil编译我的代码,如果我在我的代码中使用这些函数,它将显示错误如下:
Error: L6218E: Undefined symbol __sync_fetch_and_add_4 (referred from XXXX.o).
我发现在GNU atomic memory access functions
中有一些Keil's documents的描述,所以我想keil可能支持这些功能,但我不知道如何使用它们。我应该包含一些头文件还是在keil中添加一些配置?
我不是专家,但链接似乎是关于ARM DS-5,它是一个单独的编译器,即与Keil的MDK不同。所以文档不适用。
实现这些功能并不是很难;如果所有其他方法都失败了,我会查看GCC的编译器输出,然后重新实现它。
或者阅读有关LDREX
/ STREX
指令和内存障碍的说明,并享受乐趣! :)
更新:我认为__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()
的调用。奇怪的。