Chinaunix首页 | 论坛 | 博客
  • 博客访问: 831527
  • 博文数量: 281
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2770
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-02 19:45
个人简介

邮箱:zhuimengcanyang@163.com 痴爱嵌入式技术的蜗牛

文章分类
文章存档

2020年(1)

2018年(1)

2017年(56)

2016年(72)

2015年(151)

分类: LINUX

2015-12-10 15:05:02

这篇来实现事件队列。
事件队列源代码: 【QueueEvent.zip

很简单,只要事件发生了,将事件加入到事件队列中,
而在主函数中,不断查询事件队列,如果事件队列中有事件发生,则执行。



例子1:实现当串口接收到数据时,产生数据接收事件,接收到后,回显到打印端口上。
代码处理:

点击(此处)折叠或打开


  1. uint8_t receivedChar;
  2. static void OnCharRecEvent(void* data);           //真正的事件执行函数
  3. static event_t charRecEvent = EVENT_INIT(OnCharRecEvent);  //定义和初始化串口接收事件

  4. void USART1_IRQHandler(void)  // 这个是串口接收中断程序,当串口接收到数据,进入该中断函数
  5. {
  6.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  7.     {
  8.         receivedChar = USART_ReceiveData(USART1);
  9.         
  10.         // 添加事件,通知主程序,发生中断接收事件。
  11.         // 进行异步处理。
  12.         EventQueue_Enqueue_ISR(&charRecEvent); /* 中断事件发生 */
  13.         
  14.     }
  15. }


  16. /* 接收中断事件处理函数 */
  17. static void OnCharRecEvent(void* data)
  18. {
  19.     static uint8_t a_tmp = 0;

  20.     a_tmp = receivedChar;
  21.     uart_sendChar(a_tmp);  // 回显到串口调试助手上

  22.     // add your code here.   

  23. }


如果还有其他的事件,可以以同样的方式,构造一个事件结构体,并在合适的时候,将该事件加入到事件队列中。
总结:
    1. 构造一个事件,并指定执行函数 (OnCharRecEvent
                 charRecEvent = EVENT_INIT(OnCharRecEvent);

    2. 当事件发生时,将该事件加入到事件队列中:
                EventQueue_Enqueue_ISR(&charRecEvent); /* 中断事件发生 */



在主程序中,不断查询队列中是否有事件产生:

点击(此处)折叠或打开

  1. int main(void)
  2. {    
  3.     volatile static event_t* event;
  4.     board_init();
  5.      
  6.     while(1)
  7.     {
  8.         event = EventQueue_GetPendingEvent();  // 获取事件
  9.         if (event)
  10.         {
  11.             event->execute(event->data);      // 执行事件
  12.         }
  13.     }
  14.  }





阅读(1337) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~