当内存位置发生变化或被写入时,我需要生成一个中断.从ISR,我可以触发一个蓝屏,它给我一个很好的堆栈跟踪方法名称.
我发现这个解决方案知道一个线程是否被中断了.
public class OurThread extends Thread(){
private volatile boolean stop = false;
public void run(){
while (!stop) {
//Do your actions
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是我的run方法只执行一次,所以将insisde放在while循环中是没有意义的.我发现的另一种方法是检查Thread.isInterrupted()标志,然后终止线程.我的run()方法很长,所以我必须检查很多次这种情况使我的代码变脏.
我必须将它应用到四个不同的过程中,所以我试图找到一个更简单,更清洁的方法.我希望是否有类似的东西:
try{//my code}
catch(interrumption)
Run Code Online (Sandbox Code Playgroud)
问题是,由于我的线程是通过使用future.cancel()进行中断的,因此我的run()代码中没有抛出中断,然后我也无法做到这一点.
有什么建议吗?到目前为止,如果线程被取消,我会在代码之间检查很多次.谢谢 :)
我只是想知道这个线程是否正在中断,如果我做得对吗?如果我错了,请告诉我
public void run(){
int i;
while(!Thread.currentThread().isInterrupted()){
for(i=1;i<=100;i++){
System.out.println("THREAD VALUE AFTER 1 SECOND IS: "+i);
if(i==3){
Thread.currentThread().interrupt();
gotoInform();
break;
}
try{
Thread.currentThread().sleep(1000);////to sleep the Thread for 1 Second (1000ms)
}
catch(Exception e){
System.out.printf("Error"+e);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用最新的CCS和MSP-GCC编译器.以下代码
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{...isr}
Run Code Online (Sandbox Code Playgroud)
这是TI宣布ISR-s的最新官方支持的方法不起作用,我得到以下编译器消息:
warning: ignoring #pragma vector [-Wunknown-pragmas]
#pragma vector=USCI_A1_VECTOR
^
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
__interrupt void USCI_A1_ISR(void)
Run Code Online (Sandbox Code Playgroud)
我也尝试过不同的方法,比如:
interrupt(USCI_A1_VECTOR) USCI_A1_ISR(void) { //code goes here}
Run Code Online (Sandbox Code Playgroud)
这给出了错误:
c:/ti/ccsv6/ccs_base/msp430/include_gcc/msp430f5529.h:5328:33: error: expected declaration specifiers or '...' before '(' token
#define USCI_A1_VECTOR (47) /* 0xFFDC USCI A1 Receive/Transmit */
^
../uart_printf.c:40:11: note: in expansion of macro 'USCI_A1_VECTOR'
interrupt(USCI_A1_VECTOR) USCI_A1_ISR(void)
^
Run Code Online (Sandbox Code Playgroud)
这似乎工作:
__attribute__((interrupt(USCI_A1_VECTOR)))
void USCI_A1_ISR(void){ //code goes here }
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
有没有办法停止使用Matlab/GNU Octave中的'run'或'source'启动的脚本?我的意思是与Ctrl-C不同,比如给定的条件(可能由全局变量给出)保持并且向它发送中断信号.
例:
haltable.m当environment变量的值大于0.5 时,将停止脚本.
global environment
while (true)
environment = rand;
endwhile
Run Code Online (Sandbox Code Playgroud)
它推出了
global environment
run ('haltable.m')
Run Code Online (Sandbox Code Playgroud)
haltable.m当然(在当然之外)可以指定它必须在条件满足后停止吗?
我正在Ruby中编写一个小型命令行程序,用于查找特定文件夹中的更改.
该程序每隔几秒重复一次循环,看是否有变化.要停止程序,用户可以使用Ctrl + C(将^ C发送到控制台).
现在,当发生这种情况时,Ruby会发送以下堆栈跟踪:
^C./filename.rb:64:in `sleep': Interrupt
from ./filename.rb:64:in `block in parse'
from ./filename.rb:62:in `loop'
from ./filename.rb:62:in `parse'
from ./filename.rb:124:in `<main>'
Run Code Online (Sandbox Code Playgroud)
我想改变它以显示一条 Exiting now...消息,类似于Rails以这种方式关闭时显示的程序.
如何才能做到这一点?
我使用SW4STM32工具链,我想在STM32103RET中溢出时使用timer2来领导LED,这是我打开LED的功能。
void TurnOnLed(){
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET);
}
void TurnOffLed()
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET);
}
Run Code Online (Sandbox Code Playgroud)
由stm32多维数据集mx设置了timer2初始化,但是我不知道当timer2溢出时调用哪个函数?
我无法找到有关MC68000在外部中断期间是否保留其状态寄存器/ CCR的任何信息.我想如果CPU在条件分支之前立即中断并且中断修改CCR将是一个问题.现在我的中断代码如下所示:
ORG $110000 ; Location of IPL6 vector
IPL6 MOVE.W SR, -(SP) ; Is this line necessary?
MOVE.L D0, -(SP)
; Perform interrupt tasks here
MOVE.L (SP)+, D0
MOVE.W (SP)+, SR ; Is this line necessary?
RTE ; Return
Run Code Online (Sandbox Code Playgroud)
我想知道是否需要从堆栈中推送/弹出SR的指示行,或者CPU是否在中断期间自动保存和恢复SR.
我读过OSDev Wiki的一篇文章,而不是IRQ#1匹配键盘.但PIC如何知道键盘是键盘,那么它应该映射到IRQ#1?
hardware assembly operating-system interrupt interrupt-handling
我想使用Web Workers对数组进行排序.但是这个数组可能会随着时间的推移接收到新值,而worker仍在执行sort函数.
所以我的问题是,如何在收到新项目后"停止"工作者的排序计算,这样它就可以对该项目执行数组排序,同时仍然保留已经进行的排序?
例:
let worker = new Worker('worker.js');
let list = [10,1,5,2,14,3];
worker.postMessage({ list });
setInterval(() => worker.postMessage({ num: SOME_RANDOM_NUM, list }), 100);
worker.onmessage = event => {
list = event.data.list;
}
Run Code Online (Sandbox Code Playgroud)
让我们说,我已经过了50岁,工人在此之前在排序方面取得了一些进展,现在我有这样的事情:
[1, 2, 3, 10, 5, 14, 50].这意味着排序在索引处停止3.所以我将这个new数组传递回worker,因此它可以继续从位置进行排序3.
我怎样才能实现这一点,因为没有办法暂停/恢复网络工作者?