Ucos程序实验之事件标志组
对于ucos中源文件的信号量,邮箱以及消息队列、互斥信号量几个概念有简单的认知,但是一直不明白标志组管理是什么问题,所以决定在了解了定时器功能之后,开始分析事件标志组的问题。
翻阅了一些前辈的博客,找到了一篇简单易懂的博文,转载下来,即前一篇转载日志文章。这篇文章的举例很生动,不过,还可以再补充一点,即对于ALL使用全部置位或者全部清零的标志组管理 类似于之前博文的解释,若下载10集连续剧,等10集全部下载完毕后再观看;而对于使用ANY置位或清零管理的,则相当于同时下载两部电影,随便先下载下哪部电影来都可以观看。在此,以两个小程序来解释之: 一、使用OS_FLAG_WAIT_SET_ALL标志,即全部置位再进行下个程序 在ucos_ii.h中有宏定义
#define OS_FLAG_WAIT_SET_ALL #define OS_FLAG_WAIT_SET_ANY 在主程序中定义标志组结构的指针变量 OS_FLAG_GRP
*Sem_F
2u 3u
在主程序中初始化ucos后创建事件标志组: Sem_F = OSFlagCreate(0,&err); 第一个任务中申请事件标志
void MainTask(void *pdata) //Main Task create taks0 and task1 {
#if OS_CRITICAL_METHOD == 3 status register */
#endif
OS_ENTER_CRITICAL();
Timer0Init();
//initial timer0 for ucos time tick //initial interrupt prio or enable or
OS_CPU_SR cpu_sr;
/* Allocate storage for CPU
ISRInit(); disable
OS_EXIT_CRITICAL();
OSPrintfInit();
//use task to print massage to Uart
OSStatInit();
while(1) {
OSFlagPend(Sem_F,(OS_FLAGS)7,OS_FLAG_WAIT_SET_ALL,0,&err);
OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], Task0Prio);
OSTaskCreate (Task1,(void *)0, &Task1Stk[Task1StkLengh - 1], Task1Prio);
OSTaskCreate (Task2,(void *)0, &Task2Stk[Task2StkLengh - 1], Task2Prio);
//7表示0、1、2位都置1,ALL参数表示全部,0参数表示永不超时 }
在新创建的三个任务中分别对0、1、2置位 void Task0(void *pdata) {
while (1) {
OSTimeDly(OS_TICKS_PER_SEC*10);
}
OSPrintf(\开始看片!\\n\
OSTimeDly(OS_TICKS_PER_SEC*20);
}
}
OSPrintf(\下载完第一集\\n\
OSFlagPost(Sem_F,(OS_FLAGS)1,OS_FLAG_SET,&err); OSTaskDel(OS_PRIO_SELF);
void Task1(void *pdata) { }
void Task2(void *pdata) {
while (1) { } }
INT8U err; pdata = pdata;
if(user_task1_firstboot == 1) {
// RTC初始化 Rtc_Init();
user_task1_firstboot = 0;
OSTimeDly(OS_TICKS_PER_SEC*7);
OSFlagPost(Sem_F,(OS_FLAGS)2,OS_FLAG_SET,&err); OSPrintf(\下载完第二集\\n\OSTaskDel(OS_PRIO_SELF);
}
pdata = pdata;
if(user_task2_firstboot == 1) {
//LCD 初始化 Lcd_Display();
}
user_task2_firstboot = 0;
while(1) { }
OSPrintf(\下载完第三集\\n\
OSFlagPost(Sem_F,(OS_FLAGS)4,OS_FLAG_SET,&err); OSTaskDel(OS_PRIO_SELF);
编译后在串口输出如下:
二、使用OS_FLAG_WAIT_SET_ANY标志,即下载一个即可继续 只需要将开始任务中的
OSFlagPend(Sem_F,(OS_FLAGS)7,OS_FLAG_WAIT_SET_ALL,0,&err);参数换成 OS_FLAG_WAIT_SET_ANY即可。

