野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 28442|回复: 8

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

[复制链接]
发表于 2013-5-24 15:39:39 | 显示全部楼层 |阅读模式
根据野火的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);延时的时候才开始任务切换啊
回复

使用道具 举报

发表于 2013-5-24 16:42:34 | 显示全部楼层
可以用 管脚 输出电平,示波器来测试的啊
回复 支持 反对

使用道具 举报

发表于 2013-5-24 16:59:18 | 显示全部楼层
Task_Start 是不是也做延时了,
回复 支持 反对

使用道具 举报

发表于 2013-5-24 17:03:46 | 显示全部楼层
你的Task_Start应该也做延迟了,要不低优先级的led2任务不会执行,led2在串口发送的过程中,Task_Start的延时时间没到,所以就不会发生抢占,如果到了肯定会抢占
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-24 17:33:22 | 显示全部楼层
做延时了,但是只是延时1s,发送10000次的时间肯定是大于1s的啊,等延时时间到了,10ms会发生一次任务调度吧,可是没有发生啊
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);        
    }
}
回复 支持 反对

使用道具 举报

发表于 2013-5-24 17:38:32 | 显示全部楼层
测试一下你的这个10000的执行时间,测试出结果了,咱们再继续讨论
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-24 17:43:17 | 显示全部楼层
不好意思 现在手里没有硬件 晚上可以回去测试 但是上次我看了时间 就是一直用串口收led2_task数据 大概15s左右才将数据发完 然后切换到start_task
回复 支持 反对

使用道具 举报

发表于 2013-5-24 18:08:08 | 显示全部楼层
多个任务都调用串口,有资源共享的问题,需要加互斥信号量, 这个得改下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-24 23:48:12 | 显示全部楼层
Alice2013 发表于 2013-5-24 18:08
多个任务都调用串口,有资源共享的问题,需要加互斥信号量, 这个得改下

确实是有资源共享的问题,加上互斥信号量是最好的选择,我的那个问题解决了 我又仔细的调试了 发现确实是在1s之后有任务调度的进行,切换到了start_task任务,如果改成OSTimeDly(1)之后,那就是在每10ms都会调度执行Task_Start
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-21 18:53 , Processed in 0.032400 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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