驱动程序的开发经验:中断与中断

系统假设:单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的,即调即分配,用完就释放;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值