今天学了uc/os的信号量,可是在调试书上的例程时出现了以下的错误,实在看不懂啊,求解救。这是某个头文件没有被包含或者某个变量没有申明吗?
#include "includes.h"
//OS_STK Task_LED1_Stk[TASK_LED1_STK_SIZE]; //定义栈
//OS_STK Task_LED2_Stk[TASK_LED2_STK_SIZE]; //定义栈
OS_STK Task_LED3_Stk[TASK_LED3_STK_SIZE]; //定义栈
//OS_STK Task_KEY1_Stk[TASK_KEY1_STK_SIZE]; //定义栈
OS_STK Task_SemA_Stk[TASK_SemA_STK_SIZE];
OS_STK Task_SemB_Stk[TASK_SemB_STK_SIZE];
OS_STK Task_SemC_Stk[TASK_SemC_STK_SIZE];
OS_EVENT *MyEventSem;//定义创建信号量的成败标志
void Task_Start(void *p_arg)
{
(void)p_arg; // 'p_arg' 并没有用到,防止编译器提示警告
//OSTaskCreate(Task_LED1,(void *)0, //创建任务LED1
//&Task_LED1_Stk[TASK_LED1_STK_SIZE-1], TASK_LED1_PRIO);
/*OSTaskCreate(Task_LED2,(void *)0, //创建任务LED2
&Task_LED2_Stk[TASK_LED2_STK_SIZE-1], TASK_LED2_PRIO);*/
OSTaskCreate(Task_LED3,(void *)0, //创建任务LED3
&Task_LED3_Stk[TASK_LED3_STK_SIZE-1], TASK_LED3_PRIO);
/*OSTaskCreate(Task_KEY1_Scan,(void *)0, //创建任务KEY1
&Task_KEY1_Stk[TASK_KEY1_STK_SIZE-1], TASK_KEY1_PRIO);*/
OSTaskCreate(Task_SemA,(void *)0,
&Task_SemA_Stk[TASK_SemA_STK_SIZE-1],TASK_SemA_PRIO);
OSTaskCreate(Task_SemB,(void *)0,
&Task_SemB_Stk[TASK_SemA_STK_SIZE-1],TASK_SemB_PRIO);
OSTaskCreate(Task_SemC,(void *)0,
&Task_SemC_Stk[TASK_SemC_STK_SIZE-1],TASK_SemC_PRIO);
OSTaskDel(STARTUP_TASK_PRIO); //任务删除自己
}
//任务LED1
/*void Task_LED1(void *p_arg)
{
(void)p_arg;
while(1)
{
LED1( ON );
OSTimeDlyHMSM(0, 0,3,0);
LED1( OFF);
OSTimeDlyHMSM(0, 0,3,0);
}
}*/
//任务LED2
/*void Task_LED2(void *p_arg)
{
(void)p_arg;
while (1)
{
LED2( ON );
OSTimeDlyHMSM(0, 0,0,200);
LED2( OFF);
OSTimeDlyHMSM(0, 0,0,200);
}
}
*/
//任务LED3
void Task_LED3(void *p_arg)
{
(void)p_arg;
while (1)
{
LED3( ON );
OSTimeDlyHMSM(0, 0,0,300);
LED3( OFF);
OSTimeDlyHMSM(0, 0,0,300);
}
}
//任务KEY1
void Delay(u32 time)//简单的延时函数
{
while (time)
{
time--;
}
}
/*void Task_KEY1_Scan(void *p_arg)
{
(void)p_arg;
while (1)
{
//检测是否有键按下
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_5) == KEY_ON)
{
//延时消抖
Delay(1000);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_5) == KEY_ON)
{
//等待按键释放
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_5) == KEY_ON);
//return KEY_ON;
}
//else
// return KEY_OFF;
}
//else
// return KEY_OFF;
OSTimeDlyHMSM(0, 0,0,100);
}
}*/
/*任务SemA*/
void Task_SemA(void *p_arg)
{
(void)p_arg;
/*任务SemA创建信号量,然后周期性的访问资源R*/
/*创建信号量*/
INT8U *perr;
INT8U err;
OS_SEM_DATA mySemData;
err = 0;
perr = &err;
MyEventSem = OSSemCreate(2);
if(MyEventSem == (OS_EVENT *)0)
{
printf("\n任务A创建信号量失败 !\n");
OSTaskDel(OS_PRIO_SELF);
return;
}
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务A创建信号量。当前信号量的值 = %d\n",OSTimeGet(),mySemData.OSCnt);
while(1)
{
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务A开始请求信号量!当前信号量的值 = %d\n",OSTimeGet(),mySemData.OSCnt);
OSSemPend(MyEventSem,0,perr);
if(err != OS_ERR_NONE)
{
printf("任务A请求信号量失败\n");
printf("错误号%d\n",err);
continue;
}
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务A获得信号量,当前信号量的值 = %d,任务A开始对R操作\n",OSTimeGet(),mySemData.OSCnt);
OSTimeDly(1000);
printf("时间:%d,任务A结束资源操作,提交信号量 !\n",OSTimeGet());
OSSemPost(MyEventSem);
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务A提交信号量完成,当前信号量 = %d,任务A将延时阻塞1000个时钟周期 \n",OSTimeGet(),mySemData.OSCnt);
OSTimeDly(1000);
}
}
/*任务SemB*/
void Task_SemB(void *p_arg)
{
(void)p_arg;
/*任务SemB创建信号量,然后周期性的访问资源R*/
/*创建信号量*/
INT8U *perr;
INT8U err;
OS_SEM_DATA mySemData;
err = 0;
perr = &err;
MyEventSem = OSSemCreate(2);
if(MyEventSem == (OS_EVENT *)0)
{
printf("\n任务B创建信号量失败 !\n");
OSTaskDel(OS_PRIO_SELF);
return;
}
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务B创建信号量。当前信号量的值 = %d\n",OSTimeGet(),mySemData.OSCnt);
while(1)
{
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务B开始请求信号量!当前信号量的值 = %d\n",OSTimeGet(),mySemData.OSCnt);
OSSemPend(MyEventSem,0,perr);
if(err != OS_ERR_NONE)
{
printf("任务B请求信号量失败\n");
printf("错误号%d\n",err);
continue;
}
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务B获得信号量,当前信号量的值 = %d,任务B开始对R操作\n",OSTimeGet(),mySemData.OSCnt);
OSTimeDly(1000);
printf("时间:%d,任务B结束资源操作,提交信号量 !\n",OSTimeGet());
OSSemPost(MyEventSem);
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务B提交信号量完成,当前信号量 = %d,任务B将延时阻塞1000个时钟周期 \n",OSTimeGet(),mySemData.OSCnt);
OSTimeDly(1000);
}
}
/*任务SemC*/
void Task_SemC(void *p_arg)
{
(void)p_arg;
/*任务SemC创建信号量,然后周期性的访问资源R*/
/*创建信号量*/
INT8U *perr;
INT8U err;
OS_SEM_DATA mySemData;
err = 0;
perr = &err;
MyEventSem = OSSemCreate(2);
if(MyEventSem == (OS_EVENT *)0)
{
printf("\n任务C创建信号量失败\n");
OSTaskDel(OS_PRIO_SELF);
return;
}
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务C创建信号量。当前信号量的值 = %d\n",OSTimeGet(),mySemData.OSCnt);
while(1)
{
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务C开始请求信号量!当前信号量的值 = %d\n",OSTimeGet(),mySemData.OSCnt);
OSSemPend(MyEventSem,0,perr);
if(err != OS_ERR_NONE)
{
printf("任务C请求信号量失败\n");
printf("错误号%d\n",err);
continue;
}
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务C获得信号量,当前信号量的值 = %d,任务C开始对R操作\n",OSTimeGet(),mySemData.OSCnt);
OSTimeDly(1000);
printf("时间:%d,任务C结束资源操作,提交信号量 !\n",OSTimeGet());
OSSemPost(MyEventSem);
OSSemQuery(MyEventSem,&mySemData);
printf("时间:%d,任务C提交信号量完成,当前信号量 = %d,任务C将延时阻塞1000个时钟周期 \n",OSTimeGet(),mySemData.OSCnt);
OSTimeDly(1000);
}
} |