有些小伙伴喜欢在单片机中断里做任务,殊不知可能会因此遇到棘手的bug,然后查半天查不出个所以然。本文为了纠正这个不良习惯,对单片机中断进行阐述。
无中断时,单片机跑着主程序,当中断时,单片机进入中断服务程序。所以,中断其实是比主程序优先级更高的线程,定时中断、串口中断,每一个中断都是一个线程。既是多线程,那必然有资源共享冲突问题。所以,小小单片机,背负着“多线程”的重任。共享资源冲突,可能是全局变量访问冲突,或是函数调用冲突。
全局变量访问冲突,是在主程序中读写一个全局变量时,中断来了,在中断服务程序中又同时读写一个全局变量,得到了意想不到的结果。我举个例子,8位机的,有一个变量是Cnt,16位的,在主程序执行
Cnt = 0;
EA = 1; //开中断
while (1)