我想使用像__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/

10-12 21:35