当前位置: 首页 > news >正文

C语言高频面试题——嵌入式系统中中断服务程序

在嵌入式系统中,中断服务程序(ISR)的设计需遵循严格的规则以确保系统稳定性和实时性。以下是对这段代码的分析及改进建议:


代码分析

__interrupt double compute_area (double radius) { double area = PI * radius * radius; printf("\nArea = %f", area); return area; 
}
1. 返回值类型错误
  • 问题:ISR通常不应有返回值,因为中断由硬件触发,无调用者接收返回值。
  • 规范:ISR应声明为 void 类型。
  • 错误示例double compute_area(...) 错误地返回浮点值。
2. 参数传递不合理
  • 问题:ISR不应有参数,因为中断触发时参数无法通过常规栈传递,通常依赖硬件或全局变量。
  • 错误示例double radius 作为参数无意义且不可行。
3. 调用不可重入函数(如printf
  • 问题
    • printf标准I/O函数,涉及系统调用和缓冲区操作,不可重入,可能导致数据竞争或死锁。
    • ISR应避免耗时操作,而 printf 执行时间长,影响实时性。
  • 风险:在中断上下文中使用可能导致系统崩溃或性能下降。
4. 浮点运算未处理上下文
  • 问题
    • 若系统未自动保存浮点寄存器(如某些ARM Cortex-M内核),ISR中的浮点操作(double)会破坏主程序上下文
    • 需手动启用浮点状态保存(如通过编译器选项 -mfpu 或代码配置)。
  • 示例隐患PI * radius * radius 可能损坏浮点寄存器。
5. 功能逻辑不合理
  • 问题:ISR应执行快速、关键的任务(如清除中断标志、更新状态),而非复杂计算。
  • 矛盾compute_area 的功能与ISR的典型用途不符,设计逻辑需重构。

改进后的代码示例

// 声明全局变量传递数据
volatile double radius = 0.0;
volatile double area = 0.0;// 符合规范的ISR实现
__interrupt void Timer_ISR(void) {// 1. 清除中断标志(假设硬件要求)TIMER_REGISTER &= ~TIMER_INTERRUPT_FLAG;// 2. 快速处理关键任务area = PI * radius * radius; // 3. 避免调用库函数,改用标志位通知主程序area_ready_flag = 1; 
}

关键改进点

1. 遵循ISR设计规范
  • 返回值:改为 void
  • 参数:移除所有参数,通过全局变量或硬件寄存器传递数据。
  • 命名:命名体现中断源(如 Timer_ISR)。
2. 避免阻塞和不可重入操作
  • 替代方案
    • 使用标志位通知主程序处理数据(如 area_ready_flag)。
    • 通过共享内存volatile变量)传递计算结果。
3. 浮点运算的安全性
  • 编译器配置:启用浮点上下文保存(如ARM中的 -mfloat-abi=hard)。
  • 硬件支持:确认中断触发时FPU状态自动保存/恢复。
4. 中断效率优化
  • 执行时间:ISR应控制在微秒级,仅处理紧急操作。
  • 数据记录:若需记录数据,使用缓冲区供主程序异步处理。

ISR设计最佳实践

原则正确做法错误做法
返回值声明为 void返回非 void 类型
参数传递通过全局变量或硬件寄存器定义形式参数
库函数调用禁用I/O和内存操作,使用原子操作或标志位调用 printf/malloc
执行时间短小精简,避免循环和复杂计算包含耗时逻辑
资源共享使用 volatile 修饰全局变量,避免竞态条件无保护访问共享资源

相关文章:

C语言高频面试题——嵌入式系统中中断服务程序

在嵌入式系统中,中断服务程序(ISR)的设计需遵循严格的规则以确保系统稳定性和实时性。以下是对这段代码的分析及改进建议: 代码分析 __interrupt double compute_area (double radius) { double area PI * radius * radius; pri…...

JavaFX 实战:从零打造一个功能丰富的英文“刽子手”(Hangman)游戏

大家好!今天我们要挑战一个经典的单词猜谜游戏——“刽子手”(Hangman),并使用 JavaFX 这个强大的 GUI 工具包来赋予它现代化的交互体验。这个项目不仅有趣,而且是学习和实践 JavaFX 核心概念的绝佳途径,涵…...

第 2.1 节: 机器人仿真环境选择与配置 (Gazebo, MuJoCo, PyBullet)

在真实机器人硬件上进行开发和测试既耗时又存在风险(硬件损坏、安全问题)。机器人仿真环境提供了一个虚拟的沙盒,让开发者能够在计算机中模拟机器人的物理行为、传感器读数和环境互动,极大地加速了开发、测试和调试过程。特别是对…...

网络开发基础(游戏)之 粘包分包

粘(nin)包、分包 在网络通信中,TCP协议是面向流的协议,没有消息边界概念,粘包和分包是常见的问题。在某种情况下(例如网络环境不稳定)就会导致"粘包"和"分包"问题&#xf…...

联邦元学习实现个性化物联网的框架

随着数据安全和隐私保护相关法律法规的出台,需要直接在中央服务器上收集和处理数据的集中式解决方案,对于个性化物联网而言,训练各种特定领域场景的人工智能模型已变得不切实际。基于此,中山大学,南洋理工大学&#xf…...

使用 Nacos 的注意事项与最佳实践

📹 背景 Nacos 凭借其强大💪的服务发现、配置管理和服务管理能力,成为构建分布式系统的得力助手。然而,要充分发挥 Nacos 的优势,实现系统的高性能、高可用,掌握其使用过程中的注意事项和最佳实践至关…...

在Pytorch中使用Tensorboard可视化训练过程

【在Pytorch中使用Tensorboard可视化训练过程】 https://www.bilibili.com/video/BV1Qf4y1C7kz/?share_sourcecopy_web&vd_sourcef00bfb41b3b450c3767070ed82f30ac8 主要功能: 1.保存网络结构图 2.保存训练集的损失Loss,验证集的正确性Accuracy以…...

15.电感特性在EMC设计中的运用

电感特性在EMC设计中的运用 1. 共模电感与差模电感的差异2. 电感的高频等效特性![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b4dc000672af4dd69a528450eb42cf10.png)3. 电感在EMC设计中的使用注意事项3.1 LC滤波计算3.2 并联型多级浪涌防护的电感退耦 1. 共模电感…...

代理设计模式:从底层原理到源代码 详解

代理设计模式(Proxy Pattern)是一种结构型设计模式,它通过创建一个代理对象来控制对目标对象的访问。代理对象充当客户端和目标对象之间的中介,允许在不修改目标对象的情况下添加额外的功能(如权限控制、日志记录、延迟…...

25、简述.NET程序集(Assembly)

.NET 程序集(Assembly) .NET 程序集(Assembly) 是 .NET 应用程序的基本部署单元,包含以下核心内容: 类型与代码: 存储类、接口等类型的定义及实现(以中间语言 IL 形式)。…...

JavaScript 笔记 --- part 5 --- Web API (part 3)

(webAPI part3) BOM 操作 JS 执行机制 javascript 是单线程的, 也就是说, 只能同时执行一个任务。 为了解决这个问题, 利用多核 CPU 的计算能力, HTML5 提出 Web Worker API, 允许 JavaScript 脚本创建多个线程, 并将任务分配给这些线程。 于是, JS 出现了同步和异步的概念。…...

HCIP(OSPF)(3)

OSPF 报文结构 公共头部:包含版本(8bit)、类型(8bit)、报文长度(16bit)、路由器 ID(32bit)、区域 ID(32bit)、校验和(16bit&#xff0…...

Docker:重塑应用开发与部署的未来[特殊字符]

Docker:重塑应用开发与部署的未来🚀 在数字化转型的浪潮中🌊,应用开发与部署面临着诸多挑战,如环境一致性差、资源利用率低、运维复杂等。而Docker,作为容器技术领域的明星产品🌟,凭…...

逻辑回归:损失和正则化技术的深入研究

逻辑回归:损失和正则化技术的深入研究 引言 逻辑回归是一种广泛应用于分类问题的统计模型,尤其在机器学习领域中占据着重要的地位。尽管其名称中包含"回归",但逻辑回归本质上是一种分类算法。它的核心思想是在线性回归的基础上添…...

如何改电脑网络ip地址完整教程

更改电脑的网络IP地址以满足特定的网络需求,本文将为您提供一份详细的步骤指南。其实,改变IP地址并不是一件复杂的事,能解决因为IP限制带来的麻烦。以下是操作指南: 方法一:Windows 系统,通过图形界面修改 …...

Scenario Dreamer:用于生成驾驶模拟环境的矢量化潜扩散模型

25年3月来自加拿大 Mila AI研究院、蒙特利尔大学、蒙特利尔理工、普林斯顿、加拿大 CIFAR AI Chair 计划和 Torc 机器人公司的论文“Scenario Dreamer: Vectorized Latent Diffusion for Generating Driving Simulation Environments”。 Scenario Dreamer,是一个完…...

# 基于PyTorch的食品图像分类系统:从训练到部署全流程指南

基于PyTorch的食品图像分类系统:从训练到部署全流程指南 本文将详细介绍如何使用PyTorch框架构建一个完整的食品图像分类系统,涵盖数据预处理、模型构建、训练优化以及模型保存与加载的全过程。 1. 系统概述 本系统实现了一个基于卷积神经网络(CNN)的…...

【MCP Node.js SDK 全栈进阶指南】初级篇(1):MCP开发环境搭建详解

引言 Model Context Protocol (MCP) 是一种开放标准,旨在规范模型与应用程序之间的交互方式。本文作为MCP TypeScript-SDK系列的第一篇,将详细介绍如何搭建MCP开发环境,包括Node.js与TypeScript环境配置、SDK安装、开发工具推荐以及项目结构设计,帮助你快速入门MCP应用开发…...

unity脚本-FBX自动化模型面数校验

根据目前模型资源平均面数预算进行脚本制作,自动化校验模型面数是否符合规范。 *注:文件格式为.cs。需要放置在unity资源文件夹Assets>Editor下。 测试效果(拖一个fbx文件进unity时自动检测): 以下为完整代码 us…...

压力容器的优化设计

1 优化设计概述 优化设计是一种寻找确定最优设计方案的技术。所谓“最优设计”,指的是一种方案可以满足所有的设计要求,而且所需的支出(如重量,面积,体积,应力,费用等)最小。也就是…...

在Windows上安装Git

一、安装 Git 下载 Git地址:Git - Downloads (git-scm.com) 1、在页面中找到适用于 Windows 系统的最新版本安装包(通常为.exe 格式文件),点击下载链接。 出于访问Git官网需要科学上网,不会的可以私信我要软件包&…...

python包管理器,conda和uv 的区别

python包管理器,conda和uv 的区别 以下是 conda 和 uv 在 Python 包管理中的深度对比,结合知识库内容进行分析: 1. 核心设计理念 conda 以“环境为中心”,强调跨语言支持(如 Python、R、Julia)和严格的依赖…...

Oracle在ERP市场击败SAP

2024年,甲骨文(Oracle)以87亿美元的ERP收入和6.63%的市场份额,首次超越SAP,成为全球最大的ERP应用软件供应商,结束了SAP自上世纪80年代以来在该领域的长期霸主地位。据APPS RUN THE WORLD的市场调研&#x…...

Kafka 消息积压监控和报警配置的详细步骤

Kafka 消息积压监控和报警配置的详细步骤示例,涵盖常用工具(如 Prometheus Grafana、云服务监控)和自定义脚本方法: 一、监控配置 方法1:使用 Prometheus Grafana kafka-exporter 步骤1:部署 kafka-ex…...

记录一次使用面向对象的C语言封装步进电机驱动

简介 (2025/4/21) 本库对目前仅针对TB6600驱动下的42步进电机的基础功能进行了一定的封装, 也是我初次尝试以面向对象的思想去编写嵌入式代码, 和直流电机的驱动步骤相似在调用stepmotor_attach()函数和stepmotor_init()函数之后仅通过结构体数组stepm然后指定枚举变量中的id即…...

QTextDocument 入门

一、QTextDocument QTextDocument 是 Qt 中用于处理富文本文档的核心类,支持文本格式、图片、表格等复杂内容。 1. QTextDocument 入门 1.1 基本概念 QTextDocument 是 Qt 中用于处理富文本内容的核心类,它提供了: 结构化文本存储(段落、列表、表格等) 文本格式支持(…...

Arthas进阶用法

目录 查看已加载的类反编译代码动态执行代码排查 HTTP 请求问题热更新代码获取 Spring Context 并操作查看 JVM 信息自定义命令Web Console重置与退出 查看已加载的类 sc 命令 :可以查找所有 JVM 已经加载到的类。如果搜索的是接口,还会搜索所有的实现类…...

三生原理与现有密码学的核心区别?

AI辅助创作: 三生原理与现有密码学的核心区别 一、‌哲学基础与设计逻辑‌ ‌动态生成 vs 静态分析‌ 三生原理以“阴阳动态平衡”为核心,通过参数化生成(如素数构造中的阴阳元联动公式)模拟系统演化过程,而现有密码…...

定义python中的函数和类

1.函数 在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回 1.1 定义函数 def showshow(sex):if sex1:return manelse:retu…...

明远智睿2351开发板四核1.4G Linux处理器:驱动创新的引擎

在科技日新月异的今天,创新成为了推动社会进步的核心动力。而在这场创新的浪潮中,一款性能卓越、功能全面的处理器无疑是不可或缺的引擎。今天,我们介绍的这款四核1.4G处理器搭配Linux系统的组合,正是这样一款能够驱动未来创新的强…...

【前端】【业务逻辑】【面试】JSONP处理跨域原理与封装

&#x1f9e0; 一、JSONP 是什么&#xff1f; 项目内容&#x1f4cc; 全称JSON with Padding&#x1f4cd; 用途跨域请求数据的一种方式&#xff0c;绕过同源策略&#x1f4e6; 本质通过 <script> 标签加载远程 JS 文件&#xff0c;这个文件执行一个回调函数并传入数据 …...

深入探索RAG:用LlamaIndex为大语言模型扩展知识,实现智能检索增强生成

大型语言模型&#xff08;LLM&#xff09;&#xff0c;如ChatGPT和Llama&#xff0c;在回答问题方面表现出色&#xff0c;但它们的知识仅限于训练时所获取的信息。它们无法访问私有数据&#xff0c;也无法在训练截止日期之后学习新知识。那么&#xff0c;核心问题就是……我们如…...

移远通信智能模组助力东成“无边界智能割草机器人“闪耀欧美市场

2025年4月21日&#xff0c;移远通信宣布&#xff0c;旗下SC206E-EM智能模组已成功应用于江苏东成电动工具有限公司旗下的DCK TERRAINA无边界智能割草机器人。 这款智能模组高度集成计算、通信、定位等多元能力&#xff0c;以小型化、低功耗、实时性强和低成本等综合优势&#…...

测试-时间规模化定律可以改进世界基础模型吗?

25年3月来自 UT Austin、UW Madison 和 Nvidia 的论文“Can Test-Time Scaling Improve World Foundation Model?”。 世界基础模型&#xff08;WFM&#xff09;通过根据当前的观察和输入预测未来状态来模拟物理世界&#xff0c;已成为许多物理智能&#xff08;PI&#xff09…...

VMwaer虚拟机复制粘贴、ROS系统安装

一、VMwaer虚拟机复制粘贴设置&#xff1a;设置完记得重启VMwaer 1.首先确定 虚拟机设置-->选项-->客户机隔离-->勾选 启用拖放 启用复制粘贴 2.如果还是不能粘贴 可能是 没有 VMware Tools 可参考 怎么在linux安装vmware tools-CSDN博客 设置完记得重启VMwaer。…...

安装 vmtools

第2章 安装 vmtools 1.安装 vmtools 的准备工作 1&#xff09;现在查看是否安装了 gcc ​ 查看是否安装gcc 打开终端 输入 gcc - v 安装 gcc 链接&#xff1a;https://blog.csdn.net/qq_45316173/article/details/122018354?ops_request_misc&request_id&biz_id10…...

HCIP(综合实验2)

1.实验拓补图 2.实验要求 1.根据提供材料划分VLAN以及IP地址&#xff0c;PC1/PC2属于生产一部员工划分VLAN10,PC3属于生产二部划分VLAN20 2.HJ-1HJ-2交换机需要配置链路聚合以保证业务数据访问的高带宽需求 3.VLAN的放通遵循最小VLAN透传原则 4.配置MSTP生成树解决二层环路问题…...

机器学习第一篇 线性回归

数据集&#xff1a;公开的World Happiness Report | Kaggle中的happiness dataset2017. 目标&#xff1a;基于GDP值预测幸福指数。&#xff08;单特征预测&#xff09; 代码&#xff1a; 文件一&#xff1a;prepare_for_traning.py """用于科学计算的一个库…...

Spark-Streaming简介及核心编程

一、核心概念&#xff1a; 1.Spark-Streaming 是流式数据处理框架&#xff0c;基于 **DStream&#xff08;离散化流&#xff09;** 抽象&#xff0c;将实时数据划分为多个时间区间的 RDD 序列。 DStream 本质是RDD 序列&#xff0c;每个时间区间数据对应一个 RDD。 2.特点&a…...

优化提示词方面可以使用的数学方法理论:信息熵,概率论 ,最优化理论

优化提示词方面可以使用的数学方法理论:信息熵,概率论 ,最优化理论 目录 优化提示词方面可以使用的数学方法理论:信息熵,概率论 ,最优化理论信息论信息熵明确问题主题提供具体细节限定回答方向规范语言表达概率论最优化理论信息论 原理:信息论中的熵可以衡量信息的不确定性。…...

Sqlserver安全篇之_Sqlcmd命令使用windows域账号认证sqlserver遇到问题如何处理的案例

sqlcmd https://learn.microsoft.com/zh-cn/sql/tools/sqlcmd/sqlcmd-connect-database-engine?viewsql-server-ver16 sqlcmd -S指定的数据库连接字符串必须有对应的有效的SPN信息&#xff0c;否则会报错SSPI Provider: Server not found in Kerberos database. 正常连接 1、…...

基于华为云 ModelArts 的在线服务应用开发(Requests 模块)

基于华为云 ModelArts 的在线服务应用开发&#xff08;Requests 模块&#xff09; 一、本节目标 了解并掌握 Requests 模块的特点与用法学会通过 PythonRequests 访问华为云 ModelArts 在线推理服务熟悉 JSON 模块在 Python 中的数据序列化与反序列化掌握 Python 文件 I/O 的基…...

Graph Database Self-Managed Neo4j 知识图谱存储实践1:安装和基础知识学习

Neo4j 是一个原生图数据库&#xff0c;这意味着它在存储层实现了真正的图模型。它不是在其他技术之上使用“图抽象”&#xff0c;而是以您在白板上绘制想法的相同方式在Neo4j中存储数据。 自2007年以来&#xff0c;Neo4j已经发展成为一个丰富的工具、应用程序和库的生态系统。…...

【Python进阶】VSCode Python开发完全指南:从环境配置到高效调试

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1&#xff1a;配置虚拟环境案例2&#xff1a;智能代码补全案例3&#xff1a;调试配置 运行结果…...

vscode:Live Server Preview插件

这个插件不用另外打开浏览器&#xff1b;它是直接在Vscode里面预览html的&#xff0c;并且是自动实时更新的&#xff0c;不用不停地CtrlS保存查看 使用方法&#xff1a;F1 -> 弹出一个窗口输入live&#xff0c;选择即可。 运行结果如下&#xff1a;...

关于在Springboot中设置时间格式问题

目录 1-设置全局时间格式1.Date类型的时间2.JDK8时间3.使Date类和JDK8时间类统统格式化时间 2-关于DateTimeFormat注解 1-设置全局时间格式 1.Date类型的时间 对于老项目来说&#xff0c;springboot中许多类使用的是Date类型的时间&#xff0c;没有用到LocalDateTime等JDK8时…...

双周报Vol.70: 运算符重载语义变化、String API 改动、IDE Markdown 格式支持优化...多项更新升级!

2025-04-21 语言更新 async 函数的调用处语法改为和 error 相同的 f!(..)&#xff0c;原语法 f!!(..) 将触发警告 运算符重载的语义从基于方法迁移到了基于 trait&#xff0c;以后重载运算符需要通过给 moonbitlang/core/builtin 中对应的 trait 添加 impl 的形式。各个运算符…...

AI 技术发展:从起源到未来的深度剖析

一、AI 的起源与早期发展​ 人工智能&#xff08;AI&#xff09;作为计算机科学的重要分支&#xff0c;其诞生可以追溯到 20 世纪中叶。1943 年&#xff0c;艾伦・图灵提出图灵机的概念&#xff0c;为计算机科学和 AI 理论奠定了基础。1950 年&#xff0c;图灵又提出著名的图灵…...

【前端】【业务逻辑】 数据大屏自适应方案汇总

前端数据大屏自适应设计方案全解析 在前端数据大屏的开发中&#xff0c;自适应设计是关键环节&#xff0c;它能确保大屏在不同设备和屏幕尺寸上都能呈现出良好的视觉效果和交互体验。除了常见的 transform: scale、rem/vw、Flex/Grid 等方案外&#xff0c;还有其他有效的方法可…...

Java基础复习(JavaSE进阶)第六章 IO流体系

6-1 File类 01 122、File、IO流概述 02 123、File类&#xff1a;对象的创建 03 124、File类&#xff1a;判断、判断信息相关的方法 04 125、File类&#xff1a;创建、删除文件的方法 05 126、File类&#xff1a;遍历文件夹的方法 6-2 前置知识 01 127、前置知识&#xff1a;方…...