我想使用像__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中包含一些头文件或添加一些配置吗?
发布于 2019-04-15 21:08:32
我不是专家,但链接似乎是关于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的引用。
所以看起来凯尔在追踪一个相当老的版本的GCC?另一方面,我确实在列表中看到了__sync_fetch_and_add(),我猜如果在32位数量上使用,它会“神奇地”生成对__sync_fetch_and_add_4()的调用。真奇怪。
https://stackoverflow.com/questions/55689820
复制相似问题