美文网首页
嵌入式RTOS:实时构件之事件

嵌入式RTOS:实时构件之事件

作者: 片缕光阴 | 来源:发表于2019-10-09 22:53 被阅读0次

一、事件系统

中断不能执行太过复杂的工作,可以设置一个事件标志,来让主循环和事件处理程序执行繁重的工作,事件处理循环将采用异步方式处置这个标志。

二、事件句柄

声明事件句柄的类型

typedef  uint8_t  EVNT_Handle;

列出将要使用的不同事件

/*<系统初始化事件>*/

#define  EVNT_INT  0

/*!<事件1 : SW1 按下  */

#define  EVNT_SW1_PRESSED  1

/*!<事件1 : SW2 按下  */

#define  EVNT_SW2_PRESSED  2

/*!<事件1 : SW3 按下  */

#define  EVNT_SW3_PRESSED  3

/*!<事件1 : SW4 按下  */

#define  EVNT_SW4_PRESSED  4

/*!<哨兵事件数  */

#define  EVNT_SW5_PRESSED  5

事件分时间片执行,可采用枚举类型进行定义

typedef  enum {

       EVNT_INIT,                                 /*  !, 系统初始化事件  */

       EVNT_SW1_PRESSED,                /*!<事件1 : SW1 按下  */

       EVNT_SW2_PRESSED,                /*!<事件2 : SW2 按下  */

       EVNT_SW3_PRESSED,                /*!<事件3 : SW3 按下  */

       EVNT_SW4_PRESSED,                /*!<事件4 : SW4 按下  */

       EVNT_NOF_EVENTS,                  /*!<哨兵事件数 : 不同事件的数目 */

}EVENT_Handle;

三、事件方法

/* !

** \设置一个事件

** \param[in]事件,设置事件处理

*/

void  EVNT_SetEvent(EVENT_Handle event);

/* !

** \清除一个事件

** \param[in]事件,清除事件处理

*/

void  EVNT_ClearEvent(EVENT_Handle event);

/* !

** \返回一个事件的状态

** \param[in]事件,检查事件的事件处理

** \如果设置了事件,返回TRUE,否则返回FALSE

*/

void  EVNT_GetEvent(EVENT_Handle event);

/* !

** \程序检查是否一个事件挂起

** \如果一个事件挂起,事件被清除并且调用回调函数

** \param[in]调用回调函数。

** \事件句柄传送给回调函数

*/

void  EVNT_HandleEvent(void( * callback)(EVNT_Handle));

/* ! \事件模型初始化 */

void  EVNT_Init(void);

四、事件数据结构

EVNT_SetEvent(EVENT_Handle event){

      EVNT_Event[event/8] |= 0x80>>(event % 8);  

}

void  EVNT_ClearEvent(EVENT_Handle event){

     EVNT_Event[event/8]&= ~(0x80>>(event % 8));  

}

EVNT_GetEvent(EVENT_Handle event){

     return   (bool)(EVNT_Events[(event)/8]&(0x80>>((event)%8)));

}

五、事件处理

void  EVNT_HandleEvent(void  (* callback)(EVNT_Handle)) {

         /* 处理一个具有最高优先级的事件,0表示最高的优先级 */

         uint8_t  event;  

         EnterCritical();

         for(event = 0; event < EVNT_NOF_EVENTS; event++){

                if(EVNT_GetEvent(event)){  /* 当前的事件? */

                     EVNT_ClearEvent(event);   /*清除事件 */  

                     break;   /*退出循环*/

                }

         }

         ExitCritical();

         if(event != EVNT_NOF_EVENTS) {

                callback(event)

         }

}

六、集成

void  main(void)

{

       EVNT_SetEvent(EVNT_INIT);

       for(;;){

            EVNT_HandleEvent(APP_HandleEvent);

       }

}

用EVNT_HandleEvent()函数传送一个额外的回调函数指针 APP_HandleEvent

void  APP_HandleEvent(EVENT_Handle){

       switch(event){

             case  EVNT_INIT:

             break;

             case  EVNT_SW1_PRESSED:

             /* user code*/

             break;

             case  EVNT_SW2_PRESSED:

             /* user code*/

             break;

       }

}

void  interrupt  KeyISR(void)

{

       ACK_KBI_INTERRUPT();         /* 确认中断*/

       if(Key1Pressed()){

                 EVNT_SetEvent(EVNT_SW1_PRESSED);

       }

       else if(Key2Pressed()){

                 EVNT_SetEvent(EVNT_SW2_PRESSED);

       }

}

相关文章

  • 嵌入式RTOS:实时构件之事件

    一、事件系统 中断不能执行太过复杂的工作,可以设置一个事件标志,来让主循环和事件处理程序执行繁重的工作,事件处理循...

  • 嵌入式之扫盲

    1.FreeRTOS 在嵌入式领域中,嵌入式实时操作系统正得到越来越广泛的应用。采用嵌入式实时操作系统(RTOS...

  • 技术大咖带你进入FreeRTOS

    在嵌入式领域中,嵌入式实时操作系统正得到越来越广泛的应用。采用嵌入式实时操作系统(RTOS)可以更合理、更有效地利...

  • 技术交流 | 漫谈嵌入式实时操作系统

    01.概述 嵌入式实时操作系统(Real-Time Operating System,RTOS)是指工作在资源(空...

  • FreeRTOS简介与源码下载

    RTOS系统 实时操作系统 RTOS全称:Real Time OS,实时操作系统,强调实时性。 实时操作系统分为硬...

  • SAFERTOS在医疗设备中的应用

    SAFERTOS为开发人员提供响应迅速、稳健、确定性的嵌入式实时操作系统 (RTOS)。它包含开发医疗设备所需的功...

  • RTOS

    Real-time operating system,RTOS RTOS系统 实时系统(Real-time ope...

  • 阿九讲学(六)——为什么使用RTOS内核

    如果系统功能很简单,很多优秀的嵌入式软件并没有实时操作系统,因为增加RTOS内核反而会增加资源的消耗。比如说你学校...

  • 0817 A

    架构师之路 嵌入式系统 硬件汇编 C 嵌入式&pc应用 硬件操作系统:RTOS Linux windows应用软件...

  • 浅议实时操作系统RTOS

    01.什么是实时操作系统(RTOS)? 实时操作系统 (Real-Time Operating System,RT...

网友评论

      本文标题:嵌入式RTOS:实时构件之事件

      本文链接:https://www.haomeiwen.com/subject/igunpctx.html