GCC 为 AVR 上的简单 ISR 生成不必要的寄存器推送

2024-04-18

我有一些简单的 C++ 程序,如果使用 g++ 编译,它会生成以下汇编文本。唯一的说法是sbi,这不会影响任何状态标志。我想知道为什么 G++ 会产生这些无用的推送/弹出r0 and r1?

.global __vector_14
        .type   __vector_14, @function
__vector_14:
        push r1  ; 
        push r0  ; 
        in r0,__SREG__   ; ,
        push r0  ; 
        clr __zero_reg__         ; 
/* prologue: Signal */
/* frame size = 0 */
/* stack size = 3 */
.L__stack_usage = 3
        sbi 0x1e,0       ; ,
/* epilogue start */
        pop r0   ; 
        out __SREG__,r0  ; ,
        pop r0   ; 
        pop r1   ; 
        reti
        .size   __vector_14, .-__vector_14

有没有办法让 g++ 自动忽略这些寄存器保存。我不想将 ISR 声明为ISR_NAKED一般来说。

编辑: 这是相应的 C++ 代码(-Os 或 -O3):

#include <avr/interrupt.h>

struct AppFlags final {
    bool expired : 1;
} __attribute__((packed));

int main() {
}

ISR(TIMER0_COMPA_vect) {
    auto f = reinterpret_cast<volatile AppFlags*>(0x3e);
    f->expired = true;
}

原因是您使用的是过时的编译器。这提到的优化 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81268已在 v8 中添加(2018 年春季发布),请参阅GCC v8 发行说明 https://gcc.gnu.org/gcc-8/changes.html#avr:

编译器现在可以生成高效的中断服务例程 (ISR) 序言和尾声。这是通过使用新的AVR伪指令 https://sourceware.org/binutils/docs-2.29/as/AVR-Pseudo-Instructions.html__gcc_isr 由 GNU 汇编器支持和解析。

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

GCC 为 AVR 上的简单 ISR 生成不必要的寄存器推送 的相关文章

  • Volatile.Read 和 Volatile.Write 背后的逻辑是什么?

    来自 MSDN Volatile Read 读取字段的值 在需要它的系统上 插入一个 阻止处理器重新排序内存的内存屏障 操作如下 如果在该方法之后出现读或写 代码 处理器无法移动它before这个方法 and Volatile Write
  • JSON.Net 反序列化返回“null”

    我正在使用 JSON Net 反序列化 JSON 字符串 JSON 字符串是 string testJson Fruits Apple color red size round Orange Pro
  • 无法将 std::min 传递给函数,std::min 的副本有效

    Passing std min函数无法编译 我复制了 libcpp 声明std min进入我的源文件并且它可以工作 std 版本有什么问题 clang 和 gcc 也会发生同样的情况 在 Godbolt 上测试 https godbolt
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • 全局使用和 .NET Standard 2.0

    我最近意识到我可以使用 C 10 功能文件范围的命名空间在 NET Standard 2 0 项目中也可以通过设置
  • 带有运算符语法的错误消息,但不带有函数语法的错误消息

    为什么我在调用 unary 时收到错误消息 使用运算符语法 如果我用函数语法调用它就可以了 现场演示 https godbolt org z j7AbeQ template
  • 在 C++11 中移出 stdpriority_queue 的元素

    最小的工作示例 include
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • 如何使用 CSI.exe 脚本参数

    当你运行csi exe 安装了 Visual Studio 2015 update 2 您将得到以下语法 Microsoft R Visual C Interactive Compiler version 1 2 0 51106 Copyr
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • Autoconf 问题:“错误:C 编译器无法创建可执行文件”

    我正在尝试使用 GNU 自动工具构建一个用 C 编写的程序 但显然我设置错误 因为当configure运行 它吐出 configure error C compiler cannot create executables 如果我看进去con
  • 如果“嵌入式”SQL 2008 数据库文件不存在,如何创建它?

    我使用 C ADO Net 和在 Server Management Studio 中创建的嵌入式 MS SQL 2008 数据库文件 附加到 MS SQL 2008 Express 创建了一个数据库应用程序 有人可以向我指出一个资源 该资
  • 这种尺寸对齐是如何工作的

    对于所提供的评论 我无法理解以下代码 这段代码的作用是什么 以及等效的代码是什么8 aligned segment size must be 4 aligned attr gt options ssize 3 Here ssize is o
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的

随机推荐

  • 在事务结束时发送事件

    我有一个服务对象的接口 如下所示 为简洁起见进行了简化 public interface ItemService public Item getItemById String itemId int version public void c
  • 部署到 Docker 时外部化 Spring Boot 属性

    在我的 Spring Boot 应用程序中 我想将属性外部化以在 Docker 容器中运行 首次部署时 当前的属性my server src main resources application yml由应用程序按预期加载和使用 一切正常
  • 如何修复这个已有 8 年历史的 VBA 64 位编译器错误?

    所以这就是错误 64 BitVBA主机 例如Access 365 64位或Excel 2016 64位 创建类模块SomeClass this needs to be here to trigger the bug Private Sub
  • Hashmap 单键保存一个类。计算密钥并检索计数器

    我正在开发一个数据库自我项目 我有一个来自以下位置的输入文件 http ir dcs gla ac uk resources test collections cran http ir dcs gla ac uk resources tes
  • 将数据表保存到文本文件的最短方法

    我刚刚找到了一些答案 但发现它们都非常长并且有很多迭代 所以我想出了自己的解决方案 将表转换为字符串 string myTableAsString String Join Environment NewLine myDataTable Ro
  • JavaScript 中的封装

    很久以前 我看到有人用如下代码封装了整个 JavaScript 块 function this 问题 上面的代码正确吗 像上面提到的那样封装整个 JavaScript 块有什么好处 对 那是正确的 它称为自调用匿名函数表达式 JavaScr
  • SQL Server DateTime 参数“舍入”警告

    与其说是问题 不如说是警告 今天早上我们解决了一个非常令人费解的错误 我们有各种报告 允许用户输入他们想要运行的日期范围 假设是 如果您要求提供 2010 年 8 月 1 日至 2010 年 8 月 10 日的报告 您的意思是include
  • android内容提供者总和查询

    是否可以使用getContentResolver query 当我想要的时候sum column OR 我是否必须对数据库句柄进行原始查询 当提供列数组时ContentResolver query 将列名称括起来sum 功能 String
  • 将python程序转换为windows可执行文件

    我正在尝试从具有 GUI 的 python 程序创建 Windows 可执行文件 我正在使用以下脚本 from distutils core import setup import py2exe setup console gui py 它
  • Typescript 阻止节点/模块工厂模式:错误 TS4060

    当使用 ES6 模块语法导出返回 Typescript 类实例的工厂函数时 会产生以下错误 错误 TS4060 导出函数的返回类型具有或正在使用私有名称 Paths 来自 paths ts Class scoped behind the e
  • Google Map API 通过邮政编码获取地址信息,但它通过街道号码响应结果

    我正在使用谷歌地图 API 通过世界各地的邮政编码获取地址信息 非特定国家 地区 我预计邮政编码是 610 但 google 响应结果是街道号码 610 有什么方法可以仅通过邮政编码获取地址吗 预先感谢各位的支持 与此查询一起进行的操作怎么
  • 如何在 SVG 中制作不同大小的内嵌文本?

    在 HTML 中为不同的单词创建具有不同字体大小的文本非常容易 但是关于
  • for(:) 在 Java 中是什么意思?

    package MyTest import java beans BeanInfo import java beans Introspector import java beans PropertyDescriptor class Pers
  • JTextField设置输入限制

    您好 我正在尝试使用 setDocument 方法来限制用户可以在文本字段中输入的字符数 但不知怎的 它并没有限制输入字符的数量 这是代码 import javax swing text AttributeSet import javax
  • 从加载的信息中计算出值

    我需要能够为用户进行的每个赌注显示 动态回报 但由于某种原因 它们都不起作用 我以前曾问过这个问题 但没有运气 我希望其中的额外细节足以帮助您最终找到答案 我已经对其中一个脚本进行了硬编码 以便使用odds 1 stake 1等等 这有效
  • :hover 仅适用于rotateX 转换后的div 的下部

    我有一个 div 并应用了 CSSrotateX 变换 webkit transform perspective 500px rotateX 60deg rotateY 60deg 一堆较小的 div 漂浮在其中 并应用 hover 规则
  • MATLAB 写入多页 tiff 指数慢

    我正在尝试编写一个多页 tiff 文件 该文件是 128 像素 x 128 像素 x 122000 帧的 16 位无符号整数 ImageJ 或简短的 Python 脚本可以在快速机器上在一分钟内完成此操作 在同一台机器上 无论使用我尝试过的
  • 使用 TIMEZONE 查询 Oracle TIMESTAMP

    我在 Oracle DB 表中有一个类型为TIMESTAMP 6 WITH TIME ZONE 有些数据行包含来自不同时区的数据 有些是 UTC 有些是其他时区偏移量 有没有一种方法可以查询 Oracle 表 以便结果始终以 UTC 形式返
  • C# LINQ to SQL:重构此通用 GetByID 方法

    我写了下面的方法 public T GetByID int id var dbcontext DB var table dbcontext GetTable
  • GCC 为 AVR 上的简单 ISR 生成不必要的寄存器推送

    我有一些简单的 C 程序 如果使用 g 编译 它会生成以下汇编文本 唯一的说法是sbi 这不会影响任何状态标志 我想知道为什么 G 会产生这些无用的推送 弹出r0 and r1 global vector 14 type vector 14