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

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

文章分类
文章存档

2020年(1)

2018年(1)

2017年(56)

2016年(72)

2015年(151)

分类: 嵌入式

2015-10-20 13:53:32

对于一个driver程序,比如ADC,timer模块,都可以利用三个文件来描述。
利用C++面向对象的特性,每个模块都是一个具有属性的物体,都有自己的方法。

模板包括一下三个文件:
Template.c, Template.h, Template_Init.h



Template_Init.h文件:该文件提供driver模块的接口函数,以及相关属性。

点击(此处)折叠或打开

  1. /**
  2. \file
  3. \brief


  4. \project{}
  5. \component{ }

  6. $lastChangedDate: $
  7. $Revision: $
  8. $Author: $


  9. */
  10. #ifndef __TEMPLATE_INIT_H__
  11. #define __TEMPLATE_INIT_H__

  12. /*******************************************************************************
  13. * INCLUDE FILES
  14. *******************************************************************************/
  15. #include "Template.h"



  16. /*******************************************************************************
  17. * C++ DECLARATION WRAPPER
  18. *******************************************************************************/
  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif


  22. /*************************************************************************
  23. * FUNCTIONS
  24. *************************************************************************/
  25. //const B_Chg_Interface_t *B_Chg_GetInterface(void);




  26. /*******************************************************************************
  27. * END OF C++ DECLARATION WRAPPER
  28. *******************************************************************************/
  29. #ifdef __cplusplus
  30. }
  31. #endif

Template.h: driver模块底层的包含头文件

点击(此处)折叠或打开

  1. /**
  2. \file
  3. \brief


  4. \project{}
  5. \component{ }

  6. $lastChangedDate: $
  7. $Revision: $
  8. $Author: $


  9. */


  10. #ifndef _TEMPLATE_H_
  11. #define _TEMPLATE_H_


  12. /*******************************************************************************
  13. * INCLUDE FILES
  14. *******************************************************************************/


  15. /*******************************************************************************
  16. * C++ DECLARATION WRAPPER
  17. *******************************************************************************/
  18. #ifdef __cplusplus
  19. extern "C" {
  20. #endif



  21. /*******************************************************************************
  22. * CONSTANTS, MACROS, TYPEDEFS
  23. *******************************************************************************/



  24. /*******************************************************************************
  25. * END OF C++ DECLARATION WRAPPER
  26. *******************************************************************************/
  27. #ifdef __cplusplus
  28. }
  29. #endif



  30. #endif

Template.C 文件: Driver模块的功能真正实现文件

点击(此处)折叠或打开

  1. /**
  2. \file


  3. \project{}
  4. \component{}

  5. $lastChangedDate: $
  6. $Revision: $
  7. $Author: $


  8. */

  9. /*********************************************************************
  10.  * INCLUDES
  11.  */
  12. #include "Template_Init.h"

  13. /*********************************************************************
  14.  * MACROS
  15.  */


  16. /*********************************************************************
  17.  * CONSTANTS
  18.  */

  19. /*********************************************************************
  20.  * LOCAL VARIABLES
  21.  */

  22. /*********************************************************************
  23.  * LOCAL FUNCTIONS
  24.  */

  25.  
  26. /*********************************************************************
  27.  * EXPORTED INTERFACE FUNCTIONS
  28.  */

  29.  /********************************************************************
  30.  * IRSs
  31.  */
  32.  
  33. /********************************************************************
  34.  * GLOBAL FUNCTIONS
  35.  */




简单例子说明:
一个充电模块

1> B_Chg_Init.h: 该文件为外部文件所调用,所以提供了接口函数和一些相关的宏定义。

点击(此处)折叠或打开

  1. /**
  2. \file B_Chg_Init.h
  3. \brief charger module driver header file


  4. \project{}
  5. \component{B_Chg, charger module driver component}

  6. $lastChangedDate: $
  7. $Revision: $
  8. $Author: $


  9. */
  10. #ifndef _B_CHG_INIT_H_
  11. #define _B_CHG_INIT_H_


  12. /*******************************************************************************
  13. * INCLUDE FILES
  14. *******************************************************************************/
  15. #include "B_Chg.h"                           // 包含头文件

  16. // 宏定义
  17. #define CHG_LED_ON() (CHG_LED_PORT &=~ BIT(CHG_LED_PIN))
  18. #define CHG_LED_OFF() (CHG_LED_PORT |= BIT(CHG_LED_PIN))
  19. #define CHG_LED_FLASHING() (CHG_LED_PORT ^= BIT(CHG_LED_PIN))

  20. /*******************************************************************************
  21. * C++ DECLARATION WRAPPER
  22. *******************************************************************************/
  23. #ifdef __cplusplus
  24. extern "C" {
  25. #endif


  26. /*************************************************************************
  27. * FUNCTIONS
  28. *************************************************************************/
  29. const B_Chg_Interface_t *B_Chg_GetInterface(void);   // 接口函数的定义




  30. /*******************************************************************************
  31. * END OF C++ DECLARATION WRAPPER
  32. *******************************************************************************/
  33. #ifdef __cplusplus
  34. }
  35. #endif


  36. #endif

2> B_Chg.h: 底层驱动的头文件

点击(此处)折叠或打开

  1. /**
  2. \file B_Chg.h
  3. \brief charger module driver header file


  4. \project{}
  5. \component{B_Chg, charger module driver component}

  6. $lastChangedDate: $
  7. $Revision: $
  8. $Author: $


  9. */

  10. #ifndef _B_CHG_H_
  11. #define _B_CHG_H_


  12. /*******************************************************************************
  13. * INCLUDE FILES
  14. *******************************************************************************/
  15. #include "bsp.h"


  16. /*******************************************************************************
  17. * C++ DECLARATION WRAPPER
  18. *******************************************************************************/
  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif



  22. /*******************************************************************************
  23. * CONSTANTS, MACROS, TYPEDEFS
  24. *******************************************************************************/
  25. typedef enum B_Chg_Status_t
  26. {
  27.     B_Chg_noChg =0,
  28.     B_Chg_chging,
  29.     B_Chg_full,
  30.     B_Chg_failure,
  31.     B_Chg_invalid,
  32.     
  33. }B_Chg_Status_t;


  34. typedef enum B_Chg_IndicatorStatus
  35. {
  36.     B_Chg_IndicatorStatus_ON,
  37.     B_Chg_IndicatorStatus_OFF,
  38.     B_Chg_IndicatorStatus_FLASHING,
  39.     
  40. }B_Chg_IndicatorStatus;

  41. // 定义结构体,封装函数接口
  42. typedef struct B_Chg_Interface_t
  43. {
  44.     void (*B_ChgCtrl_PinInit)(void);
  45.     B_Chg_Status_t (*B_ChgCtrl_ReadStatus)(void);

  46.     void (*B_ChgIndicator_PinInit)(void);
  47.     void (*B_ChgIndicator_Output)(B_Chg_Status_t);
  48.     
  49.      int8_t endOfList;
  50.     
  51. }B_Chg_Interface_t;



  52. /*******************************************************************************
  53. * END OF C++ DECLARATION WRAPPER
  54. *******************************************************************************/
  55. #ifdef __cplusplus
  56. }
  57. #endif

3> B_Chg.c: 驱动实现函数

点击(此处)折叠或打开

  1. /**
  2. \file B_Chg.c


  3. \project{}
  4. \component{B_Chg, charger module driver component}

  5. $lastChangedDate: $
  6. $Revision: $
  7. $Author: $


  8. */

  9. /*********************************************************************
  10.  * INCLUDES
  11.  */
  12. #include "B_Chg_Init.h"

  13. /*********************************************************************
  14.  * MACROS
  15.  */

  16. // PD2
  17. #define CHG_CHARGEING_FAULT       0x00
  18. #define CHG_CHARGEING_NOFAULT     0x04

  19. // PC5
  20. #define CHG_CHARGEING_FULL 0x20
  21. #define CHG_CHARGEING_NOW 0x00

  22. /*********************************************************************
  23.  * CONSTANTS
  24.  */

  25. /*********************************************************************
  26.  * LOCAL VARIABLES
  27.  */



  28. /*********************************************************************
  29.  * LOCAL FUNCTIONS
  30.  */

  31.  
  32. /*********************************************************************
  33.  * EXPORTED INTERFACE FUNCTIONS
  34.  */
  35. static void B_ChgCtrl_PinInit(void)
  36. {
  37.     // 1. FAULT port pin
  38.     CHG_FAULT_DIR_REG &=~ BIT(CHG_FAULT_PIN); // Configure to input mode

  39.     // 2. Status read pin: PC4;
  40.     CHG_SEN_DIR_REG &=~ BIT(CHG_SEN_PIN);
  41. }


  42. static B_Chg_Status_t B_ChgCtrl_ReadStatus(void)
  43. {
  44.     B_Chg_Status_t chg_status;

  45.     if( CHG_READ_CHGING_STATUS == CHG_CHARGEING_FULL)
  46.         chg_status = B_Chg_full;
  47.     else
  48.         chg_status = B_Chg_chging;

  49.     return chg_status;
  50. }


  51. static void B_ChgIndicator_PinInit(void)
  52. {
  53.     CHG_LED_DIR_REG |= BIT(CHG_LED_PIN);
  54.     CHG_LED_OFF();
  55. }



  56. extern volatile bool B_Chg_isLedFlash;

  57. static void B_ChgIndicator_Output(B_Chg_Status_t chg_status)
  58. {
  59.     switch(chg_status)
  60.     {
  61.         case B_Chg_full:{

  62.             CHG_LED_OFF();
  63.             B_Chg_isLedFlash = false;
  64.             
  65.         }break;
  66.         
  67.         case B_Chg_chging:{

  68.             CHG_LED_ON();
  69.             B_Chg_isLedFlash = false;
  70.             
  71.         }break;
  72.         
  73.         case B_Chg_failure:{

  74.             //CHG_LED_FLASHING();
  75.             B_Chg_isLedFlash = true;
  76.             
  77.         }break;        

  78.         default:
  79.             CHG_LED_OFF();
  80.             break;
  81.     }
  82. }


  83.  /********************************************************************
  84.  * IRSs
  85.  */
  86.  
  87. /********************************************************************
  88.  * GLOBAL FUNCTIONS
  89.  */
  90. // 真正的接口函数
  91. const B_Chg_Interface_t *B_Chg_GetInterface(void)
  92. {
  93.     // 注意: 这里一定要定义成static形式,为什么呢?
  94.     static const B_Chg_Interface_t intf =
  95.     {
  96.         B_ChgCtrl_PinInit,
  97.         B_ChgCtrl_ReadStatus,
  98.         B_ChgIndicator_PinInit,
  99.         B_ChgIndicator_Output,
  100.         -1, // guard
  101.     };

  102.     return &intf;
  103. }





上层应用:
在main函数中,

点击(此处)折叠或打开


  1. static B_Chg_Interface_t * s_B_Chg_Intf = NULL;  

  2. static void Sys_Interface_Init(void)
  3. {
  4.     /* 1. get interface */
  5.     s_B_Chg_Intf = B_Chg_GetInterface();  // 获取接口
  6.     s_C_Motor_Intf = C_Motor_GetInterface();
  7.     s_D_HtSensor_Intf = D_HtSensor_GetInterface();


  8.     /* 2. gpio initialization */
  9.     s_B_Chg_Intf->B_ChgCtrl_PinInit();
  10.     s_B_Chg_Intf->B_ChgIndicator_PinInit();
  11.     s_C_Motor_Intf->C_MotorCtrl_PinInit();
  12.     s_C_Motor_Intf->C_MotorIndicator_PinInit();
  13.     ......省略......

  14. }

结构体中为什么要用const来修饰呢,可以参考这一篇:
const介绍




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