我有一个简单的脚本:
#!/bin/bash
set -e
trap "echo BOO!" ERR
function func(){
ls /root/
}
func
Run Code Online (Sandbox Code Playgroud)
如果我的脚本失败,我想捕获ERR(因为它将在这里b/c我没有查看/ root的权限).但是,使用set -e它时不会被困住.没有set -eERR被困.
根据bash手册页,对于set -e:
... ERR上的陷阱(如果已设置)在shell退出之前执行....
为什么我的陷阱没有执行?从手册页看起来应该是这样.
我有一个Arduino Uno(很棒的小装置!).它有两个中断; 我们称他们为0和1.我使用attachInterrupt():http://www.arduino.cc/en/Reference/AttachInterrupt将一个处理程序连接到中断0,另一个处理程序用于中断1 .
中断0被触发,它调用它的处理程序,它执行一些数字运算.如果在触发中断1时中断0的处理程序仍在执行,会发生什么?
中断1中断中断0,还是中断1等待,直到中断0的处理程序执行完毕?
请注意,这个问题与Arduino有关.
embedded microcontroller arduino interrupt interrupt-handling
在研究Linux中断处理时,我发现Tasklets和SoftIRQ是执行"下半部分"(较低优先级工作)的两种不同方法.我理解这一点(非常真实的需要).
不同的是,SoftIRQ是重要的,而Tasklet则不是.同样的SoftIRQ可以在不同的CPU上运行,而Tasklets不是这种情况.
虽然我从表面上理解这一点,但我无法理解这两个特征的要求.在什么情况下我们可以使用这些设施?如何识别我现在应该使用Tasklets和SoftIRQs.
另外,Tasklets是在SoftIRQ上制作的?在我用LKML阅读的一本书中,有关删除Tasklets的争论.我完全搞砸了为什么要引入这样的功能?一些短视(没有冒犯意味着)?
任何关于此的指示都会有所帮助.
在Linux中,在用户空间代码而不是内核空间中处理设备中断的选项有哪些?
大家都知道中断处理程序应该尽可能短.并且printk在中断处理程序中添加调试等功能是不应该做的.实际上,我之前在为我编写的中断驱动的char设备调试linux内核时尝试过,它破坏了驱动程序的时序.
我的问题是,为什么会发生这种情况?
printk功能被缓冲!这意味着,据我所知,数据被插入到队列中,并且稍后处理,很可能是在中断处理程序完成之后.
那为什么不起作用呢?
我正在编写一个小内核,只是为了解决一些低级别的问题.现在,它在Virtual Box中启动,我可以在屏幕上显示文本,分配一些内存,以及其他非常基本的东西.它是用C++和一点点asm编写的.
我想探索的一件事是多任务背后的机制.据我了解,它是这样的:
因此,它在概念上似乎很简单,但我知道细节会变得更加毛茸茸.我发现了一些在线的东西,但术语变化很大,而且这些例子似乎来自我没有的上下文(比如Linux内核中的内容).
但是,设置描述符表的方式似乎是这样的:
outb以及什么不是)以初始化它.lidt.但是,我找不到具体做这些事情,或者这是否正确.有没有人有一个困惑的内核作家的资源?
在Windows上,我的平台是x86和x86-64.
中断优先级系统的要点是让最高优先级的中断超过其他中断.为了强制执行此操作,我猜测Windows将完全禁用所有较低级别的中断,直到更高级别中断的ISR完成为止.
但如果CPU没有收听中断,会发生什么?他们只是默默地消失了吗?或者他们是否在硬件中排队,等待中断再次启用?如果存放,在哪里?有多少人可以排队?如果有太多中断没有被处理,会发生什么?如果存在中断处理积压的罕见情况,检测问题的工具是什么?
我正在使用STM32F107芯片在C中进行一些开发,并且在某些时候,当我调用特定函数时,设备开始重置.我没有调试器,我的调试只是串口上的纯文本.
我已经使用了一些其他的微控制器,我可以访问寄存器来查看复位的原因,但我似乎无法找到该器件的等效器件.我知道Cortex-M3的硬件异常,但我不知道其中一个是否被触发,因为当我进入这些处理程序时,我似乎无法通过usart发送文本(可能是因为我的TX功能使用中断?).
所以,我决定在这个设备中询问比我更多经验的人:调试这些情况通常会做些什么?
编辑
其中一个开发人员激活了WWDG监视器,它在我从故障处理程序获取信息之前重置了硬件.由于指向错误位置的指针调用函数,这是一个硬故障.但是,我会保留这个问题,希望有人能提供更多的细节(或关于它的材料),以便从保存的寄存器中指回C代码,比如硬故障(@dwelch的想法).
嵌入式编程中最常听到的建议是"保持中断时间短".
现在我的情况是我的main()循环中有一个非常长的运行任务(将大块数据写入SD卡),有时需要100ms.因此,为了保持我的系统响应,我将所有其他内容移动到了中断处理程序.
例如,通常可以在中断中处理传入的UART数据,然后在main()循环中处理传入的命令,然后发回响应.但在我的情况下,命令的整个处理/处理也在中断中进行,因为我的main()循环可以被阻塞(相对)长时间.
最佳解决方案是切换到RTOS,但我没有RAM.我的设计是否有替代方案可以缩短中断时间?
当进入一个inteerupt处理程序时,我们首先在该cpu上"禁用中断"(使用类似x86上的cli指令).在禁用中断期间,假设用户按下键盘上的字母'a',这通常会导致中断.但由于中断被禁用,这是否意味着: