CMSIS Example - Mail and Timer

复制代码
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    }
复制代码
posted @   IAmAProgrammer  阅读(540)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
历史上的今天:
2013-07-18 Bus Blaster
点击右上角即可分享
微信分享提示