这篇来实现事件队列。
事件队列源代码: 【
QueueEvent.zip】
很简单,只要事件发生了,将事件加入到事件队列中,
而在主函数中,不断查询事件队列,如果事件队列中有事件发生,则执行。
例子1:实现当串口接收到数据时,产生数据接收事件,接收到后,回显到打印端口上。
代码处理:
-
-
uint8_t receivedChar;
-
static void OnCharRecEvent(void* data); //真正的事件执行函数
-
static event_t charRecEvent = EVENT_INIT(OnCharRecEvent); //定义和初始化串口接收事件
-
-
void USART1_IRQHandler(void) // 这个是串口接收中断程序,当串口接收到数据,进入该中断函数
-
{
-
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
-
{
-
receivedChar = USART_ReceiveData(USART1);
-
-
// 添加事件,通知主程序,发生中断接收事件。
-
// 进行异步处理。
-
EventQueue_Enqueue_ISR(&charRecEvent); /* 中断事件发生 */
-
-
}
-
}
-
-
-
/* 接收中断事件处理函数 */
-
static void OnCharRecEvent(void* data)
-
{
-
static uint8_t a_tmp = 0;
-
-
a_tmp = receivedChar;
-
uart_sendChar(a_tmp); // 回显到串口调试助手上
-
-
// add your code here.
-
-
}
-
如果还有其他的事件,可以以同样的方式,构造一个事件结构体,并在合适的时候,将该事件加入到事件队列中。
总结:
1. 构造一个事件,并指定执行函数 (
OnCharRecEvent
)
charRecEvent
= EVENT_INIT
(OnCharRecEvent
);
2. 当事件发生时,将该事件加入到事件队列中:
EventQueue_Enqueue_ISR
(&charRecEvent
); /* 中断事件发生
*/
在主程序中,不断查询队列中是否有事件产生:
-
int main(void)
-
{
-
volatile static event_t* event;
-
board_init();
-
-
while(1)
-
{
-
event = EventQueue_GetPendingEvent(); // 获取事件
-
if (event)
-
{
-
event->execute(event->data); // 执行事件
-
}
-
}
-
}
阅读(1337) | 评论(0) | 转发(0) |