STC12C5A60S2 中断系统优先级疑问

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC12C5A60S2 中断系统优先级疑问相关的知识,希望对你有一定的参考价值。

当单片机正在执行低优先级中断函数时,高优先级中断到来。程序是 执行完低优先级中断函数再应对高优先级中断 还是 先去执行高优先级中断函数 ?
同样的,若正在执行高优先级中断函数,低优先级中断到来,程序会如何响应?

参考技术A 单片机正在执行低优先级中断函数时,高优先级中断到来,就先去执行高优先级中断函数,这就叫中断嵌套。高级中断执行结束,再继续执行低级中断。
反过来,就不会响应低级中断了。只有高级中断结束了,才能去响应低级中断的。
否则,还分什么高级和低级干什么?
虽然中断级别是这样设置的,但实际中,很难就遇到高级中断打断低级中断的情况。
因确实,几乎没有高级和低级中断同时发生的情况。
通常要求中断函数要短,不能写太多,更不允许在中断函数中延时,要及时返回主程序,以便响应其它中断。这是写中断函数的最基础要求了。追问

有个问题,我用定时器0生成PWM,定时器1用来从外部采样计算并且调整定时器0的PWM。结果就出现这种情况:由于定时器1内采样后的计算花费时间较长,一旦采样计算开始,就好像定时器0的中断被忽略了一样,PWM处于停滞状态(保持定时器1中断引发后IO的状态),直到定时器1内中断函数(采样计算)执行完成后,定时器0才会继续工作,PWM也恢复正常。这是为什么?

追答

因为定时器0和1,是同一级的(你没有设置优先级),所以,在执行定时器1的中断程序时,就不会响应定时器0的中断了。只有定时器1的中断结束后才能再响应定时器0的中断。
有两种解决方法,一是,设置定时器0中断为优先级。这样,在执行定时器1的中断程序时,定时器0可以打断。
二是,定时器1的计算放在主程序中完成,中断程序只是从外部采样,把采样的结果还回到主程序来计算,这样,就算是计算的时间再长,也会响应定时器0的中断的。
中断服务程序是不能占用过长时间的,必须要及时返回到主程序,尤其是多个中断源同时打开的情况,更为重要。

FreeRTOS - 中断使用注意

注意点:
1:首先要将中断的嵌套全部设置为抢占优先级。
2:将freertos系统内核中断(configKERNEL_INTERRUPT_PRIORITY)的优先级设置成最低。
3:将freertos的最大系统调用中断优先级(configMAX_SYSCALL_INTERRUPT_PRIORITY)设置为合适的优先级,比如11。
4:如果有用户中断函数调用到freertos提供的系统函数,一定要使用带FromISR的freertos提供的系统函数,并且这个用户中断的优先级一定要在configKERNEL_INTERRUPT_PRIORITY和configMAX_SYSCALL_INTERRUPT_PRIORITY的优先级之间,比如FREERTOS中的优先级数值设定的参数是configMAX_SYSCALL_INTERUPT_PRORITY。默认值是5,所以要想在中断中使用操作系统函数需要将中断的优先级设置的大于等于5

(原因分析:

1、执行带FromISR的FreeRTOS提供的系统函数会进入临界区,屏蔽了任务的切换,否则有高优先级的任务调用了这个系统函数,但这个系统函数的使用资格被用户中断函数霸占(低优先级),高优先级任务因为得不到操作这个系统函数的资格而被阻塞,就好像高优先级任务不能打断低优先级任务

2、如果用户中断的优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY,还调用系统函数,由于系统被此用户中断打断而不能正常运行,会导致程序出错(猜测)


5:其他没有调用到freertos提供的系统函数的中断的优先级没有特别要求。

以上是关于STC12C5A60S2 中断系统优先级疑问的主要内容,如果未能解决你的问题,请参考以下文章

stc12c5a60s2中 中断优先级控制寄存器默认都是1,1吗

STC12C5A60S2 12M 红外发射

使用stc12c5a60s2双串口单片机时 串口2的中断服务子程序怎么写呢?

开源STC12C5A60S2开发板

stc12c5a60s2 51单片机区别

用STC12C5A60S2单片机做矩阵键盘