搜索
bottom↓
回复: 13

基于队列状态机的生产者消费者模型(QSM-PC)下位机移植

[复制链接]

出0入0汤圆

发表于 2011-3-11 10:45:47 | 显示全部楼层 |阅读模式
用了一段时间的LabVIEW,发现一种叫QSM-PC(基于队列状态机的生产者消费者模型)特别实用、稳定,于是根据自己理解,将其移植到了下位机,欢迎大家讨论。。。。


/*===========================================================================
*  程序名称:                                        
*  源文件名:  QSM_PC.c                                                                   
*  创建日期:  2011年3月
*  作    者:  Shaw                                                               
*  网    站:                                                                               
*  版本说明:  v1.0                                                                                         
*---------------------------------------------------------------------------
*  硬件环境:                                                                                 
*                     Proteus仿真,ATmega128单片机,CPU时钟为内部1MHz                                    
*---------------------------------------------------------------------------
*  软件环境:                                                                                                  
*                     AVR studio 4.12 & WinAVR-2005,Proteus                                                        
*---------------------------------------------------------------------------                                                   
*  内容描述: 一个基于队列状态机和生产者消费者循环实现的简单调度器
*          生产者基于各种中断,可实现外部响应或者数据接收,在中断函数中只执行入队列操作
*          相应任务放到消费者循环中处理
*          消费者循环中实时查询队列中任务,然后顺序执行,非中断任务可自己添加,也可将其放入default中   *                                                                                                              
*---------------------------------------------------------------------------
* 【版权】  Copyright(C)             All Rights Reserved                                            
* 【声明】  此程序用于测试,引用请注明版权和作者信息!                    
*===========================================================================*/

/********************
* 用枚举定义任务状态
********************/
enum
{
        INIT_TASK,
        TSAK_INTERRUPT0,
        TSAK_USART0,
//          。。。。。 //其他任务常量

}TASK;


/***********************************************************
*   函数名称: Main()                                 
*   功能描述: 主函数                                   
*   参数列表:                                          
*   返回结果:                                             
***********************************************************/
int main(void)
{
        CreateQueue(&fsmQueue, fsmBuffer, BUFFER_SIZE); //创建状态队列               
        EnqueueElement(&fsmQueue, INIT_TASK);           //初始状态入队列

        while (1)
        {
                CustomerLoop(); //消费者循环
        }
}


/***********************************************************
*   函数名称:                                   
*   功能描述:  消费者循环
*               当触发中断时,相应任务进入队列,不会出现遗漏现象
*             通过该循环实现对任务的处理,在默认任务中执行查询等操作                                 
*   参数列表:                                          
*   返回结果:                                             
***********************************************************/
void CustomerLoop(void)
{
        switch (DequeueElement(&fsmQueue))  //通过元素出队列实现状态机
        {
                case INIT_TASK:
                        SystemInit(); //系统初始化
                        break;

                case TSAK_INTERRUPT0:        //当触发外部中断0时,进入该状态
                        TaksInterrupt0();
                        break;

                case TSAK_USART0:                //当串口0中断触发时,进入该状态
                        //TaksUsart0();
                        break;
/*
                case TSAK_OTHERS:        //其他通过中断实现的操作
                        //TaksUsart0();
                        break;
                        ...........

*/
                default:        //当没有中断触发时,进入查询状态(这里使用时间触发方式)或者直接进入低功耗模式
                        //TaksPool();       
                        OS_Dispatch_Tasks();       
                        //进入低功耗模式
                        break;
                }
}

/***********************************************************
*   函数名称:                                   
*   功能描述:  系统初始化                                 
*   参数列表:                                          
*   返回结果:                                             
***********************************************************/
void  SystemInit(void)
{
        DDRB = 0xff;
        Uart_Init();                //串口初始化
        InterruptInit();        //中断初始化
          //这里还调用了时间触发模式
        OS_Init_T0();
        OS_Add_Task(Usart0Trans, 0, 500, 0);    // 无中断任务时,每隔500ms执行一次
        OS_Start();//开中断
//        sei();
//        EnqueueElement(&fsmQueue, TSAK_USART0);               
//        EnqueueElement(&fsmQueue, TASK_POLL); //如果系统中需要用到查询方式,则在这里加入
}


/***********************************************************
*   函数名称:SIG_INTERRUPT0                                    
*   功能描述:外部中断0                                      
*   参数列表:                                            
*   返回结果:                                             
***********************************************************/
SIGNAL(SIG_INTERRUPT0)
{
        EnqueueElement(&fsmQueue, TSAK_INTERRUPT0);
}




点击此处下载 ourdev_621646EV9B65.rar(文件大小:250K) (原文件名:QSM_PC.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-3-11 10:59:22 | 显示全部楼层
不明白

出0入0汤圆

 楼主| 发表于 2011-3-11 11:15:23 | 显示全部楼层
回复【1楼】flor
-----------------------------------------------------------------------

下载程序看看试试

出0入0汤圆

发表于 2011-3-11 11:26:33 | 显示全部楼层
名字绕口

出0入0汤圆

发表于 2011-3-11 11:32:04 | 显示全部楼层
TI的z-stack 就是用这样的系统 感觉的在8位机里面 最适合用了

出0入296汤圆

发表于 2011-3-11 13:17:46 | 显示全部楼层
好东西,赞一个。事件驱动的。

出0入0汤圆

发表于 2012-10-29 16:26:19 | 显示全部楼层
MARk 一下

出0入0汤圆

发表于 2013-3-6 09:29:29 | 显示全部楼层
这个不错!

出0入0汤圆

发表于 2013-3-6 09:58:23 | 显示全部楼层
这种模式如果用于实时性要求很高的场合,估计不行,主循环轮询的时间是不定的,所以有可能不能及时处理中断.

出0入0汤圆

发表于 2013-5-10 18:28:19 | 显示全部楼层
基于队列状态机的生产者消费者模型

出0入0汤圆

发表于 2013-5-11 20:13:14 | 显示全部楼层
好东西,谢谢楼主无私分享!

出0入0汤圆

发表于 2013-5-11 20:55:56 来自手机 | 显示全部楼层
好东东,mark 下

出0入0汤圆

发表于 2013-6-5 18:02:56 | 显示全部楼层
基于队列状态机的生产者消费者模型

出0入0汤圆

发表于 2013-6-5 18:11:03 来自手机 | 显示全部楼层
学习!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表