搜索
bottom↓
回复: 3

请教傻孩子:uCOS/II中,如何设计一个多状态分支的“显示任务”

[复制链接]

出0入0汤圆

发表于 2011-3-24 17:24:16 | 显示全部楼层 |阅读模式
问题提出:在前后台中,有如下一个“显示子程序”

        (1)、初始化时,status =  仪表上电自检
        (2)、上电自检大约需要3秒钟,用来检测仪表上的四个数码管好坏情况
               
               第一个  500ms,四个数码管显示“1111”
               第二个  500ms,四个数码管显示“2222”
               第三个  500ms,四个数码管显示“3333”
               第四个  500ms,四个数码管显示“8888”
               第五个  500ms,status = 测量模式
         (3)、当status = 测量模式时,按下《编程》键,切换到编程模式,即status = 编程
               编程模式时,四个数码管显示待修改参数的参数值
         (4)、当status = 编程,且用户按下《确认》键,确认修改时,如果参数超限,则 status = 编程错误
                则数码管持续显示“err”,并维持1秒钟。
   

        void display(void)   // 前后台代码
        {
           switch (status)
           {
                case 仪表上电自检:               
                     四个数码管依次显示1111到8888                                     // 检测数码管是否损坏
                     break;
                case 编程模式:                        // 用户在仪表上按《编程》键,进入参数修改模式
                     四个数码管显示待修改参数
                     break;
                case 编程错误:                       //编程过程中,输入的参数超过最大值
                     数码管显示“Err”,并持续1秒钟
                     break;
                case 测量模式:
                     四个数码管显示测量数据
            }
        }                      

           
      请问:在ucOS/ii中,如何设计该显示任务

出0入0汤圆

 楼主| 发表于 2011-3-24 17:32:50 | 显示全部楼层
在uCOS/ii中,数据通信一般有以下三种:

            1、全局变量
            2、消息邮箱
            3、消息队列

     (A).假如使用消息邮箱的话,用在周期性显示任务上显然不合适  ,不可能因为没有等到消息,显示任务就挂起等待吧!  
     (B).假如使用消息队列的话,用在周期性显示任务上显然也不合适,不可能因为没有等到消息,显示任务就挂起等待吧!

     (C).如果使用全局变量,由于“生产者”可能在定时中断,也可能是其它任务,因此必须用
            OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()保护原子。

        
      以下是我的构思,请指正:

         void TASK_DISPLAY()
         {
              INT8U st1;

              while (1)
              {
                   OS_ENTER_CRITICAL();
                   st1 = status;                   // 使用全局变量进行数据通信
                   OS_EXIT_CRITICAL();

                   switch (st1)
                   {
                      case 仪表上电自检:
                         break;
                      case 编程模式:                    
                         break;
                      case 编程错误:                  
                          break;
                      case 测量模式:
                          break;
                    }
                    OSDelayTime(500);            // 延时节拍
  
                }

        }

出0入296汤圆

发表于 2011-3-24 19:30:09 | 显示全部楼层
没有错~

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-5 10:33

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

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