野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26018|回复: 7

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

[复制链接]
发表于 2013-8-21 16:58:10 | 显示全部楼层 |阅读模式
本帖最后由 rocker 于 2013-8-21 17:07 编辑

今天学了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);
        }
}

调试错误信息。

调试错误信息。
回复

使用道具 举报

发表于 2013-8-21 17:56:09 | 显示全部楼层
你的代码编译错误,你贴一大堆代码出来,没人帮你解决到问题的
只能靠自己解决,例如 它贴出来的错误信息,你百度一下找找
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-22 16:33:55 | 显示全部楼层
玄来玄去 发表于 2013-8-21 17:56
你的代码编译错误,你贴一大堆代码出来,没人帮你解决到问题的
只能靠自己解决,例如 它贴出来的错误信 ...

好吧,我已经找到错误了,原来Keil编译器的所有变量定义都必须要在可执行语句之前,如果先执行了一些语句再定义别的变量,就会报错,就是这个错误。
回复 支持 反对

使用道具 举报

发表于 2013-8-22 20:32:53 | 显示全部楼层
rocker 发表于 2013-8-22 16:33
好吧,我已经找到错误了,原来Keil编译器的所有变量定义都必须要在可执行语句之前,如果先执行了一些语句 ...

这是 C语言的 语法问题,不是 keil 的问题,必须先定义再用的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-23 16:13:07 | 显示全部楼层
小栋 发表于 2013-8-22 20:32
这是 C语言的 语法问题,不是 keil 的问题,必须先定义再用的

不是那个,是我另外定义的变量,这个另外的变量在后续的语句中才会被使用。这个编译错误指的是这个意思:
比如在下面这个函数模块中:
void print(void)
{
int a,b;
a=5;
b=3;
printf("%d%d",a,b);

int c;
c=4;
printf("%d",c);
}

变量c的定义出现在了printf("%d%d",a,b);这个语句之后,在Keil语句中就会报出上诉的错误,而在vc中是不会报错的,这个不是C语言的语法问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-23 16:22:39 | 显示全部楼层
rocker 发表于 2013-8-23 16:13
不是那个,是我另外定义的变量,这个另外的变量在后续的语句中才会被使用。这个编译错误指的是这个意思: ...

大哥,我错了,在标准C编译器中这样定义也是错的,只有在C++的编译器中才可以这样定义。你是对的!
回复 支持 反对

使用道具 举报

发表于 2013-8-23 16:53:53 | 显示全部楼层
rocker 发表于 2013-8-23 16:13
不是那个,是我另外定义的变量,这个另外的变量在后续的语句中才会被使用。这个编译错误指的是这个意思: ...

是 C语言 语法问题, 标准的 C语法,是必须要求函数里局部变量的声明必须放在 前面,而现在一些 编译器也拓展了,允许 不是放在 前面。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-24 08:52:33 | 显示全部楼层
格拉姆 发表于 2013-8-23 16:53
是 C语言 语法问题, 标准的 C语法,是必须要求函数里局部变量的声明必须放在 前面,而现在一些 编译器也 ...

嗯嗯,多谢赐教,受益匪浅啊!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 07:35 , Processed in 0.044559 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表