1 2 #include <stdint.h> 3 4 #include "bsp-fifisdr.h" 5 6 #include "lpclib.h" 7 #include "task-gui.h" 8 9 10 #define GUI_QUEUE_LENGTH (4) 11 12 13 typedef struct { 14 uint8_t opcode; 15 } GUI_Message; 16 17 18 /** Message opcodes for GUI task. */ 19 enum { 20 GUI_OPCODE_LED_TICK, 21 }; 22 23 24 /** Identifiers for OS timers. */ 25 enum { 26 GUI_TIMERMAGIC_LED, 27 }; 28 29 30 /** Local task context. */ 31 static struct { 32 osMailQId queue; 33 osTimerId ledTick; 34 int led; 35 } gui; 36 37 38 39 static void GUI_osalCallback (void const *pArgument) 40 { 41 (void) pArgument; 42 43 if (gui.queue == NULL) { 44 return; 45 } 46 47 GUI_Message *pMessage = osMailAlloc(gui.queue, 0); 48 49 if (pMessage == NULL) { 50 return; 51 } 52 53 pMessage->opcode = GUI_OPCODE_LED_TICK; 54 osMailPut(gui.queue, pMessage); 55 } 56 57 58 osMailQDef(guiQueue, GUI_QUEUE_LENGTH, GUI_Message); 59 osTimerDef(led, GUI_osalCallback); 60 61 void GUI_task (const void *pArgs) 62 { 63 (void) pArgs; 64 GUI_Message *pMessage; 65 osEvent event; 66 67 68 gui.queue = osMailCreate(osMailQ(guiQueue), NULL); 69 70 gui.ledTick = osTimerCreate(osTimer(led), osTimerPeriodic, (void *)GUI_TIMERMAGIC_LED); 71 osTimerStart(gui.ledTick, 500); 72 73 while (1) { 74 /* Is there a new message? */ 75 event = osMailGet(gui.queue, osWaitForever); 76 if (event.status == osEventMail) { 77 pMessage = (GUI_Message *)event.value.p; 78 switch (pMessage->opcode) { 79 case GUI_OPCODE_LED_TICK: 80 gui.led = gui.led ^ 1; 81 BSP_setLed(gui.led); 82 break; 83 } 84 85 osMailFree(gui.queue, pMessage); 86 } 87 } 88 }
CMSIS Example - Mail and Timer
时间: 2024-10-14 02:09:15