我有一个python脚本,可以创建大量的临时文件.如果脚本因ctrl + c中断而提前终止,我想在允许程序结束之前快速删除这些文件.
什么是pythonic方式处理这个?
我最近遇到了一个只在中断处理程序中被修改的变量的问题.变量本身并未声明为volatile,因此在更高的优化级别下,编译器会破坏代码.但是,编译器足够聪明,可以编译中断代码,因为中断仍会触发.
所以这是我的问题:
如果编译器足够聪明以编译中断代码,为什么它不够聪明才能意识到变量在该中断内被改变了?
在更高的优化级别,未调用的函数会被优化.由于没有代码调用中断处理程序,因此它应该被优化掉.什么原因导致编译器编译中断代码?
我正在制作嵌入式固件,初始化后的所有事情都发生在 ISR 中。我有它们之间共享的变量,我想知道在什么情况下它们需要是易失性的。我从不阻塞,等待另一个 ISR 的变化。
在不使用易失性的情况下,什么时候可以确定实际内存已被读取或写入?每个 ISR 一次?
附录:
这是针对 ARM Cortex-M0 的,但这实际上并不是一个关于 ISR 的问题,而是一个关于编译器优化的问题,因此,平台实际上并不重要。
我正在研究操作系统,我遇到了术语ISR和中断处理程序.它们是同一机制的两个词吗?如果没有,有什么区别?
我只想知道它们之间的基本区别.
我在某些地方发现TRAP本质上也被称为软件中断,或类似异常.
另外软件中断和异常之间的基本区别是什么.
软件中断可以由INT指令生成,但TRAP只能通过除零等特定场景生成?是对的吗?
请为此查询提供合适的答案,其中包括s/w中断陷阱和异常.
embedded microcontroller interrupt interrupt-handling interrupted-exception
根据ACPI规范,FADT(固定的ACPI描述表)表包含一个向OS 报告SCI中断号的字段。该字段定义如下:
我将FADT表转储到了Intel x86平台上,并看到SCI中断与该数字相关联9:
但是根据《英特尔手册》,0-31保留了IA体系结构定义的中断的向量。具体来说,9定义为:
因此,根据说明,9I386处理器之后不会生成。因此,我想这就是SCI 可以挽救 9的原因。这可以看作是ACPI规范的x86特定实现。
我说得对吗?
似乎我在这里误解了一些东西。稍后将更新。
我目前正在开发一个更大的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).
这是一个例子:
sendTemperatureData(...)称为温度cmdMsg3.sendCmdStart(kReadTemperature); 叫做cmdMsg3.sendCmdArg(sensorId); 叫做sendTemperatureData(); 叫做cmdMsg3.sendCmdStart(kReadSonar); 叫做cmdMsg3.sendCmdArg(sensorId);cmdMsg3.sendCmdArg(distance);cmdMsg3.sendCmdEnd();sendTemperatureData(...)被称为cmdMsg3.sendCmdArg(temperature);cmdMsg3.sendCmdEnd();然后,我试图通过使用在发送过程中阻止ISR调用noInterrupts()/interrupts(); 使发送过程有点'原子'.但这导致了许多其他问题,millis()/micros()功能不再精确,串行通信发生故障等; 所有都依赖于被禁用的计时器 …
我正在组装中构建一个32位操作系统.
我已经设置了IDT,我正在通过int指令处理程序interruptus .
如何启用syscall和sysenter说明以及如何处理/返回?
诚然,syscall指令在32位基于英特尔处理器的支持,所以我不能用它?sysret教学不安全是真的吗?在某处存在一个教程吗?
编辑:我的主要问题是如何启用syscall和sysenter说明!(没有重复)
assembly system-calls protected-mode osdev interrupt-handling
测试使用中断的代码,我强迫使用a while(1);尝试保留在中断处理程序中,但是我看到中断处理程序离开并返回到main,因此我假设它具有某种超时。如果是这样,它是ISR所特有的,还是中断的标准功能?
以下代码使用 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 ×5
interrupt ×4
embedded ×2
isr ×2
arduino ×1
assembly ×1
avr ×1
cortex-m3 ×1
optimization ×1
osdev ×1
python ×1
python-2.7 ×1
system-calls ×1
volatile ×1
x86 ×1