OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4845|回复: 7

求助大神:关于uCOS中任务的理解

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-2-1
在线时间
4 小时
发表于 2019-2-1 10:13:50 | 显示全部楼层 |阅读模式
下述代码是STM32F10X系列上面uCOS的Demo,代码如下:
代码流程如下:
       首先是main函数中调用了OSTaskCreate 函数创建任务,第一个形参是任务函数入口指针为:start_task,然后start_task函数中又调用了OSTaskCreate来创建两个任务led0_task和led1_task。

       由于是新手,对这一块理解不太清楚,我所理解的任务是led0_task和led1_task,这两个是实际的任务,在做具体的事情,很好理解,但是main中创建的任务 start_task任务如何理解?
start_task明显要比led0_task或led1_task高一级,难道任务有分级的概念吗?是led0_task和led1_task的上级任务?
       感觉这个地方不太理解,请各位大神指教。


int main(void)
{                                   
        Stm32_Clock_Init(9); //Ïμí3ê±ÖóéèÖÃ
        delay_init(72);             //Ñóê±3õê¼»ˉ       
        LED_Init();                       
        LED_Init();                           //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
        OSInit();   
        OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//′′½¨Æeê¼èÎÎñ
        OSStart();                   
}

          
//¿aê¼èÎÎñ
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
        pdata = pdata;
          OS_ENTER_CRITICAL();                        //½øèëáù½çÇø(ÎT·¨±»ÖD¶Ï′ò¶Ï)   
        OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);                                                  
        OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);                                           
        OSTaskSuspend(START_TASK_PRIO);        //1òÆeÆeê¼èÎÎñ.
        OS_EXIT_CRITICAL();                                //íË3öáù½çÇø(¿éòÔ±»ÖD¶Ï′ò¶Ï)
}

//LED0èÎÎñ
void led0_task(void *pdata)
{                
        while(1)
        {
                LED0=0;
                delay_ms(80);
                LED0=1;
                delay_ms(920);
        };
}

//LED1èÎÎñ
void led1_task(void *pdata)
{          
        while(1)
        {
                LED1=0;
                delay_ms(300);
                LED1=1;
                delay_ms(300);
        };
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-2-14 10:18:38 | 显示全部楼层
幸福哥 发表于 2019-2-13 21:45
感谢大神持续的关注,将之前代码修改为如下:

int main(void)

不创建开始任务也可以,个人习惯而已
业精于勤荒于嬉;行成于思毁于随!
回复 支持 1 反对 0

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-2-12 11:26:48 | 显示全部楼层
本帖最后由 1208 于 2019-2-12 18:38 编辑

UCOSIII是单核的CPU,而执行多个任务
则需要main中创建的任务 start_task任务用于创建其它任务
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-2-1
在线时间
4 小时
 楼主| 发表于 2019-2-13 12:49:46 | 显示全部楼层
1208 发表于 2019-2-12 11:26
UCOSIII是单核的CPU,而执行多个任务
则需要main中创建的任务 start_task任务用于创建其它任务

感谢大神!!!
但是如果不实现start_task函数,也就不创建下述任务,
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );
而直接在main分别调用OSTaskCreate创建led0_task和led1_task两个任务
OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);                                                   
OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
也应该可以吧,由于现在STM32的开发板不在身边,无法验证,稍后可以验证一下。
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-2-13 16:49:09 | 显示全部楼层
幸福哥 发表于 2019-2-13 12:49
感谢大神!!!
但是如果不实现start_task函数,也就不创建下述任务,
OSTaskCreate(start_task,(void ...

估计不行
一般都是在主函数创建开始任务
开始任务的函数在创建其它任务
你自己也可以具体试下
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-2-1
在线时间
4 小时
 楼主| 发表于 2019-2-13 21:45:57 | 显示全部楼层
本帖最后由 幸福哥 于 2019-2-13 21:47 编辑
1208 发表于 2019-2-13 16:49
估计不行
一般都是在主函数创建开始任务
开始任务的函数在创建其它任务

感谢大神持续的关注,将之前代码修改为如下:

int main(void)
{                                   
        OS_CPU_SR cpu_sr=0;
        
        Stm32_Clock_Init(9); //Ïμí3ê±ÖóéèÖÃ
        delay_init(72);             //Ñóê±3õê¼»ˉ        
        LED_Init();                        
        LED_Init();                           //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
        OSInit();   
        
//        OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//′′½¨Æeê¼èÎÎñ
        OS_ENTER_CRITICAL();                        //½øèëáù½çÇø(ÎT·¨±»ÖD¶Ï′ò¶Ï)   
         OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);                                                   
         OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);                                            
        OSTaskSuspend(START_TASK_PRIO);        //1òÆeÆeê¼èÎÎñ.
        OS_EXIT_CRITICAL();                                //íË3öáù½çÇø(¿éòÔ±»ÖD¶Ï′ò¶Ï)
        
        OSStart();                  
}

直接在main函数中创建led0_task与led1_task两个任务,在开发板上运行了一下,是可以的。所以有点晕,不知道创建开始任务的意义何在。
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-2-1
在线时间
4 小时
 楼主| 发表于 2019-2-14 21:30:16 | 显示全部楼层
本帖最后由 幸福哥 于 2019-2-14 21:32 编辑
1208 发表于 2019-2-14 10:18
不创建开始任务也可以,个人习惯而已

收到~~~再次感谢大神,以后跟你多学习。我准备搞liteOS,之前只搞过嵌入式应用软件开发,但是没搞过嵌入式的系统,现在开始学习uCOS,请多指教。
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-2-15 10:25:32 | 显示全部楼层
幸福哥 发表于 2019-2-14 21:30
收到~~~再次感谢大神,以后跟你多学习。我准备搞liteOS,之前只搞过嵌入式应用软件开发,但是没搞过嵌入 ...

我也是刚学不久,还需要多多练习
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-2 08:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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