微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机程序中融入状态机思想

单片机程序中融入状态机思想

时间:10-02 整理:3721RD 点击:

写单片机裸机程序好几年。最近才有一些心得体会。但是我的这些经验大神们确实都已经接触过了,今天想贴出来一是与大家共同学习进步,二是因为没有看书系统学习过,感觉进步比较缓慢,想得到大神的技术方向方面的指导,希望以后进步更快。
1.软件工程设计,将工程分层编写,越细越好。用户层,中层,底层驱动等等。
2.软件任务设计,将控制器要干的事情进行划分,将互相独立的事情分为任务设计。
3.软件各任务程序设计,如果任务复杂,需要不同的设备按照流程进行有序工作,采用状态机的思想执行。CASE语句比较实用。因此,就涉及到CASE中流程的划分,划分的太细不好,太粗也不好。
    switch(XLCtl_State)
  {
      case 0:
                                                XL_reg=reg;
            XLCtl_State=6;
      break;   
      case 1:
        if(Ycylinder_ForeFunc()==0)                                        //Y气缸下移
        {
            XLCtl_State=2;
        }
      break;  
      case 2:
        if(Stuff_Func(XL_reg)==0)                                                        //吸料
        {                                
            XLCtl_State=3;                                
        }                                
      break;                                
      case 3:                                
        if(Ycylinder_BackFunc()==0)                                        //Y气缸上移
        {                                
            XLCtl_State=4;                                
        }                                
      break;                                 

4.软件预留串口调试接口,在多任务运行过程中,多任务之间要协调工作,在调试时不方便监控。因此,可用一个带有缓冲区的,DMA控制的串口发送,调试信息。此调试信息需要包括单片机的运行时间(系统时钟定时器里工作)还有干了什么事情。
sprintf(u1TxBuf,"%.3fs 传送带:不允许放料\r\n",Timer/1000.0);
u1sendstr(u1TxBuf);        
5.在程序设计中,底层驱动,中层,用户层程序设计应最好高效。将延时等待程序,当作状态机的一个状态,进行管理,延时程序采用系统定时器进行计时管理。
u8 OSTimeDly (u16* ticks,tsTimerDelay * timer)
{
        switch(timer->state)                        //定时器的状态
        {
         case 0:                                                                 //定时器空闲         
                          timer->cnt = *ticks;                                       /* Load ticks in TCB         */                                            /* Find next task to run!    */
                        timer->state=1;
                 break;
         case 1:                                                          //定时器计时过程
                 if(timer->cnt ==0)
                 {
                                timer->state=0;
                 }         
                 break;
                 default :break;
        }        
        return (timer->state);
}
6.底层驱动函数编写有返回状态。

这种就玩过了

还有什么更好的经验吗?学习一下?

分时复用 对于小型MCU比较实用

是不是应该用FREE RTOS写程序

下载了 好好学习  状态机值得好好学习

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top