UCOS-II移植到STM32F407VG后的问题

2019-07-21 04:09发布

    这两天移植了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();          }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
huangjinyu2013
1楼-- · 2019-07-21 04:14
另外,我再加多一个说明,好让大家更能理解我的问题所在,我在单步调试的时候,程序到了OSTimeDly里面然后是循环,可以看到,程序是一直在OS_TaskIdle()这个函数里面死循环的!还有啊,原子大哥,我也是华南理工大学的,是你师弟,麻烦了哈!
huangjinyu2013
2楼-- · 2019-07-21 05:30
谢谢原子哥,我的问题自己解决了,还是谢谢你!
正点原子
3楼-- · 2019-07-21 08:17
回复【3楼】huangjinyu2013:
---------------------------------
这个真不好意思了,呵呵...
落月枫情
4楼-- · 2019-07-21 12:44
 精彩回答 2  元偷偷看……
zhao305149619
5楼-- · 2019-07-21 18:22
回复【3楼】huangjinyu2013:
---------------------------------
怎么解决的啊,怎么不说说
jermy_z
6楼-- · 2019-07-21 19:07
回复【6楼】zhao305149619:
---------------------------------
你的delay函数要么用OS自带的,要么用原子的delay并且一定要使能OS

否则不会进行调度  就死在里面了

一周热门 更多>