#include#include //标准C库文件,定义了各种类型的范围 #include "board.h" #include "led.h" #include "key.h" #include "uart.h" //#include "tim_mrt.h" const uint32_t OscRateIn = MAIN_OSC_XTAL_FREQ_HZ; const uint32_t ExtRateIn = EXT_CLOCK_IN_FREQ_HZ; //系统复位 #define System_restart (LPC_SWM->PINENABLE0 = 0xffffffffUL) #include "FreeRTOSConfig.h" #include "FreeRTOS.h" #include "task.h" #include "event_groups.h"//事件头文件 #include "queue.h"//队列头文件 #include "semphr.h"//信号量头文件 #include "timers.h"//软件定时器头文件 #define TASK_STACK_SIZE 32//每个任务的栈大小 #define KEY1_EVENT (0x01 << 0)//设置事件掩码的位 0 #define KEY2_EVENT (0x01 << 1)//设置事件掩码的位 1 static xTaskHandle LED_TaskHandle=NULL; static xTaskHandle KEY_TaskHandle=NULL; #define USE_CHAR 0 static void prvSetupHardware(void) { SystemCoreClockUpdate(); DEBUGINIT(); led_Init() ; Key_INIT(); // MRT_Init(); DEBUGOUT("%u MHzn",SystemCoreClock/1000000); Board_UARTPutSTR("build date: " __DATE__ " build time: " __TIME__ "n"); } static void LED_Task(void* parameter) { baseType_t xReturn=pdTRUE; u32 r_event=0;//接收事件 const TickType_t xMaxBlockTime = pdMS_TO_TICKS(500); while(1) { xReturn=xTaskNotifyWait(0x0,//进入函数的时候不清除任务 bit 0xFFFFFFFF,//退出函数的时候清除所有的 bitR &r_event,// 保存 ulNotifiedValue 到变量 xMaxBlockTime); if(pdTRUE ==xReturn) { printf("接收到消息邮箱数据 ulValue = %drn", r_event); } else Board_LED_Toggle(1); // vTaskDelay(200); } } static void KEY_Task(void* parameter) { // baseType_t xReturn =pdPASS; uint8_t ucCount = 0; u8 key2=0; while(1) { u8 key=0; if(Scan_Key()) vTaskDelay(20); else continue; if(!Scan_Key())continue; else { key=Scan_Key(); key2=key; } while(Scan_Key()){};//等按键抬起 if(key2) { switch(key2) { case 1: { printf ( "KEY1 被按下n" ); printf("K1 键按下,发送消息邮箱数据给任务 LED_Task ,覆盖方式rn"); xTaskNotify(LED_TaskHandle, ucCount++, eSetValueWithOverwrite); Board_LED_Toggle(6); }break; case 2: { printf ( "KEY2 被按下n" ); if(xTaskNotify(LED_TaskHandle, ucCount++, eSetValueWithoutOverwrite) == pdPASS) { printf("任务 LED_Task 的消息邮箱被更新rn"); } else { printf("任务 LED_Task 的消息邮箱数据未被更新rn"); } Board_LED_Toggle(5); }break; case 3: { }break; default:break; } key2=0; } } } static void AppTaskCreate(void) { baseType_t xReturn = pdPASS; taskENTER_CRITICAL();//进入临界区,禁止中断打断 xReturn = xTaskCreate(LED_Task, "Give_Task", TASK_STACK_SIZE*4, NULL, 2, &LED_TaskHandle); if (pdPASS == xReturn) printf("创建 Receive1_Task 任务成功!rn"); xReturn = xTaskCreate(KEY_Task, "KEY_Task", TASK_STACK_SIZE*5, NULL, 1, &KEY_TaskHandle); if (pdPASS == xReturn) printf("创建 Send_Task 任务成功!rn"); taskEXIT_CRITICAL(); //退出临界区 } int main(void) { prvSetupHardware(); Board_UARTPutSTR("LPC824 FreeRTOS 任务通知任务间通信 n"); AppTaskCreate(); vTaskStartScheduler();//任务调度 while (1) { printf("FreeRTOS 运行失败nr"); } }
K1键按下,发送消息邮箱数据给任务LED_Task,覆盖方式。
K2键按下,发送消息邮箱数据给任务LED_Task,非覆盖方式。实验现象:
key按键任务里面,当KEY1和KEY2都按下后,LED任务打印出来。
LED任务接收。使用函数:
发送 xTaskNotify();
接收 xTaskNotifyWait();
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)