标签: interrupt-handling

Python ctrl + c,如果提前终止则执行函数

我有一个python脚本,可以创建大量的临时文件.如果脚本因ctrl + c中断而提前终止,我想在允许程序结束之前快速删除这些文件.

什么是pythonic方式处理这个?

python interrupt-handling python-2.7

1
推荐指数
1
解决办法
81
查看次数

为什么编译器不优化中断代码?

我最近遇到了一个只在中断处理程序中被修改的变量的问题.变量本身并未声明为volatile,因此在更高的优化级别下,编译器会破坏代码.但是,编译器足够聪明,可以编译中断代码,因为中断仍会触发.

所以这是我的问题:

  1. 如果编译器足够聪明以编译中断代码,为什么它不够聪明才能意识到变量在该中断内被改变了?

  2. 在更高的优化级别,未调用的函数会被优化.由于没有代码调用中断处理程序,因此它应该被优化掉.什么原因导致编译器编译中断代码?

c optimization cortex-m3 interrupt-handling

1
推荐指数
1
解决办法
649
查看次数

什么时候需要在 ISR 中使用 volatile?

我正在制作嵌入式固件,初始化后的所有事情都发生在 ISR 中。我有它们之间共享的变量,我想知道在什么情况下它们需要是易失性的。我从不阻塞,等待另一个 ISR 的变化。

在不使用易失性的情况下,什么时候可以确定实际内存已被读取或写入?每个 ISR 一次?

附录:
这是针对 ARM Cortex-M0 的,但这实际上并不是一个关于 ISR 的问题,而是一个关于编译器优化的问题,因此,平台实际上并不重要。

c volatile interrupt-handling

1
推荐指数
1
解决办法
340
查看次数

ISR和中断处理程序之间有区别吗?

我正在研究操作系统,我遇到了术语ISR和中断处理程序.它们是同一机制的两个词吗?如果没有,有什么区别?

c operating-system isr interrupt-handling

1
推荐指数
2
解决办法
2318
查看次数

TRAP,软件中断和硬件中断之间的区别?

我只想知道它们之间的基本区别.

我在某些地方发现TRAP本质上也被称为软件中断,或类似异常.

另外软件中断和异常之间的基本区别是什么.

软件中断可以由INT指令生成,但TRAP只能通过除零等特定场景生成?是对的吗?

请为此查询提供合适的答案,其中包括s/w中断陷阱和异常.

embedded microcontroller interrupt interrupt-handling interrupted-exception

1
推荐指数
1
解决办法
1296
查看次数

如何定义SCI-系统控制中断向量?

根据ACPI规范,FADT(固定的ACPI描述表)表包含一个向OS 报告SCI中断号的字段。该字段定义如下:

在此处输入图片说明

我将FADT表转储到了Intel x86平台上,并看到SCI中断与该数字相关联9

在此处输入图片说明

但是根据《英特尔手册》,0-31保留了IA体系结构定义的中断的向量。具体来说,9定义为:

在此处输入图片说明

因此,根据说明,9I386处理器之后不会生成。因此,我想这就是SCI 可以挽救 9的原因。这可以看作是ACPI规范的x86特定实现

我说得对吗?

加1

似乎我在这里误解了一些东西。稍后将更新。

x86 interrupt interrupt-handling

1
推荐指数
1
解决办法
1264
查看次数

如何处理ISR回调?

我目前正在开发一个更大的Arduino Mega 2560项目; 涉及伺服控制和传感器读数.我正在使用超声波接近传感器(HC-SR04)和NewPing 1.8库,该库使用中断来检测传感器的回声.此外,我还阅读了温度和光强度测量.通过使用cmdMessenger3库,从HC-SR04超声波传感器接收的距离数据通过USB转发到主机.伺服系统由来自主机的消息使用标准伺服库控制.

一旦NewPing库调用ISR检测到超声回波的时间,就会开始乱七八糟.当距离数据可用时,这是NewPing库调用的函数:

void sendSonarData(uint8_t sensorId, uint16_t distance) {
  //noInterrupts();   
  cmdMsg3.sendCmdStart(kReadSonar);
  cmdMsg3.sendCmdArg(sensorId);
  cmdMsg3.sendCmdArg(distance);
  cmdMsg3.sendCmdEnd();
  //interrupts();
}
Run Code Online (Sandbox Code Playgroud)

这是另一个回调函数,它通过cmdMessenger3库将温度数据发送到主机:

void sendTemperatureData(uint8_t sensorId, uint16_t temperature) {
  //noInterrupts();   
  cmdMsg3.sendCmdStart(kReadTemperature);
  cmdMsg3.sendCmdArg(sensorId);
  cmdMsg3.sendCmdArg(temperature);
  cmdMsg3.sendCmdEnd();
  //interrupts();
}
Run Code Online (Sandbox Code Playgroud)

问题:当Arduino试图发送温度数据时,来自超声波传感器的ISR可能会跳入并将其自己的数据写入串行流; 关于发送到主机的串行数据一团糟,因为发送过程不是原子的,由多个命令组成,用于发送一条消息(sendCmdStart- > sendCmdArg- > sendCmdEnd).

这是一个例子:

  1. 读取温度sendTemperatureData(...)称为温度
  2. cmdMsg3.sendCmdStart(kReadTemperature); 叫做
  3. cmdMsg3.sendCmdArg(sensorId); 叫做
  4. 来自声纳传感器的ISR跳入
  5. sendTemperatureData(); 叫做
  6. cmdMsg3.sendCmdStart(kReadSonar); 叫做
  7. cmdMsg3.sendCmdArg(sensorId);
  8. cmdMsg3.sendCmdArg(distance);
  9. cmdMsg3.sendCmdEnd();
  10. 其余的陈述sendTemperatureData(...)被称为
  11. cmdMsg3.sendCmdArg(temperature);
  12. cmdMsg3.sendCmdEnd();
  13. 导致串口通信大乱...

然后,我试图通过使用在发送过程中阻止ISR调用noInterrupts()/interrupts(); 使发送过程有点'原子'.但这导致了许多其他问题,millis()/micros()功能不再精确,串行通信发生故障等; 所有都依赖于被禁用的计时器 …

arduino interrupt interrupt-handling

0
推荐指数
1
解决办法
336
查看次数

OsDev系统调用/ sysret和sysenter/sysexit指令启用

我正在组装中构建一个32位操作系统.
我已经设置了IDT,我正在通过int指令处理程序interruptus .

如何启用syscallsysenter说明以及如何处理/返回?
诚然,syscall指令在32位基于英特尔处理器的支持,所以我不能用它?sysret教学不安全是真的吗?在某处存在一个教程吗?

编辑:我的主要问题是如何启用syscallsysenter说明!(没有重复)

assembly system-calls protected-mode osdev interrupt-handling

0
推荐指数
1
解决办法
929
查看次数

中断处理程序是否有超时?

测试使用中断的代码,我强迫使用a while(1);尝试保留在中断处理程序中,但是我看到中断处理程序离开并返回到main,因此我假设它具有某种超时。如果是这样,它是ISR所特有的,还是中断的标准功能?

c interrupt isr interrupt-handling

0
推荐指数
1
解决办法
73
查看次数

使用“易失性 uint8_t”代替“易失性 sig_atomic_t”是否合法?

以下代码使用 avolatile uint8_t而不是 avolatile sig_atomic_t作为 C 标准要求,因为在 avr 平台上该类型sig_atomic_t不可用。

这仍然是合法的代码吗?使用合法吗__SIG_ATOMIC_TYPE__

是否需要包含cli()/sei()宏?

#include <stdint.h>
#include <signal.h>
#include <avr/interrupt.h>

volatile uint8_t flag;  
//volatile sig_atomic_t flag; // not available in avr-gcc
//volatile __SIG_ATOMIC_TYPE__ flag; // ok?

void isr() __asm__("__vector_5") __attribute__ ((__signal__, __used__, __externally_visible__)); 
void isr() {
    flag = 1;
}

void func(void) {
  for (uint8_t i=0; i<20; i++) {
      flag = !flag;
  }
}
Run Code Online (Sandbox Code Playgroud)

c embedded avr interrupt-handling language-lawyer

0
推荐指数
1
解决办法
304
查看次数