如何在Keil中使用GNU原子内存访问功能

时间:2019-04-15 13:04:24

标签: c keil

我想使用__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中包含一些头文件还是添加一些配置?

1 个答案:

答案 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()的调用。很奇怪。