打印

不错的**!!!

[复制链接]
楼主: jxyhome
手机看帖
扫描二维码
随时随地手机跟帖
61
hsw_21| | 2007-9-5 17:06 | 只看该作者 回帖奖励 |倒序浏览

板凳

使用特权

评论回复
62
一级菜鸟| | 2007-9-5 17:13 | 只看该作者

这样呢?是不是更简单明快点?


SIGNAL (SIG_USART_RECV)
{
 unsigned char UARTemp;
 UARTemp=UDR0;
 UARTTimer = 0x2;
 if (!(UARTStatu & _BV(HeadIn)))
 {
  if (UARTemp!=HeadChar)
   return;
  else
  {
   UARTStatu |= _BV(HeadIn);
   return;
  }
 }
 if (!(UARTStatu & _BV(LengtIn)))
 {
  DataLong=UARTemp;
  if (DataLong > MAXLength)
  {
   UARTStatu = 0;
   return;
  }
  UARTbuffer[0]=UARTemp;
  ByteOfRead=0;
  UARTStatu |= _BV(LengtIn);
  return;
 }
 if (ByteOfRead < DataLong)
 {
  UARTbuffer[ByteOfRead+1]=UARTemp;
  if (ByteOfRead < MAXLength)
   ByteOfRead++;
  if (ByteOfRead == DataLong)
  {
   if (UARTemp == Crc8fun(UARTbuffer,DataLong))
    UARTStatu |= _BV(PackageOk);
   else
    UARTStatu=0;
  }
 }
}

使用特权

评论回复
63
wy3168| | 2007-9-5 21:55 | 只看该作者

跟着学习了

使用特权

评论回复
64
ipman| | 2009-10-26 00:22 | 只看该作者
在大量数据交换通讯应用中,使用状态机确实会拉低系统实时性,使用超时解析对于大量数据突发访问会带来溢出风险,视不同应用采取不同处理方法,实时性要求很强的通讯我一般在协议上下功夫,定义一个结束符,一旦判断到结束符在中断中解析完并发送消息到队列中,保证不丢失消息,但需要评估解析需要消耗的CPU运行时间必须小于一个字节的接收时间。

使用特权

评论回复
65
红金龙吸味| | 2009-10-26 08:21 | 只看该作者
不错,读这样的**如饮甘露。

使用特权

评论回复
66
desert_hawk| | 2009-10-26 08:23 | 只看该作者
“为了防止在处理数据过程中不受干扰,通常在处理接受数据前关闭中断,处理完后再开。
static void UartInterruptService(void) interrupt 4
{
    ES = 0;
    RI = 0;
    uart_process(SBUF);
    ES=1;
}”
--------51的串口中断函数里就不用再关闭串口中断允许了吧,因为自己是不能抢占自己的。

“其实很多时候,对于通讯传输的数据处理才是关键,尤其对于设计通讯协议而言。笔者在刚刚做的一个系统上就碰到这样的问题,当系统庞大了,资源十分有限的情况下,数据处理一旦占用资源太多,效率太低将导致系统崩溃而无法运行。”

---------这很有可能是没有充足的堆栈空间造成的。一般至少得留下十几个字节的RAM做堆栈。

使用特权

评论回复
67
huajinz| | 2009-10-26 08:28 | 只看该作者
不错,值得一看

使用特权

评论回复
68
kanke100| | 2009-10-26 08:50 | 只看该作者
做个记号,以后用的时候方便!:)

使用特权

评论回复
69
ytmkkk1986| | 2009-10-26 08:52 | 只看该作者
来一下!

使用特权

评论回复
70
lhj200304| | 2009-10-26 09:03 | 只看该作者
陈明计和周航慈有详细的介绍,陈明计的在《嵌入式实时操作系统SMALL RTOS51原理及应用》,周航慈在那本介绍ucos的书里面

使用特权

评论回复
71
LiangXinJi| | 2009-10-26 10:04 | 只看该作者
呵呵,我做串口都怎么做的!

使用特权

评论回复
72
LiangXinJi| | 2009-10-26 10:13 | 只看该作者
if(RI)
        {
                RI=0;
                //P22=0;
                Incept_data=SBUF;
                if(Incept_Status==0x00)    //中断处于接收起始帧阶段
                   {
                                if(Incept_data==Frame_Head)
                                        { Incept_Status=0x01;//更新接收状态标志为接收命令码
                                         //P23=0;
                                         }
                                else
                                        Incept_Status=0x00;
                        }
             if(Incept_Status==0x01)
                          {
                                if(Incept_data==Frame_SetSimulate_Orde) //如果是设置帧命令,则立设置标志
                                        {        //P34=0;
                                                command_marker=Frame_SetSimulate_Orde;
                                                Incept_Status=0x02;//更新接收状态标志为接收帧长码
                                        }
                                else if(Incept_data==Frame_SetDigital_Orde)
                                        {        command_marker=Frame_SetDigital_Orde;
                                                Incept_Status=0x02;        //        P11=0;
                                        }
                                else if(Incept_data==Frame_Gather_Orde) //实时数据采集帧命令,则立设置标志
                                        {
                                                command_marker=Frame_Gather_Orde;
                                                Incept_Status=0x02;
                                               
                                        }
                               
                                syscheckData=0;   //准备进行数据和校验
                                return;
                        }
                if(Incept_Status==0x02)         //接收帧长
                          {//        P35=0;
                                FrameLen=Incept_data;         
                                syscheckData+=FrameLen;          //更新累加和校验信息
                                Incept_Status=0x03;            //更新接收状态标志为接收数据码
                                return;
                }
                if(Incept_Status==0x03)         
                        {
                        Incept_DataStream[RecCount]=Incept_data;
                        syscheckData+=Incept_DataStream[RecCount]; //更新累加和校验信息
                                RecCount++;
                                if(command_marker==Frame_SetSimulate_Orde)
                                        {
                                                if(RecCount==FrameLen)
                                                        {         //        P36=0;       
                                                                 RecCount=0;
                                                                Incept_Status=0x04;          //更新接收状态为接收校验码信息
                                                        }
                                          
                                        }
                                if(command_marker==Frame_SetDigital_Orde)
                                        {
                                                if(RecCount==FrameLen)
                                                        {       
                                                                 RecCount=0;
                                                                Incept_Status=0x04;          //更新接收状态为接收校验码信息
                                                        }
                                          
                                        }
                                if(command_marker==Frame_Gather_Orde)
                                        {
                                                if(RecCount==FrameLen)
                                                {
                                                        RecCount=0;
                                                        Incept_Status=0x04        ;     ////更新接收状态为接收校验码信息
                                                }
                                          
                                        }
                                return;

                        }
                if(Incept_Status==0x04)       
                        {
                                checkData=Incept_data;
                                if(syscheckData!=checkData)                       //如校验出错
                                        Incept_Status=0x00;
                                else
                                        {Incept_Status=0x05;P37=0;}        //P15=0;
                                        syscheckData=0;
                                return;
                                       
                        }
                if(Incept_Status==0x05)
                        {
                                if(Incept_data!=Frame_End)//错误帧标志
                     b_valid_Frame=0;
                                else                                                          
                                   { b_valid_Frame=1;}           //P16=0;
                                        
                                        Incept_Status=0x00;
                        }       

        }
}

使用特权

评论回复
73
LYXQ| | 2009-10-26 10:33 | 只看该作者
编程序每个人的思路都不同,感觉收发都在中断里做会更好,这个程序进来就关中断不是太好吧?

使用特权

评论回复
74
huangqi412| | 2009-10-26 12:24 | 只看该作者
挖坟?

使用特权

评论回复
75
ecomputer| | 2009-10-29 10:13 | 只看该作者
正遇到这个问题,不过我现在也是楼主这么做的,

使用特权

评论回复
76
my1693| | 2009-10-29 14:46 | 只看该作者
顶一个,学习一下!

使用特权

评论回复
77
xlsbz| | 2009-12-11 22:41 | 只看该作者
本帖最后由 xlsbz 于 2009-12-11 23:53 编辑

我总感觉楼主的程序是垃圾程序的典范!
嗨!:dizzy:


看出来了,俺水平太差,看了半天我也没有理解楼主是什么意思!
哪位给我指点指点!
其实很多时候,对于通讯传输的数据处理才是关键,尤其对于设计通讯协议而言。笔者在刚刚做的一个系统上就碰到这样的问题,当系统庞大了,资源十分有限的情况下,数据处理一旦占用资源太多,效率太低将导致系统崩溃而无法运行。
到了这里,很多工程师可能会考虑开个大的缓冲区FIFO将接收到的数据保存在缓冲区,然后对其进行解析、判断进行下一步程序编写,当然这在系统资源比较丰富的情况下是没有问题的,ARM上采取的就是这样的方式。但如何系统庞大呢,留给的资源缺乏则不行。这样做的一个很大缺点必须是将数据帧接收完了才能够判断,降低了效率和运行速度
其实还有另外的方式,可以采取在每接收一个字节就对其解析,解析完判断转到下一个状态,并将其中的有用数据存储在相应的数据结构中去,可以采取状态机实现。


这段意思是不是这样:楼主以为先判断后接收效率高、省资源。 先接收后判断就“降低了效率和运行速度”。

我就没有看出到底哪里省资源了?
效率怎么就高了?

谁能指点一下?多谢!

使用特权

评论回复
78
xlsbz| | 2009-12-12 22:58 | 只看该作者
:lol

使用特权

评论回复
79
xlsbz| | 2009-12-16 12:17 | 只看该作者
:victory:

使用特权

评论回复
80
yixiao2000| | 2009-12-16 14:49 | 只看该作者
直接把处理函数写在中断处理函数中不利于代码移植重用和维护,在大程序中这种架构不应提倡

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则