我在写基于ucosII任务时,出现这样一个问题。程序如下。这样调用时为什么最终结果LED1,LED2,LED3一直亮任务没有实现抢占调用,但是若把任一个任务注释掉例如//OSTaskCreate (TaskLED1,(void *)0, &TaskLED1Stk[TaskLED1StkSize - 1], 3);可以实现抢占调度,即LED2,LED3交替灯亮。我用的板子是周立功EARM2131。
请教高手指点。谢谢!
#include "config.h"
//#include "stdlib.h"
#define LED1 (1 << 18) // P1.18控制LED1
#define LED2 (1 << 19) // P1.19控制LED2
#define LED3 (1 << 20) // P1.20控制LED3
#define Task0StkLengh 64 // 定义用户任务0的堆栈长度
#define TaskLED1StkSize 128 // 定义任务TaskLED1的堆栈长度
#define TaskLED2StkSize 128 // 定义任务TaskLED2的堆栈长度
#define TaskLED3StkSize 128 // 定义任务TaskLED3的堆栈长度
OS_STK Task0Stk [Task0StkLengh]; // 定义用户任务0的堆栈
OS_STK TaskLED1Stk [TaskLED1StkSize]; // 定义任务TaskLED1的堆栈
OS_STK TaskLED2Stk [TaskLED2StkSize]; // 定义任务TaskLED2的堆栈
OS_STK TaskLED3Stk [TaskLED2StkSize]; // 定义任务TaskLED3的堆栈
void Task0(void *pdata); // Task0 任务0
void TaskLED1(void *data); // 任务TaskLED1
void TaskLED2(void *data); // 任务TaskLED2
void TaskLED3(void *data); // 任务TaskLED3
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :c语言的主函数,由它启动多任务环境
*********************************************************************************************************
*/
int main (void)
{
OSInit ();
OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], 0);
OSStart ();
return 0;
}
/*
********************************************************************************************************
** Task0 任务0
** 完成目标板初始化和创建TaskLED1/2任务
********************************************************************************************************
*/
void Task0 (void *pdata)
{
pdata = pdata;
TargetInit ();
OSTaskCreate (TaskLED1,(void *)0, &TaskLED1Stk[TaskLED1StkSize - 1], 3);
OSTaskCreate (TaskLED2,(void *)0, &TaskLED2Stk[TaskLED2StkSize - 1], 4);
OSTaskCreate (TaskLED3,(void *)0, &TaskLED3Stk[TaskLED3StkSize - 1], 6);
while (1)
{
OSTimeDly(200);
}
}
/*
********************************************************************************************************
** TaskLED1
** LED1任务
********************************************************************************************************
*/
void TaskLED1(void *pdata)
{
pdata = pdata; // 避免编译警告
PINSEL2 = PINSEL2 & (~0x08); // P1[25:16]选择GPIO
IO1DIR |= LED1; // 设置LED1控制口输出
IO1SET = LED1;
for (;;)
{
IO1CLR = LED1;
OSTimeDly(OS_TICKS_PER_SEC / 8);
IO1SET = LED1;
OSTimeDly(OS_TICKS_PER_SEC / 4);
}
}
/*
********************************************************************************************************
** TaskLED2
** LED2任务
********************************************************************************************************
*/
void TaskLED2(void *pdata)
{
pdata = pdata; // 避免编译警告
PINSEL2 = PINSEL2 & (~0x08); // P1[25:16]选择GPIO
IO1DIR |= LED2; // 设置LED2控制口输出
IO1SET = LED2;
for (;;)
{
IO1CLR = LED2;
OSTimeDly(OS_TICKS_PER_SEC / 4);
IO1SET = LED2;
OSTimeDly(OS_TICKS_PER_SEC / 2);
}
}
/*********************************************************************************************************
** TaskLED3
LED3任务
********************************************************************************************************/
void TaskLED3(void *pdata)
{
pdata = pdata; // 避免编译警告
PINSEL2 = PINSEL2 & (~0x08); // P1[25:16]选择GPIO
IO1DIR |= LED3; // 设置LED1控制口输出
IO1SET = LED3;
for (;;)
{
IO1CLR = LED3;
OSTimeDly(OS_TICKS_PER_SEC / 2);
IO1SET = LED3;
OSTimeDly(OS_TICKS_PER_SEC / 1);
}
}
应该是系统定义里限制了任务创建的数量,增大这个常量的值试试
“这样调用时为什么最终结果LED1,LED2,LED3一直亮任务没有实现抢占调用”
可能是它根本就没有运行起来吧,这只是你初始化LED后的现象。
你的最大任务数设置过小,或者你优先级有问题
检查OS_CFG.H头文件中的宏定义#define OS_MAX_TASKS,看是否设置过小
最大任务数和优先级都设置过了怎么还是不行呢,,,,