我想使用像__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中包含一些头文件还是添加一些配置? 最佳答案
我不是专家,但链接似乎与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()
的调用。奇怪的。
关于c - 如何在Keil中使用GNU原子内存访问功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55689820/