(一)裸机开发框架构建之---开发框架思想

裸机开发框架构建

        • 声明:本专栏通过查阅资料以及自己对开发框架的理解所编写,如有错误,还请指正
      • 为什么要使用框架???
      • 我的框架分层
      • 思想体现

声明:本专栏通过查阅资料以及自己对开发框架的理解所编写,如有错误,还请指正

为什么要使用框架???

在裸机的开发中常常用到的就是两个层面 驱动层以及应用层,会涉及到在应用层中直接对硬件的操作,这也导致了应用层对硬件的依赖关系增大,若是项目需要移植在不同的开发板上,就只需要改写硬件相关的驱动程序就可以了,围绕这一模式设计,就是框架的构建,框架的设计有很多种,根据自己的需求来构建适用于自己项目的框架,来提高可扩展性和移植性

我的框架分层

(一)裸机开发框架构建之---开发框架思想_第1张图片

思想体现

#include 
#include 

int main()
{
     

    /* 第一层 硬件操作层 */

    /*描述:这一层是板子上直接的硬件操作层,对于不同的板子以及不同的库操作是不一样的,涉及到最底层的硬件操作\
           举例:对于板子来说可以使用最原始 寄存器开发,或者标准库,又或者是STM32HAL库,对其他开发板的支持,拿个最简单的LED举例子,
           在这一层可以做的是:*/

          // STM32寄存器开发:

           void Register_LEDinit(void)
           {
     
             /*对寄存器操作 初始化LED*/
           }
          
          // STM32标准库开发
           void Standard_LEDinit(void)
           {
     
             /*对标准库的操作 初始化LED*/
           }

          // STM32HAL库开发
          void HAL_LEDinit(void)
           {
     
             /*对HAL库的操作 初始化LED*/
           }


          void TI_LEDinit(void)
           {
     
             /*对TI开发板的操作 初始化LED*/
           }

    



    /* 第二层 硬件函数接口层*/

    /*描述:对板子上的硬件操作函数进行封装,想一想为什么要这样封装???\
    就是为了让应用层不涉及对硬件的直接操作,如下:在这里提供了一个标准接口\
    通过这个接口,我们拿这个接口函数去做应用,是不是就不会涉及到硬件的直接操作了\
    其实只要多加这一层就可以做应用层和硬件操作层的分离了,*/
    
    
    
     void Interface_LED(void)
     {
     
       // Register_LEDinit();/*寄存器*/
         Standard_LEDinit();/*标准库*/
       // HAL_LEDinit();/*HAL库*/
       //TI_LEDinit();/*TI开发某库/寄存器*/

     }



    /* 第三层 设备管理层*/

    /*前面说道:其实只要多加一层(硬件函数接口层)就可以实现应用层和硬件操作层的分离了\
    那这一层是干嘛的呢???这样做是为了设备更好的管理,拿LED来说这里可以描述设备的信息
    以及设备的初始化函数,开关状态函数,亮度,颜色等等,这里一般是用一个结构体来进行管理
    如下:*/
    typedef struct LED_Device{
     
        char * name; /*设备名字*/
        int switchState; /*开关状态*/
        void(*Init)(void);/*初始化函数*/
        void(*color)(void);/*颜色*/
        void(*brightness)(void);/*亮度*/
   }LED_Device;
 /*尽管这并不很完善,但是能够表达出这种意思*/

 /*描述到这儿可能有一些接受不了了,结构体就算了,结构体里面居然还有函数指针\
 到这儿直接放弃,不急慢慢来,这里先大概看一下是怎样的操作的\
 一般涉及到结构体初始化(也就是说给结构体的成员赋值)对于一个设备可以使用结构体变量\
对于有很多相同的设备呢??使用结构体数组*/

/*这里的就直接使用c99/c11的标准来赋值,赋值之前先构建三个LED有关函数*/
/*1.第一步为了方便直接将结构体中的函数指针拷贝出来改写*/
  void(*Init)(void);/*初始化函数*/
  void(*color)(void);/*颜色*/
  void(*brightness)(void);/*亮度*/
/*2.第二步构建函数*/
 void  LEDInit(void)/*初始化函数*/
  {
     
     /*这里就可以填入第二层硬件接口层的LED初始化函数了*/
     Interface_LED();
  }
void LEDColor(void)/*颜色*/
  {
     
    /*这里就可以填入第二层硬件接口层的LED初始化函数了*/
    /*这里的第二层硬件接口层没有构建,仅仅这个思想*/
  }
void LEDBrightness(void)/*亮度*/
{
     
   /*这里就可以填入第二层硬件接口层的LED初始化函数了*/
    /*这里的第二层硬件接口层没有构建,仅仅这个思想*/

}

/*结构体的初始化操作步骤*/

/*1.使用结构体变量*/
LED_Device SLED_Device={
     
.name="LED",
.Init=LEDInit,  /*注:函数是这样的,没有取址符*/
.color=LEDColor,
.brightness=LEDBrightness,
}


/*2.使用结构体数组 这种适用于多个相同设备*/
LED_Device ALED_Device[3]={
        /*这里构建了三个数组*/
 {
     },  /*设备一信息*/
 {
     },  /*设备二信息*/                      /*这是基本语法*/
 {
     },  /*设备三信息*/
};   

/*来补充完善这个结构体数组*/
LED_Device ALED_Device[3]={
        /*这里构建了三个数组*/
 {
     .name="LED1",
  .Init=LED1Init,  
  .color=LED1Color,
  .brightness=LED1Brightness,},  /*设备一信息*/

 {
     .name="LED2",
  .Init=LED2Init,  
  .color=LED1Color,
  .brightness=LED1Brightness,},  /*设备二信息*/                     

 {
     .name="LED3",
  .Init=LED3Init,  
  .color=LED3Color,
  .brightness=LED3Brightness,},  /*设备三信息*/
}; 

/*这三个函数指针指向的函数我就不构建了,像单个设备一样*/
/*到这里差不多久前三层就构建完成了*/




/* 第四层 应用层*/
/*描述:现在前三层已构建完成,直接对结构体的成员进行操作即可*/
/*以注册的三个LED设备为例*/

LED_Device ALED_Device[3]={
        /*这里构建了三个数组*/
 {
     .name="LED1",
  .Init=LED1Init,  
  .color=LED1Color,
  .brightness=LED1Brightness,},  /*设备一信息*/

 {
     .name="LED2",
  .Init=LED2Init,  
  .color=LED1Color,
  .brightness=LED1Brightness,},  /*设备二信息*/                     

 {
     .name="LED3",
  .Init=LED3Init,  
  .color=LED3Color,
  .brightness=LED3Brightness,},  /*设备三信息*/
}; 
/*这里直接对照着结构体操作成员即可*/  

/******应用********/

/*LED1设备*/
   printf( "%s\t",ALED_Device[0].name); /*打印设备信息*/
    PLED_Device[0].Init();/*LED1设备初始化*/
    PLED_Device[0].color();/*LED1颜色设置*/
    PLED_Device[0].brightness()/*LED1亮度设置*/
   
/*LED2设备*/
   printf( "%s\t",ALED_Device[1].name); /*打印设备信息*/
    PLED_Device[1].Init();/*LED1设备初始化*/
    PLED_Device[1].color();/*LED1颜色设置*/
    PLED_Device[1].brightness()/*LED1亮度设置*/

/*LED3设备*/
   printf( "%s\t",ALED_Device[2].name); /*打印设备信息*/
    PLED_Device[2].Init();/*LED1设备初始化*/
    PLED_Device[2].color();/*LED1颜色设置*/
    PLED_Device[2].brightness()/*LED1亮度设置*/


/*到这里有没有什么疑惑??做应用我要怎么去设置亮度,怎么去设置颜色???\
  这就是不完善的地方,在下一篇进行改进,目前至少了解到这几种分层。
*/

你可能感兴趣的:(裸机开发框架,stm32)