打印

ucos移植到stm32之后任务调度问题

[复制链接]
3656|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dong130300|  楼主 | 2013-5-23 17:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
根据野火的ucos移植到stm32的程序,创建了三个用户任务,一个是Task_Start,优先级是4,一个是led2_task,优先级是5,一个是led3_task,优先级是6,systick的中断周期是10ms,在task_start中创建了led2_task,和led3_task,我让led2_task任务点亮led2,并且发送数据10000次
    while (1)
    {
     int i;
    for(i=0;i<10000;i++)   
     {
        LED2( ON );
                printf("\r\n this is a task_led2 demo \r\n");
     }
        OSTimeDlyHMSM(0, 0,2,0);
        LED2( OFF);
                printf("\r\n this is a task_led2 demo end\r\n");
                OSTimeDlyHMSM(0, 0,2,0);      
               
    }
但是在这10000次的时候肯定是会大于10ms的,那么不是就会进行任务切换吗,找到最高优先级的就绪任务task_start,然后切换到task_start吗,可是为什么他是等led2的10000次完成之后在 OSTimeDlyHMSM(0, 0,2,0);延时的时候才开始任务切换啊
沙发
hawksabre| | 2013-5-23 19:51 | 只看该作者
帮你顶一个   看看别人的意见   没能帮你的忙   对不住   兄弟

使用特权

评论回复
板凳
dong130300|  楼主 | 2013-5-24 15:49 | 只看该作者
各位大神 帮帮忙啊 是我对ucos的理解有误吗

使用特权

评论回复
地板
a8037902| | 2013-5-24 16:28 | 只看该作者
task_start在创建led2_task,和led3_task后被删除了吧。led2_task如果是3个被创建任务最高的优先级就只有等到该任务自动挂起才切换到准备任务表中最高优先级任务。

使用特权

评论回复
5
dong130300|  楼主 | 2013-5-24 16:49 | 只看该作者
void Task_Start(void *p_arg)
{
                INT8U  err,err1;
                (void)p_arg;                                               
        OSTaskCreate(Task_LED2,(void *)0,                         
                         &task_led2_stk[TASK_LED2_STK_SIZE-1], TASK_LED2_PRIO);
        OSTaskNameSet(TASK_LED2_PRIO, (INT8U *)"LED2_TASK", &err);

        OSTaskCreate(Task_LED3,(void *)0,                          
           &task_led3_stk[TASK_LED3_STK_SIZE-1], TASK_LED3_PRIO);
        OSTaskNameSet(TASK_LED3_PRIO,(INT8U*)"LED3_TASK",&err1);

    while (1)
    {
        LED1( ON );
                printf("\r\n this is a task_start demo \r\n");
        OSTimeDlyHMSM(0, 0,1,0);
               
        LED1( OFF);
                printf("\r\n this is a task_start demo end\r\n");  
                OSTimeDlyHMSM(0, 0,1,0);
            
    }
}
void Task_LED2(void *p_arg)
{
    (void)p_arg;                       
   while (1)
    {
     int i;
    for(i=0;i<10000;i++)   
     {
        LED2( ON );
                printf("\r\n this is a task_led2 demo \r\n");
     }
        OSTimeDlyHMSM(0, 0,2,0);
        LED2( OFF);
                printf("\r\n this is a task_led2 demo end\r\n");
                OSTimeDlyHMSM(0, 0,2,0);      
               
    }
void Task_LED3(void *p_arg)
{
    (void)p_arg;      
    while (1)
    {
        LED3( ON );
                printf("\r\n this is a task_led3 demo \r\n");
        OSTimeDlyHMSM(0, 0,3,0);
        LED3( OFF);
                printf("\r\n this is a task_led3 demo end\r\n");
                OSTimeDlyHMSM(0, 0,3,0);        
    }
}
start_task是最高优先级的,他有个延时,在延时的时候切换到led2_task,在led2_task中连续发送10000次,他的时间应该已经大于10ms,10ms是我的systick时钟中断,那不是应该每个10ms中断一次,找到最高优先级的任务start_task,并且执行吗,但是我通过串口调试助手发现他是led2_task发送10000次完成之后才切换到最高优先级任务的

使用特权

评论回复
6
a8037902| | 2013-5-24 16:56 | 只看该作者
本帖最后由 a8037902 于 2013-5-24 16:58 编辑

OSTimeDlyHMSM(0, 0,1,0);是延时1秒钟吧

使用特权

评论回复
7
dong130300|  楼主 | 2013-5-24 17:30 | 只看该作者
是啊

使用特权

评论回复
8
a8037902| | 2013-5-24 17:39 | 只看该作者
任务start_task在执行完OSTimeDlyHMSM(0, 0,1,0);要过1S才能再次运行,在这1S内start_task被挂起,systick时钟中断找到准备任务列表里最高优先级任务运行,而start_task要过1S才再次出现在准备任务列表。
运行顺序为:
start_task
LED1( ON );
                printf("\r\n this is a task_start demo \r\n");
        OSTimeDlyHMSM(0, 0,1,0);

Task_LED2
int i;
    for(i=0;i<10000;i++)   
     {
        LED2( ON );
                printf("\r\n this is a task_led2 demo \r\n");
     }
        OSTimeDlyHMSM(0, 0,2,0);

Task_LED3
LED3( ON );
                printf("\r\n this is a task_led3 demo \r\n");
        OSTimeDlyHMSM(0, 0,3,0);

空闲任务(大约运行1S)

回到start_task
LED1( OFF);
                printf("\r\n this is a task_start demo end\r\n");  
                OSTimeDlyHMSM(0, 0,1,0);

使用特权

评论回复
9
李富贵| | 2013-5-24 20:16 | 只看该作者
void Task_Start(void *p_arg)
{
    while (1)
    {
        LED1( ON );
                printf("\r\n this is a task_start demo \r\n");
        OSTimeDlyHMSM(0, 0,1,0);
撸主理解错误,10ms任务调度一次没错,但是你延迟了1000ms,所以到了10ms任务调度的时候,你的Task_Start依然处于阻塞态,只有经过100个10ms的任务调度,1秒的时间到了你的Task_Start才会就绪。要想获得你要的结果,把OSTimeDlyHMSM(0, 0,1,0);换成OSTimeDly(1);才会在第一次10ms任务调度中执行Task_Start。

使用特权

评论回复
10
dong130300|  楼主 | 2013-5-24 23:19 | 只看该作者
李富贵 发表于 2013-5-24 20:16
撸主理解错误,10ms任务调度一次没错,但是你延迟了1000ms,所以到了10ms任务调度的时候,你的Task_Start依 ...

明白了 我的理解却是是有错误 但是led2_task发送10000次数据的时间是大于1s的,那不是应该在1s之后调度到高优先级的任务start_task吗,可是我发现他是在发送完10000次数据之后,大概过了十几秒中才调度到start_task的,这是怎么回事啊

使用特权

评论回复
11
dong130300|  楼主 | 2013-5-24 23:46 | 只看该作者
李富贵 发表于 2013-5-24 20:16
撸主理解错误,10ms任务调度一次没错,但是你延迟了1000ms,所以到了10ms任务调度的时候,你的Task_Start依 ...

刚才我又仔细的调试了 发现确实是在1s之后有任务调度的进行,切换到了start_task任务,如果改成OSTimeDly(1)之后,那就是在每10ms都会调度执行Task_Start,问题解决了,感谢啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

35

帖子

0

粉丝