c - 如何在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中包含一些头文件还是添加一些配置?
解决方案
我不是专家,但链接似乎是关于 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()
诡异的。
推荐阅读
- javascript - Javascript拖放元素
- lua - 零检查,最好的方法?
- c++ - 尝试在 C++ 中对数字列表进行排序
- database - 热分区期间的 Dynamodb 按需成本和扩展(自适应扩展)
- c# - 在 Outlook VSTO C# 中捕获“单击回复/全部回复”事件
- asp.net-mvc - 如何在控制器中获取验证错误?
- node.js - 如何按日期对数据进行排序(json)
- dns - 我如何在谷歌应用引擎中使用自定义域?
- c# - 如何从 asp.net core 中的多个项目中获取用于媒体上传的公共项目的路径
- ios - LocalNotification 不工作 [IOS] - PushNotificationIOS