这两天移植了UCOS-II到STM32F407VG中,出现以下问题,希望大家能帮忙解决一下:
我在系统中创建了两个任务,分别是让两个不同的LED灯以不同的频率闪烁,如下:
static void App_Task1(void *p_arg)
{
(void)p_arg;
GPIO_Configuration();
while(1)
{
GPIOD->BSRRL = GPIO_Pin_15;//输出高电平
OSTimeDly(200);
GPIOD->BSRRH = GPIO_Pin_15;//输出低电平
OSTimeDly(200);
}
}
static void App_Task2(void *p_arg)
{
(void)p_arg;
//OSTaskSuspend(OS_PRIO_SELF);
GPIO_Configuration_Add();
while(1)
{
GPIOD->BSRRL = GPIO_Pin_14;//输出高电平
OSTimeDly(800);
GPIOD->BSRRH = GPIO_Pin_14;//输出低电平
//delay(400);
OSTimeDly(800);
}
}
我现在的问题是,如果将第二个任务中的OSTimeDly(800)替换成单纯的延时delay(400)的话,就会出现这样的情况:任务一中使用的OSTimeDly(200)能够释放CPU的使用权,使得CPU能够执行任务优先级较低的任务二,但是程序就一直在任务二里面执行,而且灯能够闪烁,但再也回不到任务一了!当然,因为我第二个任务用的是delay(400),并没有释放CPU。可问题是,我在第二个任务中如果用的是OSTimeDly(800)来延时,CPU依然能够被释放去执行任务二,但是程序运行就死在了OSTimeDly(800)里面了。我曾经试过单步调试,也同样可以调试看到,程序从任务一调到任务二后一直在OSTimeDly(800)里面死循环。另外,我在调用OSInit()和OS_CPU_SysTickInit()后,立刻使用OSTimeDly(10)来进行延时,程序依然死在了OSTimeDly(10)里面。究竟是什么原因导致这样的呢?原子大哥请帮帮忙,谢谢啦!我的OS_CPU_SysTickInit()里面是这样写的:
void OS_CPU_SysTickInit (void)
{
OS_CPU_SR cpu_sr =0;
while(SysTick_Config(OS_CPU_SysTickClkFreq() / OS_TICKS_PER_SEC)!=0);
OS_ENTER_CRITICAL();
OSIntNesting++;
OS_EXIT_CRITICAL();
OSTimeTick();
OSIntExit();
}
|