微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 怎样启动UCOS-II的多任务,下面代码只有一个任务在运行

怎样启动UCOS-II的多任务,下面代码只有一个任务在运行

时间:10-02 整理:3721RD 点击:
#include "includes.h"
u8 task;
static OS_STK task_led1_stk[TASK_LED1_STK_SIZE]; //定义栈
static OS_STK task_led2_stk[TASK_LED2_STK_SIZE]; //定义栈
void  delay(int x)
{
    INT16U i=0;
   
    for(;x>0;x--)
      for(i=100;i>0;i--);
}
void  Task_LED1(void *p_arg)  
{
  (void)p_arg;
  for (;;)   
   {
     LED1(OFF);
     delay(10000);  
     LED1(ON);      
     delay(10000);
   }
}
void  Task_LED2(void *p_arg)  
{
  (void)p_arg;
  for (;;)   
   {
     LED2(OFF);
     delay(20000);  
     LED2(ON);      
     delay(20000);
   }
}
void startup(void *p_arg)  
{
  OS_CPU_SysTickInit();
  
  task=OSTaskCreate(Task_LED1,(void *)0,
               &task_led1_stk[TASK_LED1_STK_SIZE-1], TASK_LED1_PRIO);
  
  task=OSTaskCreate(Task_LED2,(void *)0,
               &task_led2_stk[TASK_LED2_STK_SIZE-1], TASK_LED2_PRIO);
   
  OSTaskDel(OS_PRIO_SELF); //任务建立完成删掉这个任务

}

无法运行多个任务的原因,请检查一下原因:
存在4个问题,修改就可以了
(1)主要是在OSStart();前面缺少下列语句,系统老的时钟中断无任务切换功能:
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
的固件版本一直在更新,所以上面的代码仅作参考,只要明白代码所要表达的意思即可。
firmware 的函数中实现的代码如下:
void OS_CPU_SysTickInit (void)
RCC_ClocksTypeDef rcc_clocks;
// 获取系统频率
RCC_GetClocksFreq(&rcc_clocks);
// 配置HCLK作为SysTick时钟
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
if (SysTick_Config((rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC) - 1)) //SysTick配置函数
while (1);
(2)printf()是DOS服务,不可重入,必须改成可重入的函数,如PC_DispStr()函数,或者写为
OS_ENTER_CRITICAL();
printf("this is App_one,prio=10,Delay 6 second and start again\n\n");
OS_EXIT_CRITICAL();
等就可以了。原来的系统自带的那几个test程序,就都没有使用printf()函数。
这个一定要注意。
大部分都是错在这个地方。调用系统函数的时候一定要搞清楚所调用的函数的功能和特性。
(3)另外OSTimeDlyHMSM(0,0,0,3000)是不允许的,要写为OSTimeDlyHMSM(0,0,3,0);
否则认为OSTimeDlyHMSM()参数无效而忽略,任务App_one不延时而长期循环,不切换。
低级错误,不允许出现!
(4)因为prio=10,20,30,所以OS_CFG.H中要至少定义
#define OS_LOWEST_PRIO 32
否则某些低优先级任务被认为无效,不参与切换。
配置中注意设置。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top