问题标签 [isr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arduino - Arduino Uno 上的两个 ISR
我正在为家庭作业编写一些代码,部分作业是让一个 16x2 LCD 显示器显示 arduino 已经开启了多长时间。这个时钟需要运行一个定时器中断。我已经让那部分工作了,但任务的第二部分是有另一个中断(一个外部按钮作为信号),它将时钟重置为全 0。目前 ISR 似乎没有做任何事情。有任何想法吗?
linux - linux中的UART接收
这主要是一个概念问题。
我有一块 ARM 板通过 UART 从外部设备接收数据。它可以很好地发送和接收数据(通过/dev/ttyS1)
但要接收数据,我必须从终端显式使用“读取”或“猫”命令。
我试图弄清楚如何在不使用读取命令的情况下接收数据并保存传入数据的中断。我正在考虑编写一个 C 程序来永久使用 poll(),但想知道是否有更好的方法来做到这一点。
如果轮询是唯一的方法,是否有这方面的教程?
c++ - 在中断例程中使用 C++ 对象(和易失性)的正确方法是什么?
我目前正在使用 Atmel AVR 微控制器 (gcc),但希望答案适用于一般的微控制器世界,即通常是单线程但带有中断。
volatile
我知道在访问可以在 ISR 中修改的变量时如何在 C 代码中使用。例如:
因为 g_popIndex 在 ISR 内部修改并在 ISR 外部访问,所以必须声明它volatile
以指示编译器不要优化对该变量的内存访问。请注意,除非我弄错了,g_pushIndex
并且g_values
不需要声明volatile
,因为它们没有被 ISR 修改。
我想把队列相关的代码封装在一个类里面,这样就可以复用了:
上面的代码可以说更具可读性。volatile
但是,在这种情况下应该怎么做呢?
1)还需要吗?即使声明了函数,调用该方法是否Queue::isEmpty()
以某种方式确保对 的非优化访问?我不信。我知道编译器使用启发式方法来确定是否不应该优化访问,但我不喜欢依赖这种启发式方法作为通用解决方案。g_queue.m_popIndex
inline
2)我认为一个有效(有效)的解决方案是Queue::m_popIndex
volatile
在类定义中声明成员。但是,我不喜欢这种解决方案,因为类的设计者Queue
需要确切知道如何使用它来知道必须是哪个成员变量volatile
。它不会随着未来的代码更改而很好地扩展。此外,所有Queue
实例现在都将拥有一个volatile
成员,即使有些实例未在 ISR 中使用。
3) 如果将Queue
类视为内置类,我认为自然的解决方案是将全局实例g_queue
本身声明为volatile
,因为它在 ISR 中被修改并在 ISR 之外访问。但是,这并不好用,因为只能volatile
对volatile
对象调用函数。Queue
突然之间,必须声明的所有成员函数volatile
(不仅仅是const
ISR 中使用的那些或那些)。再说了,设计者怎么能Queue
提前知道呢?此外,这会惩罚所有Queue
用户。仍然存在复制所有成员函数并在类中同时具有volatile
和非volatile
重载的可能性,因此非volatile
用户不会受到惩罚。不漂亮。
4)Queue
该类可以在策略类上进行模板化,该策略类可以选择性地volatile
仅在需要时添加到其所有成员变量。同样,类设计者需要提前知道这一点,解决方案更难理解,但是哦,好吧。
我很想知道我是否缺少一些更简单的解决方案。作为旁注,我正在编译没有 C++11/14 支持(还)。
x86 - 待定中断的概念是什么
我无法理解待处理中断这个术语。我的意思是,我看到异步事件的方式就像“时间、潮汐和中断”什么都不等。
那么这个挂起的中断是什么。我如何为过去的请求提供服务,而过去的请求已经消失。
有人可以解释一下使用它的场景。
编辑:定义明智,它被理解(英语意义上),但如果我应该处理之前发生的中断,我是否正在查看硬件设备上的一些数据缓冲?
c++ - 使用 Atmel Studio C++ Build 时无法在 xmega 中使用 ISR
使用 Atmel Studio 6.2.1563,为 ATXMEGA64A3U 创建了一个 GCC C++ 可执行文件。设置定时器 TCC1 每 1 毫秒产生一次溢出中断。但编译器似乎忽略了 ISR 定义。
在调试模式下,我看到定时器运行正常,并且设置了 OVF 中断标志,但我无法将控制权传递给我的服务程序。
IDE消息:The breakpoint (the one I set inside ISR function) will not currently be hit. Unable to set requested breakpoint on Target.
还尝试using extern "C" { }
了相关的 c 文件包含。如果我尝试使用任何其他计时器,也会出现同样的问题。
打开以征求建议。
crash - ISR 期间的 sprintf 导致崩溃?
我正在尝试格式化字符串,然后在ISR期间将其打印到LCD上。注释掉的ISR功能正常;但是当它被引入时,程序在ISR期间崩溃。sprintf()
sprintf()
发生在)decode_buttons(
函数中:
我正在开发PIC32 Cerebot板,目标是使用步进电机的当前模式、方向和 RPM更新LCD 。我会澄清我能做什么并发布任何需要的东西。
c - ISR 和中断处理程序之间有区别吗?
我正在研究操作系统,我遇到了 ISR 和中断处理程序这两个术语。它们是同一个机制的两个词吗?如果不是,有什么区别?
arm - Kinetis 中断处理程序代码战士
如何使用 codewarrior 处理 ARM 微控制器的中断?在 HCs08 处理器中,我这样做,例如:
在启用中断之后,当然......但我不知道如何使用 codewarrior 或 KDS 在 ARM 处理器中处理这些中断
loops - 如何强制中断重新启动主循环而不是恢复?(时间问题!)
在过去的两天里,我编写了一个程序,该程序基本上可以生成一个相当准确的用户可调脉冲信号(频率和占空比都可调)。它基本上使用 micros() 函数来跟踪时间,以便将 4 个数字输出通道拉低或拉高。
这 4 个通道需要始终具有 90 度的相位差(想想 4cyl 引擎)。为了让用户更改设置,实现了一个 ISR,它向主循环返回一个标志以重新初始化程序。此标志定义为布尔值“set4”。当它为假时,主循环中的“while”语句将运行输出。当它为真时,“if”语句将执行必要的重新计算并重置标志,以便“while”语句将恢复。
该程序与初始值完美配合。相位完美。但是,当调用 ISR 并返回主循环时,根据我的理解,它会从最初中断的位置恢复“while”语句中的程序,直到它完成并重新检查标志“set4”以查看它是现在是真的,它应该停止。然后,即使之后的“if”语句重置并重新计算所有必要的变量,这 4 个输出通道之间的相位也会丢失。手动测试我看到取决于调用 ISR 的时间,它会给出不同的结果,通常所有 4 个输出通道同步在一起!即使我可能不会更改任何值,也会发生这种情况(因此,当您第一次打开 arduino 电源时,'if' 例程会将变量重置为完全相同的变量!)。然而,
我很确定这是由于 micros() 计时器造成的,因为循环将从调用 ISR 的位置恢复。我试图通过使用 cli() 和 sei() 检查和禁用中断来做不同的事情,但我无法让它工作,因为当 cli() 的参数为真时它只会冻结。我能想到的唯一解决方案(我已经尝试了一切,花了一整天的时间搜索和尝试东西)是强制 ISR 从循环的开头恢复,以便程序可以正确初始化。想到的另一个解决方案是可能以某种方式重置 micros() 计时器..但这会弄乱我相信的 ISR。
为了帮助您可视化这里发生的事情,这是我的代码的一个片段(请不要介意 micros 变量中的“Millis”名称和任何缺少的花括号,因为它不是纯粹的复制粘贴:p):
知道出了什么问题吗?亲切的问候,肯
c - ISR vs main:在其中一个或另一个中运行的权衡是什么?
我知道这与时间和效率有关,以及 ISR 如何从其他流程中占用时间,但我不清楚这是为什么。我总是被告知要保持 ISR 非常短。我有点困惑为什么会这样。