|
话说我们小区管理处挺给力的,以前大门常开,谁想进就进,想出就出,给把钥匙吧就是个样子!但最近由于大家反映,小区常有陌生人出入,管理处也头大啊,天天盯着陌生人,工作量大多了!于是,管理处发了个通知,增加门禁功能!这回好了,进出小区必须拿卡刷,没卡,不好意思,你进不来!正好我去管理处领卡,碰到一个大妈,他也来拿卡,手上还拎着个菜蓝子!
回来的路上我就想啊,这门禁不就是我们系统中的事件吗?
什么是事件呢?
事件是操作系统中的一种触发机制,在特定的时间或者情况下,可以对特定的动作进行触发,它可以应用在不同的任务或者任务与中断函数中进行任务同步!
我就根据小区的事情做个例子,大家一起讨论一下!事件的API函数见MQX中的event.h文件中!
假设,我们小区有三个住户,一个白领,一个是大妈,而另一个呢,比较烦人,做安利的!
现在呢,我先做个门禁的任务,门禁的任务比较简单,就是别人要拿卡开门,它就给开:
- void MainTask(uint32_t para)
- {
- void *event_ptr;
- if (_event_create("door") != MQX_OK) //创建个门禁系统(事件)
- {
- printf("\nMake event failed");
- _task_block();
- }
- if (_event_open("door", &event_ptr) != MQX_OK) //获得门禁系统的控制权(打开事件)
- {
- printf("\nOpen event failed");
- _task_block();
- }
- /* Create the print tasks */
- _task_create(0, WHIT_TASK, 0); //白领搬进小区了
- _task_create(0, AUNT_TASK, 0); //大妈搬进小区了
- _task_create(0, AMWA_TASK, 0); //安利也搬进小区了
-
- while(1)
- {
- if (_event_wait_all_ticks(event_ptr, 0x01, 0) != MQX_OK) //等待有人拿卡开门
- {
- printf("\nEvent Wait failed");
- _task_block();
- }
- printf("The door is open! \n\n");
- if (_event_clear(event_ptr,0x01) != MQX_OK) //自动关门
- {
- printf("\nEvent Clear failed");
- _task_block();
- }
- }
- }
复制代码
有门禁系统了,区民也都搬进来了,我们看看居民一天的交通情况吧:
我们先看白领,白领呢,生活比较有规律,朝9晚6,早上去上班,下午回来。它的任务如下:
- void WhiteCollarTask(uint32_t para)
- {
- void *event_ptr;
- if (_event_open("door",&event_ptr) != MQX_OK) //先领到门禁卡(打开事件)
- {
- printf("\nOpen Event failed");
- _task_block();
- }
-
- printf("White Collar go to work!\n");
- if (_event_set(event_ptr,0x01) != MQX_OK) //上班要出去,开门(设置事件)
- {
- printf("\nSet Event failed");
- _task_block();
- }
- _time_delay(1000);
- printf("White Collar go home!\n");
- if (_event_set(event_ptr,0x01) != MQX_OK) //下班要回来,开门(设置事件)
- {
- printf("\nSet Event failed");
- _task_block();
- }
- }
复制代码
再看看大妈,大妈的生活也很有规律,就是事稍稍多了点,早上得去买菜,下午还要去跳广场舞:
- void AuntTask(uint32_t para)
- {
- void *event_ptr;
- if (_event_open("door",&event_ptr) != MQX_OK) //领到门禁卡,拥有门禁控制权 (打开事件)
- {
- printf("\nOpen Event failed");
- _task_block();
- }
-
- printf("Aunt buy food!\n");
- if (_event_set(event_ptr,0x01) != MQX_OK) //大妈去买菜,开门 (设置事件)
- {
- printf("\nSet Event failed");
- _task_block();
- }
- _time_delay(100);
- printf("Aunt buy food back!\n");
- if (_event_set(event_ptr,0x01) != MQX_OK) //大妈买菜回来了,开门 (设置事件)
- {
- printf("\nSet Event failed");
- _task_block();
- }
- _time_delay(300);
- printf("Aunt go to dance!\n");
- if (_event_set(event_ptr,0x01) != MQX_OK) //大妈去跳舞,开门 (设置事件)
- {
- printf("\nSet Event failed");
- _task_block();
- }
- _time_delay(100);
-
- printf("Aunt dance back!\n");
- if (_event_set(event_ptr,0x01) != MQX_OK) //大妈跳舞回来了,开门 (设置事件)
- {
- printf("\nSet Event failed");
- _task_block();
- }
- }
复制代码
还有做安利的,这个挺烦人的,进进出出的客户:
- void AmwayTask(uint32_t para)
- {
- void *event_ptr;
- int i;
- if (_event_open("door",&event_ptr) != MQX_OK) //安利也拿到控制权了
- {
- printf("\nOpen Event failed");
- _task_block();
- }
-
- for(i = 0; i < 2; i++) //我让他客户少点,只有两个人
- {
- printf("Amway customer come!\n");
- if (_event_set(event_ptr,0x01) != MQX_OK) //来客户了,开门
- {
- printf("\nSet Event failed");
- _task_block();
- }
- _time_delay(100);
- printf("Amway customer go!\n");
- if (_event_set(event_ptr,0x01) != MQX_OK) //客户走了,关门
- {
- printf("\nSet Event failed");
- _task_block();
- }
- _time_delay(200);
- }
- }
复制代码
好吧,现在一切都可以了,还少了Z.F.的安排:
- const TASK_TEMPLATE_STRUCT MQX_template_list[] =
- {
- /* Task Index, Function, Stack, Priority, Name, Attributes, Param, Time Slice */
- { MAIN_TASK, MainTask, 1500, 9, "main", MQX_AUTO_START_TASK, 0, 0 },
- { WHIT_TASK, WhiteCollarTask, 1500, 5, "White", MQX_USER_TASK , 0, 0},
- { AUNT_TASK, AuntTask, 1500, 6, "Aunt", MQX_USER_TASK , 0, 0},
- { AMWA_TASK, AmwayTask, 1500, 8, "Amway", MQX_USER_TASK , 0, 0},
- { 0 }
- };
复制代码
这回万事齐备了,整个小区开始了他们一天的生活:
从结果来看,我们可以看到:
早上,白领去上班,大妈去买菜,安利客户来了,三个事件碰到一起了,所以事件只响应了一次,门只打开了一次
再到后来呢,大妈买菜回来了,第一个安利客户走了,两个事件又碰到一起了,所以呢,门也只用打开一次
再后来就大家各自进进出出都没碰到,那门就有点累了,每个事件都响应了一次,每个人到门口都各自打开一次
呵呵!不错,希望我们小区管理处以后能坚持这样管理啊,减少不必要的情况发生!
最后照例是例程:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|