系统假设:单CPU,无操作系统单片机模式
使用资源:UART作为调试输出,HDMI控制信号中断 (CEC)
其他情况:UART也被main-loop使用
uart打印函数:printf(char){ sbuf = char; while(!TI); }
软件设计: 在CEC中断信号处理程序中,加入UART的打印信息,会有什么问题?
问题: 系统经常会挂掉。
原因: 陷入while死循环;
因为UART输出数据流,即使只是一个byte也有8个bit,以UART的shift数据速率(波特率),需要N个machine cycles,如果main函数正在打印,被中断信号处理程序插入进来,也来调用uart输出,当中断用完uart后,中断返回到刚才main的打印过程中:分两种情况,如果刚好uart不在shift数据途中,那么返回后可以继续正常使用uart,如果刚好在shift数据过程中,那么while的条件永远没法满足了,因为sbuf已经被中断程序占用过,不再有数据,那么Tx-Interrupt永远不会发生。
总结:
非顺序共享某资源(硬件或者buffer)的时候,一定要保证“独占性”;
非顺序调用某函数时候,一定要保证“可重入”,即函数使用的资源都是temp的,即调即分配,用完就释放;