<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      c語言實現this指針效果

      概要

      由于目前在做一個比較復雜的嵌入式項目,想要借此提升一下代碼的結構設計能力,所以想要以面向對象的思想來完成這個項目,即把每個板載外設資源視為一個對象,采用msp+bsp的模式,對每個bsp外設實現對象化處理,現有方案需要手動傳入對象引用,調用方法時比較麻煩,所以考慮簡化調用方式。

      面向對象實現思路

      現有方案

      對象就是具有屬性與方法的集合體,以LED舉例,它的屬性就是端口引腳亮使能標志等,方法就是
      了解到現有的c語言面向對象實現方法都需要手動傳入對象的引用,如下這種方式:

      typedef struct _LED_TYPEDEF{
      	//屬性
      	struct _Privated_Attr{
      		GPIO_InitTypeDef GPIO_Body;
      		GPIO_TypeDef *GPIOx;
      		GPIO_PinState ENbit;
      	} Privated_Attr; 
      	
      	//方法
      	void (*LightUp)(struct _LED_TYPEDEF *);
      	void (*LightOff)(struct _LED_TYPEDEF *);
      }LED_TypeDef;
      

      上面的結構體中有一個嵌入的結構體變量,主要用途就是類似私有變量,類外不可直接訪問的目的,也是出于屬性只由方法操作,這樣可以對屬性值的合理性做出一定限制與約束,然后方法的參數必須加入對象的引用,也就是傳入對象地址。
      此時調用方法為:

      //實例化對象
      LED_TypeDef BSP_LED1;
      LED_TypeDef BSP_LED2;
      
      //對象方法使用
      BSP_LED1.LightUp(&BSP_LED1); //led1亮
      BSP_LED2.LightOff(&BSP_LED2);//led2滅
      

      這種方式比較麻煩,所以有必要引入c++this指針方式。

      this方案

      目的:為了簡寫對象方法的調用模式。
      所謂的this指針可以簡單理解為編譯器幫我們把對象引用傳遞到方法中了。

      單一bsp方案

      此單一bsp意為板子上只有這一個外設,所以這個bsp對象只需要一個this指針,以uart舉例

      typedef struct _UART_OBJ_TYPEDEF{
      	//屬性
      	struct _PrivateAttr{
      		uint16_t Buf_Cnt;
      		UART_HandleTypeDef UARTxHandler;		
      	}PrivateAttr;
      	uint8_t Is_RX_OV;
      	uint8_t Is_RX_OK;
      	uint8_t RX_Buf[UART_RX_MAX_SIZE];
      	
      	//方法
      	void (*SendChar)(struct _UART_OBJ_TYPEDEF *,uint8_t chr);
      	void (*SendStr)(struct _UART_OBJ_TYPEDEF *,uint8_t *str);
      	void (*ClearBuf)(void);
      	void (*ClearFlag)(void);
      	void (*BufAppend)(uint8_t byte);
      	uint16_t (*GetBufLength)(void);
      }UART_Obj_TypeDef;
      

      可以看到方法中不再需要手動傳入對象引用了。

      UART_Obj_TypeDef UART_Debug_Obj; //實例化對象
      static UART_Obj_TypeDef *mthis = &UART_Debug_Obj; //this指針實現對象引用
      

      這樣就利用static文件的作用域實現為每個bsp對象實現一個this指針效果。

      //將數據放入緩沖區
      UART_Debug_Obj.BufAppend(res);
      //清空緩沖區
      UART_Debug_Obj.ClearBuf();
      

      多個同類bsp方案

      對于多個同類bsp方案,有一個最大的缺點,只要涉及到多線程,或是中斷,就是會有線程安全的風險,因為使用的偏移變量是全局變量。

      //bsp對象的this數組偏移量
      #define BSP_LED1_OFFSET 0
      #define BSP_LED2_OFFSET 1
      
      //間接改變this的指向
      #define BSP_LED1	(this_ledx = BSP_LED1_OFFSET);_BSP_LED1
      #define BSP_LED2	(this_ledx = BSP_LED2_OFFSET);_BSP_LED2
      
      struct _LED_TYPEDEF;
      
      typedef struct _LED_TYPEDEF{
      	struct _Privated_Attr{
      		GPIO_InitTypeDef GPIO_Body;
      		GPIO_TypeDef *GPIOx;
      		GPIO_PinState ENbit;
      	} Privated_Attr;
      	void (*LightUp)(void);
      	void (*LightOff)(void);
      }LED_TypeDef;
      

      使用宏定義的方式間接改變this的指向

      //實例化2個同類對象
      LED_TypeDef _BSP_LED1;
      LED_TypeDef _BSP_LED2;
      //this指針與this數組
      static LED_TypeDef* This_Arr[LED_NUM] = {&_BSP_LED1,&_BSP_LED2};
      static LED_TypeDef* mthis;
      //this指向偏移量(因為外面要用,所以名字不要沖突,最好和bsp對象相關)
      uint8_t this_ledx = BSP_LED1_OFFSET;
      
      //方法定義
      void LightUp(){
      	mthis = This_Arr[this_ledx]; //通過this指針偏移來確定使用哪個對象
      	HAL_GPIO_WritePin(mthis->Privated_Attr.GPIOx,\
      	mthis->Privated_Attr.GPIO_Body.Pin,\
      	mthis->Privated_Attr.ENbit);
      }
      
      

      總結

      基于面向對象的思想對于代碼的結構和可讀性上都有一定的利處,特別在裸機編寫過程中,由于不受系統的干預,對于思路與框架的設計都清晰起來,目前還在不斷改善中,這種方式的缺陷也很明顯,只適用在靜態的情況,要想動態實現只有編譯器能操作了,但還是希望這種方式可以很好的在項目中使用。

      posted @ 2023-12-04 09:58  pie_thn  閱讀(982)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 一二三四中文字幕日韩乱码| 国产精品视频一区不卡| 黄色三级亚洲男人的天堂| 欧洲人与动牲交α欧美精品| 国产亚洲无日韩乱码| 亚洲男人第一无码av网站| av天堂亚洲天堂亚洲天堂| 日韩有码中文字幕国产| 国产大学生粉嫩无套流白浆| 欧美亚洲精品中文字幕乱码| 九九热99精品视频在线| 免费人欧美成又黄又爽的视频| 福利一区二区在线视频| 人妻少妇精品无码专区二区| 国产成人一区二区三区免费| 中文字幕乱码视频32| 老熟妇欲乱一区二区三区| 一本av高清一区二区三区| 中文毛片无遮挡高潮免费| 国产午夜免费高清久久影院| 午夜DY888国产精品影院| 昌乐县| 麻豆精品一区二区视频在线| 精品少妇av蜜臀av| 色噜噜亚洲男人的天堂| 1区2区3区4区产品不卡码网站| 久久久噜噜噜久久| 一区二区三区不卡国产| 国产中文字幕在线一区| 午夜精品久久久久久久久| 91福利视频一区二区| 久久综合精品成人一本| 一个色的导航| 国产mv在线天堂mv免费观看| 一区二区三区久久精品国产| 日本中文字幕在线播放| 亚洲男人的天堂久久香蕉| 九九热在线视频精品免费| 国内在线视频一区二区三区| 国产精品白浆无码流出| 亚洲区一区二区三区亚洲|