不知道是不是,之前有长时间学过CONTIKI NG操作系统原因,我觉得TOS的事件太简单了,
只是为了不同的标志,进行任务同步工作而已。对了之前队列是任务异步工作的。
在TencentOS-tiny\board\SWM320_DISCOVERY\BSP\Src建个
tOS_event.c 如下
#include "tos_k.h" #include "mcu_init.h" // 任务栈大小 #define STK_SIZE_TASK_LISTENER 512 #define STK_SIZE_TASK_TRIGGER 512 k_stack_t stack_task_listener1[STK_SIZE_TASK_LISTENER]; k_stack_t stack_task_listener2[STK_SIZE_TASK_LISTENER]; k_stack_t stack_task_trigger[STK_SIZE_TASK_TRIGGER]; // 任务句柄 k_task_t task_listener1; k_task_t task_listener2; k_task_t task_trigger; // 任务回调函数 extern void entry_task_listener1(void *arg); extern void entry_task_listener2(void *arg); extern void entry_task_trigger(void *arg); // 事件标示 const k_event_flag_t event_eeny = (k_event_flag_t)(1 << 0); // 1 占1个bit位 const k_event_flag_t event_meeny = (k_event_flag_t)(1 << 1); // 2 const k_event_flag_t event_miny = (k_event_flag_t)(1 << 2); // 4 const k_event_flag_t event_moe = (k_event_flag_t)(1 << 3); // 8 k_event_t event; // 事件句柄 /*--------接收事件1-----------------------------------------*/ void entry_task_listener1(void *arg) { k_event_flag_t flag_match; k_err_t err; while (K_TRUE) { // 此任务监听四个事件,因为使用了TOS_OPT_EVENT_PEND_ALL选项,因此必须是四个事件同时到达此任务才会被唤醒 err = tos_event_pend(&event, event_eeny | event_meeny | event_miny | event_moe, &flag_match, TOS_TIME_FOREVER, TOS_OPT_EVENT_PEND_ALL | TOS_OPT_EVENT_PEND_CLR); if (err == K_ERR_NONE) { printf("entry_task_listener1:\n"); printf("eeny, meeny, miny, moe, they all come\n"); } } } /*--------接收事件2-----------------------------------------*/ void entry_task_listener2(void *arg) { k_event_flag_t flag_match; k_err_t err; while (K_TRUE) { // 此任务监听四个事件,因为使用了TOS_OPT_EVENT_PEND_ANY选项,因此四个事件任意一个到达(包括四个事件同时到达)任务就会被唤醒 err = tos_event_pend(&event, event_eeny | event_meeny | event_miny | event_moe, &flag_match, TOS_TIME_FOREVER, TOS_OPT_EVENT_PEND_ANY | TOS_OPT_EVENT_PEND_CLR); if (err == K_ERR_NONE) { printf("entry_task_listener2:\n"); // 有事件到达,判断具体是哪个事件 if (flag_match == event_eeny) { printf("eeny comes\n"); } if (flag_match == event_meeny) { printf("meeny comes\n"); } if (flag_match == event_miny) { printf("miny comes\n"); } if (flag_match == event_moe) { printf("moe comes\n"); } if (flag_match == (event_eeny | event_meeny | event_miny | event_moe)) { printf("all come\n"); } } } } /*--------发布事件者-----------------------------------------*/ void entry_task_trigger(void *arg) { int i = 1; while (K_TRUE) { if (i == 2) { printf("entry_task_trigger:\n"); printf("eeny will come\n"); // 发送eeny事件,task_listener2会被唤醒 tos_event_post(&event, event_eeny); } if (i == 3) { printf("entry_task_trigger:\n"); printf("meeny will come\n"); // 发送eeny事件,task_listener2会被唤醒 tos_event_post(&event, event_meeny); } if (i == 4) { printf("entry_task_trigger:\n"); printf("miny will come\n"); // 发送eeny事件,task_listener2会被唤醒 tos_event_post(&event, event_miny); } if (i == 5) { printf("entry_task_trigger:\n"); printf("moe will come\n"); // 发送eeny事件,task_listener2会被唤醒 tos_event_post(&event, event_moe); } if (i == 6) { printf("entry_task_trigger:\n"); printf("all will come\n"); // 同时发送四个事件,因为task_listener1的优先级高于task_listener2,因此这里task_listener1会被唤醒 tos_event_post(&event, event_eeny | event_meeny | event_miny | event_moe); } tos_task_delay(1000); ++i; } } /*-------------------------测试的应用函数入口--------------------------------*/ void application_event(void *arg) // event的测试 { tos_event_create(&event, (k_event_flag_t)0u); // 这里task_listener1的优先级比task_listener2高,因此在task_trigger // 发送所有事件时,task_listener1会被唤醒读者可以尝试将task_listener1 // 优先级修改为5(比task_listener2低),此设置下,在task_trigger发送 // 所有事件时,task_listener2将会被唤醒。 tos_task_create(&task_listener1, "listener1", entry_task_listener1, NULL, 3, stack_task_listener1, STK_SIZE_TASK_LISTENER, 0); tos_task_create(&task_listener2, "listener2", entry_task_listener2, NULL, 4, stack_task_listener2, STK_SIZE_TASK_LISTENER, 0); tos_task_create(&task_trigger, "trigger", entry_task_trigger, NULL, 4, stack_task_trigger, STK_SIZE_TASK_TRIGGER, 0); }
在线仿真时OK的,
再见!!