单片机/MCU论坛
直播中

小米999999

10年用户 146经验值
擅长:可编程逻辑
私信 关注
[文章]

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

本帖最后由 小米999999 于 2017-3-10 13:09 编辑

单片机裸机程序好几年。最近才有一些心得体会。但是我的这些经验大神们确实都已经接触过了,今天想贴出来一是与大家共同学习进步,二是因为没有看书系统学习过,感觉进步比较缓慢,想得到大神的技术方向方面的指导,希望以后进步更快。
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 传送带:不允许放料rn",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.底层驱动函数编写有返回状态。



回帖(6)

猎国倾城

2017-3-10 13:17:14
这种就玩过了
举报

小米999999

2017-3-10 13:28:50
引用: 猎国倾城 发表于 2017-3-10 13:17
这种就玩过了

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

刘旭

2017-3-10 13:44:54
分时复用 对于小型MCU比较实用
举报

小米999999

2017-3-10 14:58:21
引用: hobbye501 发表于 2017-3-10 13:44
分时复用 对于小型MCU比较实用

是不是应该用FREE RTOS写程序
举报

无相神功

2017-10-7 09:43:53
下载了 好好学习  状态机值得好好学习
1 举报

单枪舞九州

2018-2-7 08:03:17
支持下最近在看
1 举报

更多回帖

发帖
×
20
完善资料,
赚取积分