首页 > 解决方案 > 如何在keil中使用GNU原子内存访问函数

问题描述

我想使用 GCC 内置函数__sync_fetch_and_add,但是我用 Keil 编译我的代码,如果我在我的代码中使用这些函数,它会像这样显示错误:

Error: L6218E: Undefined symbol __sync_fetch_and_add_4 (referred from XXXX.o).

我发现Keil的文档GNU atomic memory access functions中有一些描述,所以我猜keil可能支持这些功能,但我不知道如何使用它们。我应该在keil中包含一些头文件还是添加一些配置?

标签: ckeil

解决方案


我不是专家,但链接似乎是关于 ARM DS-5,它是一个单独的编译器,即与 Keil 的 MDK 不同。所以文档不适用。

实现这些功能并不难。如果一切都失败了,我会查看 GCC 的编译器输出,然后重新实现它。

或者阅读LDREX/STREX指令和记忆障碍的指令,玩得开心!:)

更新:我认为__sync_fetch_and_add_4()是新的,但 Keil 只支持 GCC 的旧内置套件。请注意,__sync_fetch_and_add_4它没有出现在他们说他们支持的功能列表中。这个 GCC 手册页说:

在 GCC 4.7 之前,使用的是较旧的__sync内在函数。__sync_fetch_and_add在不受支持的主机上使用 的未定义符号的示例是缺少对__sync_fetch_and_add_4.

所以看起来 Keil 正在跟踪一个相当旧的 GCC 版本?另一方面,我确实在列表中看到 了,我猜“神奇地”会在 32 位数量上使用时__sync_fetch_and_add()生成调用。__sync_fetch_and_add_4()诡异的。


推荐阅读