嵌入式学习小组
直播中

王强

8年用户 1419经验值
私信 关注

用STM32L151移植uCOS-ii2.86程序不再进行任务调度是为什么?

大神们好,最近在用STM32L151移植uCOS-ii2.86,遇到如下问题:在主函数中建立一个任务,在这个任务的死循环里面用延时函数OStimeDly(time)来延时一段时间,发现time为10、20、100、200的时候都是正常的(该任务的死循环是一直循环的)。但是当time>300的时候,这个死循环只会跑一遍,之后就会一直进入OS_TaskIdle()函数。
我换另一个延时函数OSTimeDlyHMSM(h.min.s.ms)来延时,当ms>300的时候(OSTimeDlyHMSM(0,0,0,300))与上面的问题一样,而用OSTimeDlyHMSM(0,0,2,200)是可以正常跑的。
网上好多人说进入OS_TaskIdle()函数是优先级问题造成的,不太理解。任务的优先级是4。 另外我CPU用的是内部高速时钟HSI,不知道这会不会有影响,希望大神们给解决一下
现将部分代码贴出:
int main(void)
{   
    bsp_hsiconfig();
    OSInit();
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    OSTaskCreate(startup_task, (void *)0,  
          &startup_task_stk[STARTUP_TASK_STK_SIZE - 1],  
          STARTUP_TASK_PRIO);  
    OSStart();
    return 0;  
}               
static void startup_task(void *p_arg)
{
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//16/8=2M
    systick_init();     /* Initialize the SysTick. */
    p_arg=p_arg;
    #if (OS_TASK_STAT_EN>0)
        OSStatInit();   
    #endif
        while(1)
        {
//                OSTimeDlyHMSM(0,0,2,300);   
                 OSTimeDlyHMSM(0,0,2,200);   
//                OSTimeDly(300);
//                OSTimeDly(200);
        }        
}
static void systick_init(void)
{
        RCC_ClocksTypeDef rcc_clocks;
        RCC_GetClocksFreq(&rcc_clocks);
        SysTick_Config(rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC);
}

回帖(2)

李雪飞

2020-5-6 10:24:30
在mian()函数最前面加上 delay_init();          //时钟初始化。。。试试
举报

刘辉

2020-5-6 10:43:06
太机智了
举报

更多回帖

发帖
×
20
完善资料,
赚取积分