新手问一个关于状态机简单问题,刚刚开始接触

2019-08-16 19:07发布

本帖最后由 东北小辉辉 于 2016-6-24 17:28 编辑

RT,小弟最近刚刚开始接触一些状态机和操作系统的书,有一个编程思路想来问一下大家。

我现在想实现一种时间触发的状态机调度模式,主函数打算用switch case来写,但是现在有一点想不通,就是如何处理一个运行时间比较长的任务?

举个例子,比如我现在的功能是用sim900发短信,这个应用,那么发短信之前,首先,发送AT指令,同步波特率,等待返回OK,然后发送ATE关闭回显,等待返回OK,之后还有设置文本模式等等,一直到最后把短信内容发送出去,这是一个完整的任务,假设运行时间为150ms,当然,程序语句的执行时间是很短的,主要时间浪费在了判断是否发送成功的那个OK上,假设这个接收到OK的时间是15ms,这里不能用while死等,因为我这里只有一个应用,我采用了休眠的方式,然后用一个时基定时器来唤醒。

这个任务我如何来进行状态划分?如果按照15ms的时间,分成case1到case10的话状态是不是太多了?如果某个任务需要运行1s的时候怎么办,难道要100个case,那样程序会很混乱,可读性也不好。

现在考虑的还是只有一个任务,不涉及和其他任务通信的功能,也不涉及外部到来的事件。

大致写一下程序的框架.

原本的顺序编程模式

void main( void )
{
    while( 1 )
    {
        发送AT
        等待接收OK
        发送ATE
        等待接收OK
        ...
        等待接收OK
        发送短信内容
    }
}

现在我考虑的模式

void main( void )
{
    while(1)
    {
        switch( state )
        {
            case 1:
            {
                发送AT
                休眠
                break;
            }
            case 2://时间到15ms
            {
                if( 接收到OK )
                {
                    发送ATE
                }
                else
                {
                    //发送失败
                    //异常处理
                }
                休眠
                break;
            }
            ...
            case 10://时间到150ms
            {
                if( 接收到OK )
                {
                    发送短信内容
                }
                else
                {
                    //发送失败
                    //异常处理
                }
                休眠
                break;
            }
        }
    }
}

定时器中断
{
    清中断
    state++;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。