搜索
bottom↓
回复: 6

ucos ii 建立任务的方法比较

[复制链接]

出0入0汤圆

发表于 2012-11-26 14:53:01 | 显示全部楼层 |阅读模式
在μcoii中建立任务,有两个函数,一个是: OSTaskCreat   另外一个是OSTaskCreateExt , 其中第一个比较常用。
在创建任务时,一种是直接用OSTaskCreat来创建每个任务,而另一种方式则是在任务函数中来创建另外的任务,这两种方法有什么利弊吗?尤其第二种,在一个任务中创建另一个任务有什么危险?
我记得以前老师讲课时分析过,我现在忘了。。哪位高手可以帮忙分析下~谢谢

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

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

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2012-11-27 01:11:17 | 显示全部楼层
fshunj 发表于 2012-11-26 17:10
可以在OSStart()之前创建全部任务,更为常用的办法是,首先创建一个最高优先级别的任务,在这个任务里面首先做 ...

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

出0入0汤圆

发表于 2012-11-27 09:01:09 | 显示全部楼层
不是的,如果首先创建最低优先级的话,再在这个低优先级任务创建比他高优先级的任务就会发生任务调度的了,调度完了又回来创建其他任务,这不是我们希望的,因为我们想先把所有任务创建好才发生调度.

出0入0汤圆

 楼主| 发表于 2012-11-27 09:23:24 | 显示全部楼层
fshunj 发表于 2012-11-27 09:01
不是的,如果首先创建最低优先级的话,再在这个低优先级任务创建比他高优先级的任务就会发生任务调度的了,调 ...

我的意思是这样的:(以正点原子例程为例)
#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_STK_SIZE-1],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_STK_SIZE-1],LED1_TASK_PRIO);                                                  
        OSTaskCreate(led2_task,(void *)0,(OS_STK*)&LED2_TASK_STK[LED2_STK_SIZE-1],LED2_TASK_PRIO);         
                                  
        OSTaskSuspend(START_TASK_PRIO);        //挂起起始任务.
        OS_EXIT_CRITICAL();                                //退出临界区(可以被中断打断)
}

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

出0入0汤圆

发表于 2012-11-27 09:43:46 | 显示全部楼层
  OS_ENTER_CRITICAL();                        //进入临界区(无法被中断打断)
...
...
...
OS_EXIT_CRITICAL();                                //退出临界区(可以被中断打断)

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

出0入0汤圆

 楼主| 发表于 2012-11-27 09:57:13 | 显示全部楼层
嗯嗯~~你俩做法思想是一样的。。
按照这样的话,就是先系统初始化:    OSInit();   
接着创建起始任务: OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );
然后开始启动系统 OSStart();
此时,系统中只有一个void start_task(void *pdata)任务,执行,因为在创建LED1和LED2任务之前,已经进入了临界区(关闭了中断)所以无法进行任务的调度,成功的创建了那两个任务。
我的理解应该没错吧?嘿嘿
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 09:32

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

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