ba_wang_mao 发表于 2010-12-20 14:42:56

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

uC/OS-II中,任务无非有三种类型:
   (1)、单次执行的任务
            此类任务在创建后只执行一次,执行结束后即自行删除
            voidMyTask (void *pdata)          //单次执行的任务函数
         {
            进行准备工作的代码;
            任务实体代码;
            调用任务删除函数;   //调用 OSTaskDel(OS_PRIO_SELF)
            }

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

   (3)、事件触发执行的任务
            相关事件发生一次,该任务实体代码就执行一次,故该类型任务称为事件触发执行的任务,其任务函数的结构如下
            voidMyTask (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时,如何编写显示任务呢?

         voidDisplayTask (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);
                   }
            }
          }

avrgogo 发表于 2010-12-20 15:00:36

voidMyTask (void *pdata)          //周期性执行的任务函数
          {
               进行准备工作的代码;(放这里不可以吗)
               for (;;)      //无限循环,也可用 while (1)
               {
                  任务实体代码;
                  调用系统延时函数;//调用 OSTimeDly( )或 OSTimeDlyHMSM( )
               }
         }

oldtom 发表于 2010-12-20 15:46:35

你这个显示任务没有必要分开,做成1个任务即可,这个任务开始部分就是 自检,然后就是死循环显示。
不要为了任务而任务。呵呵。个人建议。

ba_wang_mao 发表于 2010-12-20 16:02:55

改写成如下形式是否可行?   

   voidDisplayTask (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);
            }   
          }

avrgogo 发表于 2010-12-20 16:10:54

一个任务就可以了,楼主试试。

eaglelpx 发表于 2010-12-20 17:00:35

刚开始学UCOS,搞得很郁闷啊,在网上下了个说已经移植好,按资料改了下,我加上我的任务,死活不行。

ffxz 发表于 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); index ++)
{
   action.action();
   rt_thread_delay(action.delay);
}
...

while (1) ...
}

sunhaiben 发表于 2011-3-9 16:55:47

MARK

mcudesign 发表于 2011-4-7 18:51:38

唉,我也在纠结。。。
网上这方面的资料太欠缺了。。

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

wpnx 发表于 2011-4-7 21:32:42

mark

quweisy 发表于 2011-4-12 22:08:39

实用,mark

adswads 发表于 2011-4-15 17:20:22

mark
过阵子就要移植+写编码了,头大...

xyz2008 发表于 2011-8-22 09:46:51

mark

btyang 发表于 2011-9-5 10:42:55

Mark,也在考虑安排任务,学习

weber00vip 发表于 2011-9-8 12:37:50

怎么做呢 。。。

hybbb 发表于 2011-12-30 19:04:03

mark

airwolf09921 发表于 2012-7-5 22:54:08

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

jetimchen 发表于 2012-7-7 16:26:52

顶顶顶顶

kingjason2009 发表于 2012-8-13 18:25:57

偶记得任哲老师的一本书上专门讲怎么划分和安排任务,用的也是UCOS,大家可以看看!

kingjason2009 发表于 2012-8-13 18:27:17

不过我和楼主现在的状况一样,前后台模式已经用了三年了,ucos还有FREERTOS都看了很多遍了,就是还没项目上用过,所以具体也是不知道怎么划分

181265118 发表于 2012-8-16 11:38:31

      MARK

hcambridge 发表于 2012-8-16 13:25:24

划分任务没有那么复杂,怎么做都可以,逻辑上行得通就好了。

404710520 发表于 2012-9-21 15:47:06

哎,同样啊
在网上找了个c51f340的移植上了,想把原来的前后台工作换过来,周期性和运行一次的好写。可是到触发的就不知道该怎么下手了。

jiangxiaoR1 发表于 2012-10-10 09:10:06

MARK{:sad:}

xukai871105 发表于 2012-10-10 09:41:14

ffxz 发表于 2010-12-20 17:01 static/image/common/back.gif
这都是啥和啥啊

struct _action


还是您的代码高级啊!
页: [1]
查看完整版本: uC/OS-II已经自学了多遍,但是如何将前后台程序移植到uC/OS-II 感觉不适应,划分任务真