syzxdz_liuzelin 发表于 2012-11-26 14:53:01

ucos ii 建立任务的方法比较

在μcoii中建立任务,有两个函数,一个是: OSTaskCreat   另外一个是OSTaskCreateExt , 其中第一个比较常用。
在创建任务时,一种是直接用OSTaskCreat来创建每个任务,而另一种方式则是在任务函数中来创建另外的任务,这两种方法有什么利弊吗?尤其第二种,在一个任务中创建另一个任务有什么危险?
我记得以前老师讲课时分析过,我现在忘了。。哪位高手可以帮忙分析下~谢谢{:kiss:}

fshunj 发表于 2012-11-26 17:10:27

可以在OSStart()之前创建全部任务,更为常用的办法是,首先创建一个最高优先级别的任务,在这个任务里面首先做一些一次性的工作(例如开时钟中断,系统软硬件初始化,创建其他任务,创建各种通信工具等等),然后再加入最高优先级别的死循环代码.当然,如果浪费点空间的话也可以单独开辟一个最高优先级别的任务,只做一些一次性的工作然后自我删除.

syzxdz_liuzelin 发表于 2012-11-27 01:11:17

fshunj 发表于 2012-11-26 17:10 static/image/common/back.gif
可以在OSStart()之前创建全部任务,更为常用的办法是,首先创建一个最高优先级别的任务,在这个任务里面首先做 ...

{:handshake:} {:smile:} 谢谢你~我明白你的意思了。。。好像还有个字你打错了。“更为常用的办法是,首先创建一个最高优先级别的任务”这句的最高优先级应该是最低优先级吧?在主函数里头先运行最低优先级的任务,来创建别的任务,或者初始化那些软硬件工作。。。对吗?   

fshunj 发表于 2012-11-27 09:01:09

不是的,如果首先创建最低优先级的话,再在这个低优先级任务创建比他高优先级的任务就会发生任务调度的了,调度完了又回来创建其他任务,这不是我们希望的,因为我们想先把所有任务创建好才发生调度.

syzxdz_liuzelin 发表于 2012-11-27 09:23:24

fshunj 发表于 2012-11-27 09:01 static/image/common/back.gif
不是的,如果首先创建最低优先级的话,再在这个低优先级任务创建比他高优先级的任务就会发生任务调度的了,调 ...

我的意思是这样的:(以正点原子例程为例)
#define START_TASK_PRIO                              10    //开始任务的优先级设置为最
#define LED1_TASK_PRIO                               7
#define LED2_TASK_PRIO                               6

int main(void)
{
        delay_init();             //延时初始化          
        NVIC_Configuration();        //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        LED_Init();                         //初始化与LED连接的硬件接口
        OSInit();
        OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK,START_TASK_PRIO );//创建起始任务
        OSStart();
}


          
//开始任务
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
        pdata = pdata;
        OSStatInit();                                        //初始化统计任务.这里会延时1秒钟左右       
        OS_ENTER_CRITICAL();                        //进入临界区(无法被中断打断)   
        OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK,LED1_TASK_PRIO);                                                  
        OSTaskCreate(led2_task,(void *)0,(OS_STK*)&LED2_TASK_STK,LED2_TASK_PRIO);                                         
        OSTaskSuspend(START_TASK_PRIO);        //挂起起始任务.
        OS_EXIT_CRITICAL();                                //退出临界区(可以被中断打断)
}

就是这样子,开始任务为最低优先级,穿件了其实任务之后,才开始启动系统。然后在开始任务里创建两个任务优先级高的任务。 我比较郁闷的是,按照你说的,当创建了第一个高优先级任务-LED1_TASK后,为什么没有发生调度?不知这个过程是怎样的。

fshunj 发表于 2012-11-27 09:43:46

OS_ENTER_CRITICAL();                        //进入临界区(无法被中断打断)
...
...
...
OS_EXIT_CRITICAL();                              //退出临界区(可以被中断打断)

它的思想跟我说的一样,也是不想创建任务途中被打断,只是不想浪费一个更高的优先级的一种做法而已.

syzxdz_liuzelin 发表于 2012-11-27 09:57:13

嗯嗯~~你俩做法思想是一样的。。
按照这样的话,就是先系统初始化:    OSInit();   
接着创建起始任务: OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK,START_TASK_PRIO );
然后开始启动系统 OSStart();
此时,系统中只有一个void start_task(void *pdata)任务,执行,因为在创建LED1和LED2任务之前,已经进入了临界区(关闭了中断)所以无法进行任务的调度,成功的创建了那两个任务。
我的理解应该没错吧?嘿嘿
页: [1]
查看完整版本: ucos ii 建立任务的方法比较