中断服务函数(ISR)
今天来学习记录下中断服务函数(ISR)。关于中断,其实大家或多或少都会了解过,那么,在笔试&面试中,关于中断服务子函数,我们又需要知道那些知识点?
1.中断服务函数4大注意点
1. 中断服务函数不能有返回值;
2. 中断服务函数不能传入参数;
3. 中断服务函数要短小精悍;
4. 中断服务函数中不能使用printf等glibc函数,会带来重入性和性能问题;
解析:首先,中断源连接到硬件,由硬件来触发产生中断,即:中断源提出中断申请,而中断申请一般由硬件电路产生,申请提出时间是随机的,因此中断的产生是随机的,也就是说,中断服务函数的调用是硬件级别的。当中断产生时,pc指针强制跳转到相应的中断服务函数入口执行中断服务函数。
1)关于返回值,需要进行入栈出栈操作。由于中断是随机的,且由硬件告知,并不是由某段代码调用,所以,如果有返回值那么返回值将返回给谁?显然,这是毫无意义的!也就是说,如果中断服务函数有返回值,返回时将返回值压入栈中后,那么何时出栈、如何出栈?
2)关于传入参数,这和返回值类似,也需要入栈出栈,那么什么时候入栈,谁给它传递参数?
3)至于ISR要短小精悍就更好理解了。假设存在一个中断,其中断产生的次数较为频繁,而它对应ISR耗时较长,那么对于中断的响应就会无限的延迟,从而会错过很多中断请求;
4)关于printf函数带来的重入性和性能问题,需要了解像printf这样的glibc函数,其采用的是缓冲机制,该缓冲区域是共享的,可以理解为全局变量。当某个中断发生时,向缓冲区中写入某些内容,而恰巧此时来了一个更高级的中断,它同样调用了printf函数,也向缓冲区中写入某些内容,此时,缓冲区中的内容就混乱了。
2.中断和调用子程序的那点破事
中断和子程序的调用有一定的相