问题标签 [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.
windows - 为什么 Windows 设备驱动程序中断服务例程 (ISR) 是可中断的?
我是编写 Windows 设备驱动程序的新手。
我的理解是,在硬件层面,当一个x86处理器被中断时(当CPU的INTR线被设备触发时),处理器在执行中断服务程序之前清除EFLAGS寄存器的中断标志位来禁用中断( ISR)。所以通常,x86 ISR 在完成其工作并发出 IRET 指令之前不能再次被中断。但是为什么 Windows ISR 是可中断的呢?Windows ISR 是否与处理器的 ISR 相同?
根据此处,Windows 设备驱动程序 ISR 是可中断的: MSDN:Writing an ISR
stm32 - 如何从高优先级 ISR 中唤醒 FreeRtos 任务?
使用:
- Stm32F10x、F2xx、F4xx
- FreeRtos 8.1.1
- gcc-arm-none-eabi-4_8-2014q2
我有一个必须以高中断优先级运行的 ISR,因此禁止在此 ISR 中调用 FreeRtos Api(请参阅此处和此处)。
在某些情况下,这些 ISR 会检测条件,在这些条件下,休眠的 FreeRtos 任务应该以至少可能的延迟唤醒。
通常(如果由于足够低的优先级而允许 ISR 调用 FreeRtos Api)我会使用队列或信号量来解决这个问题。
但是如何通过高优先级 ISR 实现这一点?
我目前的临时方法是这样的(简要概述):
但这种方法有以下缺点:
- 延迟(从在 ISR 中设置标志直到任务唤醒)最多为 1 个 FreeRtos 滴答。
- 需要轮询标志(浪费 cpu 周期)。
有什么建议可以更好地解决这个问题,尤其是延迟更少?
c - STM32 Discovery 上看门狗定时器的中断服务程序
我最近购买了一个 STM32 价值线发现套件来与 STM32 设备配合使用。我现在正在做一个需要看门狗的项目。它在STM32中称为IWDG。但我的问题是当看门狗被触发时我需要一个 ISR。
有谁知道如何实现这个(甚至有一个例子)?
c - 从 ISR 和非 ISR 上下文中原子禁用和恢复中断:在某些平台上可能会有所不同吗?
我现在使用嵌入式产品,即 PIC32 Microchip CPU。
我熟悉几个实时内核:AVIX、FreeRTOS、TNKernel,在所有这些内核中,我们几乎都有两个版本的函数:一个用于从任务调用,第二个用于从 ISR 调用。
当然,这对于可以切换上下文和/或睡眠的函数是有意义的:显然,ISR 不能睡眠,并且应该以不同的方式进行上下文切换。但是有几个函数既不切换上下文也不休眠:比如说,它可能返回系统滴答计数,或者设置软件计时器等。
现在,我正在实现自己的内核:TNeoKernel,它具有格式良好的代码并经过仔细测试,并且有时我正在考虑发明“通用”函数:可以从任务或 ISR 上下文调用的函数。但是由于所有上述三个内核都使用单独的功能,我担心我会做错什么。
比如说,在任务和 ISR 上下文中,TNKernel 使用不同的例程来禁用/恢复中断,但据我所知,唯一可能的区别是,如果目标平台不支持,ISR 函数可能被“编译”作为优化嵌套中断。但是如果目标平台支持嵌套中断,那么禁用/恢复中断对于任务和 ISR 上下文看起来完全一样。
所以,我的问题是:在哪些平台上,从 ISR 禁用/恢复中断的操作应该与非 ISR 上下文不同?
如果没有这样的平台,我更愿意使用“通用”功能。如果您对此方法有任何意见,我们将不胜感激。
UPD:我不喜欢有两组函数,因为它们会导致明显的代码重复和复杂化。说,我需要提供一个应该启动软件定时器的功能。这是它的样子:
因此,对于几乎所有系统功能,我们都需要像上面这样的包装器。对于作为内核开发人员以及内核用户的我来说,这是一种不便。
唯一的区别是使用了不同的宏:对于任务,这些是TN_INTSAVE_DATA
, TN_INT_DIS_SAVE()
, TN_INT_RESTORE()
; 对于中断,这些是TN_INTSAVE_DATA_INT
, TN_INT_IDIS_SAVE()
, TN_INT_IRESTORE()
.
对于支持嵌套中断的平台(ARM、PIC32),这些宏是相同的。对于不支持嵌套中断的其他平台,TN_INTSAVE_DATA_INT
,TN_INT_IDIS_SAVE()
并TN_INT_IRESTORE()
扩展为空。所以有点性能优化,但是在我看来成本太高了:更难维护,用起来不太方便,而且代码量变大了。
gcc - 如何使用 C/gcc 从外围 IO 寄存器中读取数据?
我在 AVR32 上有一个中断服务路由。我需要从中断状态寄存器中读取以取消中断。但是我不使用读取的结果。我宁愿不使用 asm 指令,但我担心 gcc 会优化对虚拟变量的读取。什么是正确的方法?
目前我有:
tmp 也应该是易变的吗?我担心如果不使用 tmp,gcc 会跳过读取。
button - 带旋转编码器的 Arduino Mega 2560 中断
我开始使用 Uno,我能够从我在网上找到的旋转库中获得一个中断工作,但是当我将项目移动到 Mega 并尝试将它更改为它停止的不同引脚时。我花了几个小时试图从在线资源中找出兆的中断引脚,但找不到任何好的资源来充分解释兆中断引脚。
我正在尝试使用这样的中断。
如果有人有首选方法,我使用什么引脚进行中断并不重要。我只需要它工作。
c++ - Arduino上一次中断的多个触发器
我正在研究 Arduinos,我想使用中断来使用旋转编码器。但我想将中断代码减少到最低限度。
我可以在单个中断上使用多个触发器吗?
我想替换我的实际代码:
像这样的东西
可能吗?
real-time - 在使用 freeRTOS 实时内核 PIC32 时没有定义“mainSW1_INT_BIT”
我正在关注“使用 FreeRTOS 实时内核实用指南 - PIC32 版”。在页面的清单 52 中,没有 mainSW1_INT_BIT 的定义。我很困惑,因为我没有这本书的任何源 zip。代码片段是:
请帮忙。
c - freeRTOS 中的软件中断
我正在学习freeRTOS。我需要在 freeRTOS 中为 PIC32 平台(cerebot Mx7ck)编写软件中断 ISR 处理程序。我浏览了文档但没有帮助。请有人帮忙。
c - Spi 中断处理程序在使用 printf() 时起作用
我正在尝试在 omap 处理器和 sam4l 处理器之间启动 spi 通信。我已经配置了spi协议,omap是master。现在我看到的是我发送的测试数据在 sam4l 上正确到达,我可以看到 isr 正在打印该数据。在 isr 中在这里和那里使用更多 printf 会使操作发生并且相应的操作发生,但是如果我删除所有 printfs 我看不到任何操作发生。这种异常的原因可能是什么?这是错误频率设置的常见情况还是什么?如果需要代码,我也会发布它,但它很大。谢谢