搜索
bottom↓
回复: 24

uC/OS-II已经自学了多遍,但是如何将前后台程序移植到uC/OS-II 感觉不适应,划分任务真

[复制链接]

出0入0汤圆

发表于 2010-12-20 14:42:56 | 显示全部楼层 |阅读模式
uC/OS-II中,任务无非有三种类型:
     (1)、单次执行的任务
            此类任务在创建后只执行一次,执行结束后即自行删除
            void  MyTask (void *pdata)          //单次执行的任务函数
           {
              进行准备工作的代码;
              任务实体代码;
              调用任务删除函数;   //调用 OSTaskDel(OS_PRIO_SELF)
            }

     (2)、周期性执行任务
           此类任务在创建后按一个固定的周期来执行,其任务函数的结构如下:
           void  MyTask (void *pdata)          //周期性执行的任务函数
          {
               进行准备工作的代码;
               for (;;)      //无限循环,也可用 while (1)
               {
                  任务实体代码;
                  调用系统延时函数;  //调用 OSTimeDly( )或 OSTimeDlyHMSM( )
               }
           }

     (3)、事件触发执行的任务
            相关事件发生一次,该任务实体代码就执行一次,故该类型任务称为事件触发执行的任务,其任务函数的结构如下
            void  MyTask (void *pdata)          //事件触发执行的任务函数
           {
              进行准备工作的代码;
              for (;;)      //无限循环,也可用 while (1)
              {
                  调用获取事件的函数;  //如:等待信号量、等待邮箱中的消息等等。
                  任务实体代码;
               }
           }



    我原先一直使用前后台模式编程,但是想把前后台中程序的设计方法移植到ucos-II下感觉很难, 在此请教大家:

      (a)、显示任务
           在前后台中,有一段显示程序,负责显示数码管和指示灯。
           (a.1)仪表上电自检过程中,依次检查仪表上的每个数码管是否正常,依次检查仪表上的每个指示灯是否正常,然后显示版本号
                  采用的方法是每隔500毫秒,仪表上的指示灯依次点亮,
                              每隔500毫秒,仪表上的数码管依次显示“0”
                              每隔500毫秒,仪表上的数码管依次显示“1”
                              每隔500毫秒,仪表上的数码管依次显示“2”
                               。。。。。。。。。。。。。
                              每隔500毫秒,仪表上的数码管依次显示“9”
                              最后显示版本号,同时版本号显示停留时间=3秒

           (a.2)仪表正常工作时,数码管显示测量数据,指示灯根据程序处理决定是点亮或者熄灭

           当使用uC/OS-II时,如何编写显示任务呢?

           void  DisplayTask (void *pdata)
          {
              BOOL post_mark = TRUE;  // 上电自检标志

              while (1)
              {
                  if (post_mark)    // 如果上电自检
                  {
                        指示灯全亮;
                        OSTimeDly(500ms);
                        数码管全部显示“0”;
                        OSTimeDly(500ms);
                        数码管全部显示“1”;
                        OSTimeDly(500ms);
                        数码管全部显示“2”;
                        OSTimeDly(500ms);
                        数码管全部显示“3”;
                        OSTimeDly(500ms);
                        ....
                        ....
                        数码管全部显示“9”;
                        OSTimeDly(500ms);
                        数码管显示“版本号”;
                        OSTimeDly(500ms);

                        post_mark = FALSE;  // 清除上电自检标志
                   }     
                   else         // 自检完毕后,显示测量数据
                   {
                        指示灯根据程序处理点亮或者熄灭;
                        数码管显示“测量数据”;
                        OSTimeDly(500ms);
                   }
              }  
          }

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

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2010-12-20 15:00:36 | 显示全部楼层
void  MyTask (void *pdata)          //周期性执行的任务函数  
          {  
               进行准备工作的代码;(放这里不可以吗)  
               for (;;)      //无限循环,也可用 while (1)  
               {  
                  任务实体代码;  
                  调用系统延时函数;  //调用 OSTimeDly( )或 OSTimeDlyHMSM( )  
               }  
           }

出0入0汤圆

发表于 2010-12-20 15:46:35 | 显示全部楼层
你这个显示任务没有必要分开,做成1个任务即可,这个任务开始部分就是 自检,然后就是死循环显示。
不要为了任务而任务。呵呵。个人建议。

出0入0汤圆

 楼主| 发表于 2010-12-20 16:02:55 | 显示全部楼层
改写成如下形式是否可行?     

     void  DisplayTask (void *pdata)
     {
                        指示灯全亮;
                        OSTimeDly(500ms);
                        数码管全部显示“0”;
                        OSTimeDly(500ms);
                        数码管全部显示“1”;
                        OSTimeDly(500ms);
                        数码管全部显示“2”;
                        OSTimeDly(500ms);
                        数码管全部显示“3”;
                        OSTimeDly(500ms);
                        ....
                        ....
                        数码管全部显示“9”;
                        OSTimeDly(500ms);
                        数码管显示“版本号”;
                        OSTimeDly(3000ms);

              while (1)
              {

                     指示灯根据程序处理点亮或者熄灭;
                        数码管显示“测量数据”;
                        OSTimeDly(500ms);
              }   
          }

出0入0汤圆

发表于 2010-12-20 16:10:54 | 显示全部楼层
一个任务就可以了,楼主试试。

出0入0汤圆

发表于 2010-12-20 17:00:35 | 显示全部楼层
刚开始学UCOS,搞得很郁闷啊,在网上下了个说已经移植好,按资料改了下,我加上我的任务,死活不行。

出0入0汤圆

发表于 2010-12-20 17:01:53 | 显示全部楼层
这都是啥和啥啊

struct _action
{
   void (*action)();
   int delay;
} action[] =
{
  {..., ...},
  ...
}:

void thread_entry(void* parameter)
{
  int index;

  for (index = 0; index < sizeof(action)/sizeof(action[0]); index ++)
  {
     action[index].action();
     rt_thread_delay(action[index].delay);
  }
  ...

  while (1) ...
}

出0入0汤圆

发表于 2011-3-9 16:55:47 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-4-7 18:51:38 | 显示全部楼层
唉,我也在纠结。。。
网上这方面的资料太欠缺了。。

中国这么多高手,就是没有一个高手愿意在网上放一点这方面的教程。。
高手都很忙的。。

出0入0汤圆

发表于 2011-4-7 21:32:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-12 22:08:39 | 显示全部楼层
实用,mark

出0入0汤圆

发表于 2011-4-15 17:20:22 | 显示全部楼层
mark
过阵子就要移植+写编码了,头大...

出0入0汤圆

发表于 2011-8-22 09:46:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-5 10:42:55 | 显示全部楼层
Mark,也在考虑安排任务,学习

出0入0汤圆

发表于 2011-9-8 12:37:50 | 显示全部楼层
怎么做呢 。。。

出0入0汤圆

发表于 2011-12-30 19:04:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-7-5 22:54:08 来自手机 | 显示全部楼层
我感觉显示就专门做一个任务display 他只管显示 用*pdata传给他要显示的内容就行~ 开机自检则用一个专门的任务 每次给这个显示任务发送你要的1234什么的 自检完毕之后用OSTaskDelReq(OS_PRIO_SELF)把自己干掉,这样的好处是可以释放内存 只是建议哦 请大家多多指教

出0入0汤圆

发表于 2012-7-7 16:26:52 | 显示全部楼层
顶顶顶顶

出0入0汤圆

发表于 2012-8-13 18:25:57 | 显示全部楼层
偶记得任哲老师的一本书上专门讲怎么划分和安排任务,用的也是UCOS,大家可以看看!

出0入0汤圆

发表于 2012-8-13 18:27:17 | 显示全部楼层
不过我和楼主现在的状况一样,前后台模式已经用了三年了,ucos还有FREERTOS都看了很多遍了,就是还没项目上用过,所以具体也是不知道怎么划分

出0入0汤圆

发表于 2012-8-16 11:38:31 | 显示全部楼层
      MARK

出100入18汤圆

发表于 2012-8-16 13:25:24 | 显示全部楼层
划分任务没有那么复杂,怎么做都可以,逻辑上行得通就好了。

出0入0汤圆

发表于 2012-9-21 15:47:06 | 显示全部楼层
哎,同样啊
在网上找了个c51f340的移植上了,想把原来的前后台工作换过来,周期性和运行一次的好写。可是到触发的就不知道该怎么下手了。

出0入0汤圆

发表于 2012-10-10 09:10:06 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-10-10 09:41:14 | 显示全部楼层
ffxz 发表于 2010-12-20 17:01
这都是啥和啥啊

struct _action

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

本版积分规则

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

GMT+8, 2024-10-3 02:16

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

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