C 代码中的内联汇编语句和适用于 ARM Cortex 架构的扩展 ASM

2023-12-05

我正在尝试编译以下两段代码ARM编译器5对于 Cortex A 微处理器:

Part 1:

static inline void cp15_write_sctlr(uint32_t value)
{
    asm("mcr p15, 0, %0, c1, c0, 0" :: "r"(value));
}

static inline uint32_t cp15_read_actlr(void)
{
    uint32_t actlr;
    asm("mrc p15, 0, %0, c1, c0, 1" : "=r"(actlr));
    return actlr;
}

Part 2:

static inline void dmb(void)
{
    asm("dmb" ::: "memory");
}

static inline void dsb(void)
{
    asm("dsb" ::: "memory");
}

static inline void isb(void)
{
    asm("isb" ::: "memory");
}

在这两种情况下我都会遇到编译错误。请参阅下面的示例。

line 64: Error:  #18: expected a ")"
    asm("dsb" ::: "memory");

该错误是由编译器版本(ARM编译器5)引起的,它不支持扩展Asm吗?

如果我重写代码Part 1如下,我没有收到任何错误。以下代码与第 1 部分中的代码等效吗?

static inline void cp15_write_sctlr(uint32_t value)
{
    __asm
    {
        MCR p15, 0, value, c1, c0, 0
    }
}

static inline uint32_t cp15_read_actlr(void)
{
    uint32_t actlr;
    __asm
    {
        MRC p15, 0, actlr, c1, c0, 1
    }
    return actlr;
}

如果编译器不支持扩展 Asm,我如何重写第 2 部分中的代码? 我想到了以下内容,但我不确定是否相同。

static inline void dmb(void)
{
    __schedule_barrier();
    __asm("dmb");
    __schedule_barrier();
}

static inline void dsb(void)
{
    __schedule_barrier();
    __asm("dsb");
    __schedule_barrier();
}

static inline void isb(void)
{
    __schedule_barrier();
    __asm("isb");
    __schedule_barrier();
}

任何帮助将非常感激。


该错误是由编译器版本(ARM编译器5)引起的,它不支持扩展Asm吗?

这是 GNU C 内联扩展 Asm 语法,所以显然不支持它的编译器会出错。


2016 年 GCC 变化 (PR24414) 给非空 Basic Asm 语句一个隐式的"memory"破坏,以及使它们隐式破坏"cc"在像 x86 这样的目标上,扩展 asm 就可以做到这一点。所以如果你的 GCC 版本足够新,我想你could能够在这里安全地使用 Basic Asm,假设未记录的 GCC 行为继续存在于未来的 GCC 版本中,以帮助编写得不好或旧的代码按照其可能的预期方式工作。 (假设这在 Keil 中实际上也是安全的,那里也有隐式内存屏障)。我不知道这会变成什么 GCC 版本

(跨 asm 语句存储和重新加载全局的试金石将告诉您在任何给定的 GCC 版本上它的行为如何。如果您看到寄存器值被重用asm("" ::: );(扩展时明确没有内存破坏)但不适用于asm("# comment");(非空 Basic),这意味着非空 Basic asm 语句具有隐式内存破坏。否则,您会期望获得与扩展相同的优化。这Godbolt 编译器资源管理器链接显示 GCC 6.4 确实notBasic asm 有一个隐式的 mem clobber,但 GCC7.1 有。

或者更好的是,你可以使用 CPP 宏#if检测错误的编译器并忽略::: "memory"它窒息的部分,假设它将 asm 语句视为具有内存破坏。或者检测__GNUC__ and __GNUC_MINOR__版本等,并使用它来检测任何声称与支持扩展 asm 的 GNU 方言版本兼容的编译器。


绝不能在 GNU C 的函数内部使用基本 Asm,即使对于像这样的指令dsb不读取或写入寄存器,因为没有书面保证订购 wrt。编译器生成的内存访问。https://gcc.gnu.org/wiki/ConvertBasicAsmToExtended。通常你应该只将它用于身体__attribute__((naked))函数,或在全局范围内。

Basic asm 没有什么优势;内联汇编是您永远不应该随意使用的东西,并且您可以使用 Basic 做任何事情,而不能在非裸函数中使用 Extended 显式做。 (实际上,您几乎无法使用 Basic 安全地执行任何操作:您无法安全地触摸寄存器,甚至无法安全地触摸内存中的全局变量(请参阅this,并且不保证可以订购。任何事物。)

因此,依赖于未记录的具有隐式基本 Asm 行为是很糟糕的"memory"破坏。隐式 mem clobber GCC 更改没有充分的理由(除了可能使旧的和/或坏的代码更有可能正常工作);在 GNU C 中,扩展 asm 来明确这一点总是更好。


Keil支持吗stdatomic.h for atomic_thread_fence(memory_order_seq_cst)发出无法与周围代码重新排序的“dmb”? (不过对 dsb 和 isb 没有帮助)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 代码中的内联汇编语句和适用于 ARM Cortex 架构的扩展 ASM 的相关文章

  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 无法使用 Ninject 将依赖项注入到从 Angular 服务调用的 ASP.NET Web API 控制器中

    我将 Ninject 与 ASP NET MVC 4 一起使用 我正在使用存储库 并希望进行构造函数注入以将存储库传递给其中一个控制器 这是实现 StatTracker 接口的上下文对象 EntityFramework public cla
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐

  • TLS 1.2 在 cURL 中不起作用

    我在卷曲使用 TLS1 2 的 HTTPS url 时遇到问题 在卷曲操作中 我将登录数据发布到网站并将其保存在 cookiefile 中 我收到的错误消息是这样的 error 14077438 SSL routines SSL23 GET
  • 使用 Python 读取 RTF 文件时出现欧元符号问题

    我需要使用 Python 和 pyRTF 生成 RTF 文档 一切正常 我对重音字母没有问题 它甚至接受欧元符号而没有错误 但不是 我得到这个标志 我用这种方式对字符串进行编码 x encode iso 8859 15 我用谷歌搜索了很多
  • 将大型 VB6 应用程序升级到 .NET。对VB迁移合作伙伴的看法

    我有一个非常大的 VB6 代码库 其中包含大量第 3 方控件 想要将其移至 NET 重写它是毫无疑问的 客户认为花钱获得同样的东西没有任何价值 使用内置升级向导迁移到 NET 基本上是不可能的 有没有人尝试过 VB Migration Pa
  • Windows 上的插入器

    是否可以替换系统函数 就像在 Linux 和 Solaris 上使用 LD PRELOAD 一样 例如通过设置环境变量 LD PRELOAD path to mymalloc so 我将替换 malloc 函数 而不是在已安装在系统库中的
  • 循环#includes是如何解决的?

    在c中 假设我们有2个文件 1 h include lt 2 h gt blah blah 我们有 2小时 include lt 1 h gt code 这是怎么解决的 通常 您使用与文件名相对应的 ifndef define 来保护包含文
  • 当数据可以包含逗号时,按逗号分割字符串

    我有一个 CSV 文件 不是我设计的 现在无法更改 也永远无法更改它 其中包含如下行 Surname Firstname yes no somestring whatever etc 正如你在这里看到的 第一个 不是我想要分割字符串的逗号
  • MediaPlayer 在 Android 5.0 (Lollipop) 中抛出错误

    我编写了一个使用 HTTP 连接传输 MP3 的媒体应用程序 这在 Android 版本 2 x 4 x 上运行良好 但现在在 5 x 中生成错误 该应用程序循环播放包含 MP3 的播放列表对象 每个 MP3 都有自己唯一的 HTTP 地址
  • 在AWS lambda中创建utils.py

    I had a def hello 功能在我的home file py文件 我创建了一个home common utils py文件并将函数移到那里 现在 我想将其导入到我的文件中file py 我是这样导入的 from utils imp
  • iPhone中有系统级后台队列进程吗?

    我需要保存一个大文件 有时需要很长时间才能完成 用户可能只是关闭应用程序 我想知道iPhone SDK是否可以接手这个未完成的大任务 看来iPhone自带的邮件系统可以后台发送 我准备了一封电子邮件 单击 发送 然后立即关闭邮件应用程序 在
  • 使用 Excel VBA 创建工作表并根据特定列中的唯一项目移动数据

    我熟悉编程 但不熟悉 VBA 或 Excel 对象模型 我发现处理起来非常令人沮丧 我拥有的是一张带有列标题的数据 根据数据类型的不同 标题的数量也不同 因此我需要找到一个特定的列 在所有工作表中 该列并不总是位于同一位置 因此我无法对其进
  • Python 简单指数平滑

    我从 www nasdaq com 下载了 TESLA 股票 下载 CSV 文件后 我意识到我需要使用 Microsoft Excel 2016 转换 CSV 我使用 数据 选项卡 并单击文本到列 现在标题很清楚了 它们是 日期 收盘价 成
  • 在 Woocommerce 中获取自定义产品属性

    在 Woocommerce 中 我试图获取产品自定义属性值 但失败得很惨 我什么也没得到 所以我尝试 global woocommerce post product res get post meta product gt id print
  • CMake 设置默认搜索路径?

    我只是不想每次需要库时都设置环境变量 更不用说搜索的路径根本不标准化 至少在 Windows 上 一般来说 Find cmake 不会指定任何与 Windows 相关的位置 有没有某种方法可以使 CMake 搜索指定目录 强制配置错误的 F
  • 在Java中求多项式的根

    我需要找到一个 近似的 数值的 解勒让德多项式 我尝试了几个Java库 但没有一个有我正在寻找的东西 最接近的是commons math 它甚至有用于在拉盖尔求解器 但它没有公开该方法 是否有现有的解决方案或者我需要实施自己的解决方案 您可
  • Xamarin 中的调用目标引发了异常

    这是代码 运行它看看有什么问题 gt https github com x0axz CustomRenderer 在我的 Xamarin 应用程序中 有一个适用于 Android 的自定义相机渲染器 它是从ViewModel通过Messag
  • 如何在Python中导入类型提示的类?

    我有一个代码 from pandas import DataFrame def func df DataFrame gt DataFrame 因为我实际上并没有在代码中创建 DataFrame 对象 所以我想做 from typing im
  • 在其中创建 Angular 生命周期挂钩的 Highcharts 实例

    我目前正在使用 Angular 7 高图表API 我使用以下方法集成了 Highcharts官方 Github 链接 有一个callbackFunction在 Highcharts 中我们可以使用它来获取图表实例 但是 我还没有弄清楚两件事
  • 如何选择要在 TensorBoard 的嵌入选项卡中查看的检查点?

    简短的问题 如何选择在 TensorBoard 的嵌入选项卡中查看哪个检查点 问题的较长版本 我想用 TensorBoard 可视化词嵌入 为此 在阅读完官方教程 mirror 我添加了以下代码 embedding writer tf su
  • 调用托管属性的 getter 时出现 NPE

    我正在使用 Hibernate 学习 Spring 并使用 JSF 作为前端框架创建一个电影租赁应用程序 我的注册 bean 中有一个应用程序范围的托管属性 它是视图范围的 在里面register 方法将用户详细信息插入数据库中 我调用服务
  • C 代码中的内联汇编语句和适用于 ARM Cortex 架构的扩展 ASM

    我正在尝试编译以下两段代码ARM编译器5对于 Cortex A 微处理器 Part 1 static inline void cp15 write sctlr uint32 t value asm mcr p15 0 0 c1 c0 0 r