中断是嵌入式系统中重要的组成部分,可是在标准C中不包含中断。许多编译开发商在标准C上增长了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),相似于__interrupt、#program interrupt等。当一个函数被定义为ISR的时候,编译器会自动为该函数增长中断服务程序所须要的中断现场入栈和出栈代码。
中断服务程序须要知足以下要求:
(1)不能返回值;
(2)不能向ISR传递参数;
(3) ISR应该尽量的短小精悍;
(4) printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。函数
参阅网上资料和我的的一些理解性能
a.为何不能有返回值?spa
中断服务函数的调用是硬件级别的,当中断产生,pc指针强制跳转到对应的中断服务函数入口,进入中断具备随机性,并非某段代码对其进行调用,那么若是有返回值它的返回值返回给谁?显然这个返回值毫无心义,若是有返回值,它一定须要进行压栈操做,这样一来什么时候出栈怎么出栈将变得没法解决。指针
b.不能向ISR传递参数?orm
同理,也是因为这样会破坏栈的缘由,由于函数传递参数一定会要求压栈出栈操做,因为进入中断服务函数的随机行,谁给它传递参数都成问题开发
c.ISR应尽量的短小精悍?编译器
若是某个中断频繁产生,而它对应的ISR至关的耗时,那么对中断的响应就会无限的延迟,会丢掉不少的中断请求编译
d.printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。变量
这就涉及到一个中断嵌套问题,因为printf之类的glibc函数采用的是缓冲机制,这个缓冲区是共享的,至关于一个全局变量,第一层中断来时,它向缓冲里面写入一些部份内容,刚好这时来了个优先级更高的中断,它一样调用了printf,也向缓冲里面写入一些内容,这样缓冲区的内容就错乱了。硬件