我有一个场景,我有一个线程在等待和执行任务之间循环.但是,我想中断线程的等待(如果你愿意的话,跳过剩下的等待)并继续执行任务.
任何人都有任何想法如何做到这一点?
我正在编写自己的操作系统,需要知道如何修改中断表,以便将某些(打印字符串等)重定向到命令提示应用程序,类似于DOS的操作方式.
中断处理程序是否使用被中断的任务的堆栈或单独的堆栈作为其堆栈?(PowerPC,VxWorks)
我正在浏览关于线程的oracle java教程,我看到了这个例子
src:http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
如果一个线程长时间没有调用抛出InterruptedException的方法怎么办?然后它必须定期调用Thread.interrupted,如果收到中断,则返回true.例如:
for (int i = 0; i < inputs.length; i++) {
heavyCrunch(inputs[i]);
if (Thread.interrupted()) {
// We've been interrupted: no more crunching.
return;
}
Run Code Online (Sandbox Code Playgroud)
该教程补充说: 中断机制是使用称为中断状态的内部标志实现的.调用Thread.interrupt设置此标志.当线程通过调用静态方法Thread.interrupted来检查中断时,将清除中断状态.非静态isInterrupted方法,由一个线程用于查询另一个线程的中断状态,不会更改中断状态标志.
按照惯例,任何通过抛出InterruptedException退出的方法都会在执行此操作时清除中断状态.但是,通过另一个调用中断的线程,总是可以立即再次设置中断状态.
现在我很困惑.它什么时候发生?如果有中断,那么线程是否应该收到InterruptedException?
有人可能会使用这些检查代码的方法吗?Thread.interrupt(标志)是静态的,所以通过上面的检查,我们实际检查是否有任何踏板被中断?即使是这种情况,根据教程,当线程通过调用静态方法Thread.interrupted来检查中断时,中断状态被清除. 或者通过抛出InterruptedException退出的任何方法都会在执行此操作时清除中断状态
那么,我错过了什么吗?或者这只是有用的,如果某个线程收到了一个中断,但没有检查它,或者没有抛出它?
在python中,是否可以使用KeyboardInterrupt或CTRL + C来打印状态消息,可能像打印变量的内容然后继续执行?或者Interrupts会不会杀死这个过程?
我想做的一个例子:
def signal_handler(signum, frame):
global interrupted
interrupted = True
while true:
update(V)
if interrupted:
print V
Run Code Online (Sandbox Code Playgroud) ROM或RAM中的中断向量表是?如果它在RAM中,它从哪里加载?此外,该表是否依赖于操作系统?例如,在MS-DOS中,"int 0x80"用于播放音乐和内容,但在Linux中它是一个系统调用.那么,在MS-DOS中,操作系统或ROM是否处理中断0x80?如果它在ROM中,Linux是否会覆盖表项?
我正在使用 16F1703 PIC mcu,我想通过触摸按钮(A1)开始一个 7 段液晶循环(0-9)循环,之后如果我触摸按钮(A1)两次,我想要图片进入睡眠模式。
为此,我实现了这个:
#include <test_interrupt.h>
byte const DataExit[10]={0b01000100,
0b01011111,
0b01100010,
0b01001010,
0b01011001,
0b11001000,
0b11000000,
0b01011110,
0b01000000,
0b01001000};
byte const bitMask[8]={1,2,4,8,16,32,64,128};
//show seven numbers
void segmentCycle(void){
int i, j;
for(i=0;i<10;i++){
for (j=0; j<8;j++){
output_low(CLK);
output_bit(DATA,DataExit[i] & bitMask[j]);
output_high(CLK);
}
delay_ms(7000);
output_low(CLR);
delay_ms(6000);
output_high(CLR);
}
}
#INT_IOC
void IOC_isr(void)
{
segmentCycle();
sleep();
}
void main()
{
port_a_pullups(0x02);
enable_interrupts(INT_IOC_A1);
enable_interrupts(INT_IOC_A1_H2L);
enable_interrupts(GLOBAL);
while(TRUE);
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我触摸按钮,有时它会启动,否则不会。你有什么建议?
我正在使用 ccs 编译器。
在 AT91SAM9263 数据表中,它提到了 2 个寄存器:
中断禁止命令寄存器
中断清除命令寄存器
它们之间有什么区别?
我正在尝试以中断模式接收来自USART的通信。调试器向我展示了在按键时调用了中断,但是执行陷入了向量表定义。
我用以下命令初始化我的art。
static void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 19200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE END USART2_Init 2 */
LED_Initialize();
USART2->CR1=USART_CR1_RE|USART_CR1_TE|USART_CR1_UE|USART_CR1_RXNEIE; // Enable interrupt
NVIC_SetPriority(USART2_IRQn, 2); // set priority level
NVIC_EnableIRQ(USART2_IRQn); // Enable in NVIC
}
void USART2_IRQHandler(void)
{
blink_led();
}
Run Code Online (Sandbox Code Playgroud)
如果我以调试模式运行该应用程序,按下一个键,然后停止并逐步执行代码,我发现它在包含的startup_stm32f446xx.s内部的分支指令上循环。
USART2_IRQHandler
B USART2_IRQHandler
PUBWEAK USART3_IRQHandler
SECTION .text:CODE:REORDER:NOROOT(1)
Run Code Online (Sandbox Code Playgroud)
因此,我知道该中断正在生成,但似乎找不到我的处理程序。即使不在调试模式下,我的LED也不会闪烁,这是我已经单独测试的功能。我不确定此问题是否来自HAL库。我通读了他们的文档及其NVIC启用说明的变体,以得到相同的结果。usart在轮询中工作正常,但我需要中断其功能。
我现在有一些代码希望在Teensy 3.6微控制器上的基于计时器的中断中运行。该代码访问类的[global]对象数组。我已经将该数组和所有成员变量标记为volatile,我认为这是正确处理中断的第一步。
我标记为volatile的成员变量之一是std :: bitset,我想称其为非易失性方法,我不能这样做
"passing 'volatile std::bitset<16u>' as 'this' argument discards qualifiers [-fpermissive]"
Run Code Online (Sandbox Code Playgroud)
我想我可以复制位集库并将所有内容切换为volatile,但是我认为这不是必需的,所以我认为有更好的解决方案,或者我在错误地考虑问题。
请让我知道应该怎么做。
这些答案似乎建议在ISR和多线程程序中访问ISR中的全局变量时使用volatile: C'Volatile'关键字?,
在中断例程中使用C ++对象(和volatile)的正确方法是什么?,
这是许多建议使用的外部资源的补充。也许我的原始信息不清楚,或者我的情况与此不同。