首页 > 代码库 > CMSIS Example - Mail and Timer

CMSIS Example - Mail and Timer

12    #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    }