打印

大神们,求救,uc/os信号量的问题。

[复制链接]
663|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
棋王高手|  楼主 | 2018-7-4 14:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天学了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);
        }
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

378

主题

378

帖子

0

粉丝