本帖最后由 刘前辈 于 2010-6-8 13:47 编辑
static void UartInterruptService(void) interrupt 4
{
ES = 0;
RI = 0;
uart_process(SBUF);
ES=1;
}
LZ的开篇确实值得质疑,上面66楼网友讲的正根:“ES不可能自己抢占自己。”串口中断硬件内部已经设计好了这种关系:(Intel硬件设计师是干什么的?如果我是硬件设计师,我怎么会把这种关系留给软件设计员?)——首次ES中断发生并进入ISR之后,必然阻断后面的同级中断(如若有的话)并使其进入中断队列排序等待,只有当前ISR完成,RETI 退出串口中断程序之后,此前纪录的、位于队列中的ES=1才会再次触发串口中断。所以,LZ的开篇程序是不是一开始就没写好?后面.....
static void UartInterruptService(void) interrupt 4
{
//ES = 0;
RI = 0;
uart_process(SBUF);
// ES=1;
}
其实我最近一直不好处理的问题是:你在一帧数据接收过程中,如果半中间突然应该来的数据中止不来了,怎么办?你的while(RI !=1) ; RI=0;该如何处理才不至于死等?才可能尽快退出当前状态?——你如何尽快感知到通信失效?我知道是利用T0超时,可是怎么写才简单?接收100字节一帧,就要设置100次T0初值?太呆板了吧。(当然可以用宏指令)如若每接收到第50字节时就发生中止或错误接收现象,只好一帧重新来过,以前的都白干!
如何才能提高通信系统可靠性? |