这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » OS,II μC/OS-II下的事件标志组?

共2条 1/1 1 跳转至

OS,II μC/OS-II下的事件标志组?

院士
2006-09-17 18:14:16     打赏
OS,II μC/OS-II下的事件标志组?



关键词: OS-II     事件     标志    

院士
2006-12-22 22:43:00     打赏
2楼

我使用μC/OS-II下的事件标志组好几天了,就一次也没成功过,我如下定义和使用:

创建:
OS_FLAG_GRP   *A;
#define L 0x01;
OS_FLAGS v;
A=OSFlagCreate(0x00, &err);

发送:                                                         
err = OSFlagPost(A,L,OS_FLAG_SET, &err);

等待:
OS_FLAGS v;
v = OSFlagPend (A,L,OS_FLAG_WAIT_SET_ALL,0,&err);

我反反复复在程序中实验,绝对没有输错,居然连语法编译都通不过几乎都是相同的,下面的这六个错误全是和上面的几个语句有关,请问我到底做错了什么??有没有人用过事件标志组,给指点一下,发个正确的用法也可以。
Error   : C2285E: expected ')' or ',' - inserted ')' before ';'
main.c line 88   
Error   : (Serious) C3026E: wrong number of parameters to 'OSFlagPost'
main.c line 88   
Error   : (Serious) C2304E: <command> expected but found ','
main.c line 88   
Error   : C2285E: expected ')' or ',' - inserted ')' before ';'
main.c line 110   
Error   : (Serious) C3026E: wrong number of parameters to 'OSFlagPend'
main.c line 110   
Error   : (Serious) C2304E: <command> expected but found ','
main.c line 110   
  1: 我觉得肯定是语法错误。。。跟OS无关。 2: 圈圈贴个例程如何?00贴个使用事件标志组的例程让我学习一下吧。我真的试了好多遍了。 3: 我可算服了上善若水~~~带水的名字我喜欢 4: 您喜欢的话我以后改名叫阿水您可要多关照哦 5: 你把你编译通不过那里的附近一段代码帖出来吧……说实在话,俺不懂你说的那个什么‘事件标志组’,但语法问题,我想还是能看出点名堂的………… 6: OSFlagPost的参数数量不对OSFlagPost的参数数量不对 7: 我终于找到错误了,但是又出现新的问题:
事情的原委是这样的:
   我才学习ARM和μC/OS-II有两个月,以前有一些51的开发经验,我在眼下的项目里用μC/OS-II其实是为了用而用,那么,我想就应该所有的机制都用μC/OS-II自带的,前天我把已经能运行的一个系统程序中的所有全局标量都集成到一个FLAGS里,完全是按照书上的办法写的,结果编译通不过,错误变成20多个,于是我就专门在下面的这个ZLG给的最简单的例程里调试FLAGS,调试了好多遍,就是有编译错误,我当时怀疑是μC/OS-II V2.52不支持FLAGS,我一查源文件,人家的代码写的好好的,说上也说的很对,急得嘴上起泡!幸好刚才在00的提示下,我又静下心来查了一遍,才突然发现:我的天,我把L的宏定义的后面居然加了个分号!!!我检查错误都在任务里看,修改这个程序时宏定义是从以前的错误中考过来的。
   但是,我又碰到了昨天在昨天的“μC/OS-II下的任务初始化?”帖子里碰到的问题,00让我贴代码,我昨天没力气贴了,OS_FLAGS v明明是task2 里的局部变量,但是当我在task2里声明的时候就会报错,定义在程序头的时候就正常,程序附于下面,后面的是它编译时的错误:
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"

#define TASK_STK_SIZE   64          // 定义用户任务的堆栈长度
#define L 0x01
//OS_FLAGS v;   在这里定义不会报错。

OS_STK        TaskStartStk[TASK_STK_SIZE];                                   //(2)
OS_STK        TaskStk[TASK_STK_SIZE];                                        //(3)
OS_FLAG_GRP   *A;
uint8   err;


void  Task1(void *pdata);
void  Task2(void *pdata);
void  BeeMoo(void);
void  BeeNoMoo(void);
uint32 GetKey(void);

#define     KEY1    1 << 16     // P0.16-KEY1
#define     BEEP    1 << 7      // P0.7-BEEP

/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :uC/OS-II主函数,启动多任务环境。
*********************************************************************************************************
*/
int main (void)
{
   uint8   err;
    OSInit();    
     A=OSFlagCreate(0x00, &err);                                                         
    OSTaskCreate(Task1, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
    OSTaskCreate(Task2, (void *)0, &TaskStk[TASK_STK_SIZE - 1], 10);         
    OSStart();                                                               
    return 0;                                                                
}

/*
*********************************************************************************************************
**                      任务1-Task1()
**                   键盘扫描(具有去抖动功能)
*********************************************************************************************************
*/
void  Task1(void *pdata)
{
    pdata = pdata;                               /* 避免编译警告 */
   
    TargetInit();                               /* 目标板初始化 */
    for (;;)                                                                     
    {
        OSTimeDly(OS_TICKS_PER_SEC / 50);     /* 延时20毫秒 */                    
        if (GetKey() != KEY1)                    /* GetKey用于获取键盘当前状态 */
        {
            continue;                         /* 不是KEY1不理会 */
        }
        OSTimeDly(OS_TICKS_PER_SEC / 50);    /* 延时20毫秒,用于去抖 */           
        if (GetKey() != KEY1)                    /* 还是KEY1才正确  */
        {
            continue;
        }
       
       err = OSFlagPost(A,L,OS_FLAG_SET, &err);
       
        while (GetKey() != 0)                    /* 等待松开按键 */
        {
            OSTimeDly(OS_TICKS_PER_SEC / 50);   /* 延时20毫秒 */                  
        }
        err = OSFlagPost(A,L,OS_FLAG_SET, &err);
    }
}

/*
*********************************************************************************************************
**                      任务2-Task2()
**                   蜂鸣器鸣叫
*********************************************************************************************************
*/
void  Task2(void *pdata)
{   
    PINSEL0 = 0;                // 设置管脚连接
    IO0DIR = BEEP;              // 蜂鸣器控制口输出
    OS_FLAGS v;        定义到这里就会有后面的编译错误!
    pdata = pdata;
    for (;;)
    {                          
       v = OSFlagPend (A,L,OS_FLAG_WAIT_SET_ALL + OS_FLAG_CONSUME,0,&err);
       if (err == OS_NO_ERR)
       {
              BeeMoo();                                  /* 使蜂鸣器鸣叫 */
              OSTimeDly(OS_TICKS_PER_SEC / 8);            /* 延时 */                           
              BeeNoMoo();                                 /* 使蜂鸣器停止鸣叫 */
              OSTimeDly(OS_TICKS_PER_SEC / 4);            /* 延时 */                           
              BeeMoo();                                   /* 使蜂鸣器鸣叫 */
              OSTimeDly(OS_TICKS_PER_SEC / 8);            /* 延时 */                           
              BeeNoMoo();                                 /* 使蜂鸣器停止鸣叫 */
    
       }
    }
              
}
……
/**********************************************************************************************************                            End Of File
********************************************************************************************************/

OS_FLAGS v在task2里声明时的编译错误:
Error   : (Serious) C2292E: typedef name 'OS_FLAGS' used in expression context
main.c line 109   

Error   : (Serious) C2284E: expected ';' after command - inserted before 'v'
main.c line 109   

Error   : C2456E: undeclared name, inventing 'extern int v'
main.c line 109   

Warning : C2917W: no side effect in void context: 'v'
main.c line 109   
  8: 我晕…………谁叫你放到后面去啊…………
应该放到前面去的,即紧跟随着{的后面…………

void  Task2(void *pdata)
{   
    OS_FLAGS v;        //定义到这里就不会错了…………
    PINSEL0 = 0;                // 设置管脚连接
    IO0DIR = BEEP;              // 蜂鸣器控制口输出
    pdata = pdata;



你那个define的问题,我开始也没仔细看,不过你说编译通不过,那肯定是语法的问题,所以必须检查附近的语句。
还好你发现,不然会郁闷几天…………

我上次用define定义常量时,有一个数忘记了加0x,结果变成了10进制数,那个调试起来才郁闷…… 9: 还是00尽心,菜农实在没尽看...眼晕+脑晕 10: 确实,这样看是最让人头晕的。。。。。如果用编译器就爽,一编译,看那里错了,再双击,然后一看,哦……原来这里不小心写错了……………… 11: 00说的明白点“如果用编译器就爽,一编译,看那里错了”

圈圈,你说的“编译器”是指的什么啊。能不能详细的说说啊。我也想用。

照你说的我改过了,就正确了,而且我把程序中的所有全局变量都变成事件标志组了。 12: 这回才真晕了……编译器就是指你用来编译软件的那个东东呀……我这样在论坛上面看代码来找错误,是很痛苦的。

如果在编译器中,编译一下,如果有错误的话,编译器会指示出错误在哪,这样我就可以有针对性的找错误了………… 13: 这个论坛我只服上善若水一人晕到~~~

每个题目都发帖,... 14: 上有老水,下有小水最佩服圈圈 15: 我晕到~~~真是三水合一呀...楼上的肯定从山中来,有山有水才没...

云中月8888为何没来???来了准热闹. 16: 原来ID是不可以随意修改的啊~hotpower不要又晕到~ 17: 我发现KEIL ARM不是太稳定。。。有些忽悠。。。最让人晕的是,死就死吧,死了之后原来的工程就打不开…………我必须重新建立工程,还要搞一堆配置!真是忽悠啊………… 18: 很稳定啊keil ARM很稳定,配置也比ads简单
该不是你的电脑染病毒了? 19: 有山有水有云彩都说Keil好了,有人就是不听...

ARTX是Keil专为ARM打造的,没有什么移植问题的烦恼和顾虑.

而且升级也快...

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]