中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于__interrupt、#program interrupt等。当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。
中断服务程序需要满足如下要求:
(1)不能返回值;
(2)不能向ISR传递参数;
(3) ISR应该尽可能的短小精悍;
(4) printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。
个人的一点理解
如果说中断服务程序有返回值,那么它的值返回给谁呢?
在系统的运行过程中,一定是某种中断源出发了相应的中断,系统上挂接的中断服务程序进行现场的处理,例如告警等操作,然后清中断。
也就是说,中断服务程序链接在某一类中断源上,而这些中断源的产生是随机的,所以,中断服务程序并没有一个固定的调用者,也没有固定的返回地址,所以返回值也没有用吧。
关键字:中断服务函数 编写要求
引用地址:
中断服务函数的编写要求
推荐阅读最新更新时间:2024-03-16 16:18
MSP430中断服务函数的定义
//为了保证代码可以在IAR编译器的任何版本中都能正确得到编译,所以作以下的条件编译。 #ifdef __IAR_SYSTEMS_ICC__ //如果编译器是IAR, 那么以下将被编译。 #if __VER__ = 200 #pragma vector=USART0RX_VECTOR //在IAR2.0以上中断函数声明。 __interrupt void SPI0_rx (void) #else //在IAR2.0以下中断函数声明。 interrupt void SPI0_rx (void) #endif
[单片机]
keil里中断服务函数设置标志位时加volatile
在中断服务函数中,如果设置标志位,然后其他函数判断标志位,需要设置全局变量来实现。全局变量的声明中需要添加修饰符volatile,防止编译器对变量进行优化,导致程序出错。 下面是volatile的用法说明: volatile用于防止相关变量被优化。 例如对外部寄存器的读写。对有些外部设备的寄存器来说,读写操作可能都会引发一定硬件操作,但是如果不加volatile,编译器会把这些寄存器作为普通变量处理,例如连续多次的对同一地址写入,会被优化为只有最后一次的写入。实际上,网卡的数据发送,就是按顺序连续往一个同地址写入数据,如果被优化,网卡将不能正常驱动。对于外部寄存器的读写,经常用 XBYTE,其实你看一下XBYTE
[单片机]
STM32接收中断服务函数打印函数会造成错误
在中断服务函数里面,千万不能用打印函数,因为打印函数的时间太长,会使中断服务函数长时间没有退出去,将会造成一些想不到的结果。 例如在串口中断中: void USART2_IRQHandler(void) { unsigned char res; uint16_t uhdata; uint16_t uhMask = (&huart2)- Mask; //if(USART2- ISR&(1 5))//????? if(((READ_REG((&huart2)- Instance- ISR) & USART_ISR_RXNE) != RESET) && ((READ_REG((&huart2)- Instan
[单片机]