C语言中__attribute__()

__attribute__()

属性: interrupt(“”)

我们知道,当发生中断的时候,系统会通过中断向量表跳转到相应的函数中并执行。等中断服务函数执行完后,又继续回到程序中。因此这个过程中涉及到一个现场的保护和恢复。那是否需要在中断处理函数里去写保存/恢复中断现场的代码?答案是不需要,只需要在中断处理函数前使用“__attribute__((interrupt))”修饰

而这也就是__attribute__(interrupt(""))的作用:编译器将C语言写的中断处理函数翻译成汇编代码时,会自动插入保存/恢复现场的汇编代码。也就是把中断处理函数中会用到的寄存器都先存入栈中,在中断返回前,再从栈里面读出来恢复到寄存器中

因此当我们需要将一个函数设定为中断服务函数的时候,我们就可以在这个函数前面添加上这个.例如:

SET(interrupt("")) void timer_isr(void) {// 中断服务程序的代码
}

属性: noinline

在 C 语言中,__attribute__((noinline)) 是一个非标准的属性声明,用于告诉编译器不要将指定的函数进行内联展开。

那什么是内联展开呢?

函数调用通常会带来一定的开销,因为需要保存现场、跳转到被调用函数执行,然后再恢复现场继续执行当前函数。对于一些小而频繁调用的函数,这种开销可能不划算。内联函数的目的是减少函数调用的开销。当我们使用 inline 关键字声明一个函数时,编译器会尝试在调用处直接展开这个函数,避免函数调用的开销。内联通常可以提高代码的执行效率,但同时也会增加目标代码的大小。

当我们使用__attribute__((noinline))修饰一个函数时,它就明确告诉编译器不要对该函数进行内联优化,而是保留标准的函数调用方式。

这在以下情况下很有用:

  1. 调试目的:有时为了方便调试,我们希望保留函数调用的堆栈信息,而内联会破坏堆栈跟踪。
  2. 性能分析:如果一个函数被内联,它的执行时间就会被合并到调用点,无法单独测量和分析该函数的性能开销。
  3. 函数指针:如果一个函数作为参数传递给函数指针,那么它就不能被内联,否则无法获取该函数的入口地址。
  4. 大函数:对于较大的函数,内联可能会导致代码膨胀,反而降低性能。使用noinline可以防止这种情况发生。
  5. 中断处理函数:中断处理函数通常需要快速响应,内联可能会增加代码路径长度,影响响应时间。

需要注意的是,虽然__attribute__((noinline))可以阻止编译器内联优化,但它并不能阻止其他优化,比如常量折叠、死码消除等。此外,滥用noinline可能会导致性能下降,因此应当谨慎使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jetson AGX ORIN 配置 FGVC-PIM 神经网络

Jetson AGX ORIN 配置 FGVC-PIM 神经网络 文章目录 Jetson AGX ORIN 配置 FGVC-PIM 神经网络配置 ORIN 环境创建 FGVC-PIM 虚拟环境安装 PyTorch安装 torchvision安装其他依赖包 配置 ORIN 环境 首先先配置 ORIN 的环境,可以参考这个链接: Jetson AGX …

Java Spring使用event-stream进行数据推送

前端使用EventSource方式向后台发送请求&#xff0c;后端接收到之后使用event-stream方式流式返回。可以应用在时钟、逐字聊天等场景。 前端js示例代码&#xff08;向后台请求数据&#xff0c;并展示到“iddate”的div上&#xff09; <script type"text/javascript&q…

【Hive】with 语法 vs cache table 语法

语法分别如下&#xff1a; cache table table_name as (select ... from ... )with table_name as (select ... from ... )需要注意&#xff0c;with语法只相当于一个视图&#xff0c;并不会将数据缓存&#xff1b;如果要将数据缓存&#xff0c;需要使用cache table语法。 参考…

nuclei使用方法

nuclei使用方法 查看帮助 nuclei -h 列出所有模板 nuclei -tl 查找某种cms的相关漏洞模板&#xff0c;wordpress为例 nuclei -tl -tc "contains(name,wordpress)"便会列出内容里含有wordpress关键字的漏洞检测模板 使用与某cms相关的所有漏洞模板进行扫描&#…

css的background详解

CSS的background属性是一个复合属性&#xff0c;用于设置元素的背景效果。这个属性实际上是多个背景属性的简写形式&#xff0c;包括背景颜色&#xff08;background-color&#xff09;、背景图片&#xff08;background-image&#xff09;、背景重复&#xff08;background-re…

基于Lealfet.js展示Turf.js生成的平滑曲线实践

目录 前言 一、问题的由来 1、创建网页框架 2、创建map对象 3、构建点位&#xff0c;生成路线 二、Turf.js平滑曲线改造 1、官网方法介绍 2、0.4弯曲度曲线 3、0.85弯曲度曲线 4、0.1度弯曲曲线 5、综合对比 总结 前言 在很多的关于路线的gis应用中&#xff0c;我们…

无法加载DLL“SQLite.Interop.dll“:找不到指定模块

当系统在加载 DLL 时出现“找不到指定模块”的错误时&#xff0c;通常是因为系统无法找到所需的 DLL 文件。这个问题通常出现在使用第三方库的时候。 在这种情况下&#xff0c;你可以尝试以下几种解决方法&#xff1a; 确认 SQLite.Interop.dll 文件是否存在于正确的目录中。 …

开源项目ChatGPT-Next-Web的容器化部署(三)-- k8s deployment.yaml部署

一、说在前面的话 有了docker镜像&#xff0c;要把一个项目部署到K8S里&#xff0c;主要就是编写deployment.yaml。 你需要考虑的是&#xff1a; 环境变量服务的健康检测持久化启动命令程序使用的数据源程序使用的配置文件 因为本前端项目比较简单&#xff0c;这里只做一个…

网络工程师笔记15(OSPF协议-2)

OSPF协议 OSPF是典型的链路状态路由协议&#xff0c;是目前业内使用非常广泛的 IGP 协议之一。 Router-ID(Router ldentifier&#xff0c;路由器标识符)&#xff0c;用于在一个 OSPF 域中唯一地标识一台路由器。Router-ID 的设定可以通过手工配置的方式&#xff0c;或使用系统自…

RuoYi 自定义字典列表页面编码翻译

“字典数据”单独维护&#xff0c;而不是使用系统自带的字典表&#xff0c;应该如何使用这样的字典信息呢&#xff1f; 系统字典的使用&#xff0c;请参考&#xff1a; 《RuoYi列表页面字典翻译的实现》 https://blog.csdn.net/lxyoucan/article/details/136877238 需求说明…

IPC网络摄像头媒体视屏流MI_VIF结构体

一个典型的IPC数据流 下图是一个典型的IPC数据流模型&#xff0c;流动过程如下&#xff1a; 1. 建立Vif->Vpe->Venc的绑定关系&#xff1b; 2. Sensor 将数据送入vif处理&#xff1b; 3. Vif 将处理后的数据写入Output Port申请的内存&#xff0c;送入下一级&#xff1b;…

CI/CD环境搭建

服务简介 Gitlab 官网&#xff1a;https://about.gitlab.com/ GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。安装方法是参考GitLab在GitHub上的Wiki页面。Gitlab是被广泛使用的基于git的开源代码管…

设计数据库之内部模式:SQL基本操作

Chapter4&#xff1a;设计数据库之内部模式&#xff1a;SQL基本操作 笔记来源&#xff1a; 1.《漫画数据库》—科学出版社 2.SQL | DDL, DQL, DML, DCL and TCL Commands 设计数据库的步骤&#xff1a; 概念模式 概念模式(conceptual schema)是指将现实世界模型化的阶段进而&…

golang学习网址

.1LearnKu 终身编程者的知识社区 https://learnku.com/

【网站项目】295商业辅助决策系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

opencv 傅里叶变换(低通滤波 + 高通滤波)

文章目录 1、傅里叶变换2、通过numpy实现3、高通滤波器5、通过opencv实现傅里叶变换6、低通滤波器7、C实现傅里叶变换 1、傅里叶变换 时域分析&#xff1a;以时间作为参照物&#xff0c;世间万物都是随着时间变化而变化&#xff0c;并且不会停止 频域分析&#xff1a;认为世间万…

使用PDFBox调整PDF每页格式

目录 一、内容没有图片 二、内容有图片 maven依赖&#xff0c;这里使用的是pdfbox的2.0.30版本 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version></dependency>…

【Android】【Bluetooth Stack】蓝牙电话协议分析(超详细)

1. 精讲蓝牙协议栈&#xff08;Bluetooth Stack&#xff09;&#xff1a;SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅&#xff0c;【蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待&#xff01…

VS Code 跳板机登录服务器(手打密码+秘钥登录)

目录 0.为什么要用跳班机登陆服务器&#xff1f; 1.VS Code插件安装及ssh安装 2.密码链接方式 1&#xff09;添加ssh设置&#xff0c;设置主机 2)设置跳板机 Tips:可以直接通过窗口连接文件管理 3.密钥连接方式&#xff08;更安全更方便&#xff09; 1&#xff09;mac版…

C# 对App.config、Web.config的appSettings节点数据进行加密

appSettings加密原因&#xff0c;就是因为容易暴露服务器账号和密码&#xff0c;而且客户也不允许 使用ASP.NET提供的命令工具aspnet_regiis来创建加密命令&#xff1b;aspnet_regiis是提供了直接对配置文件加密的功能的&#xff1b;并且使用aspnet_regiis加密的配置节点在读取…