單片機中應用觀察者模式,單片機觀察者模式

來源:互聯網
上載者:User

單片機中應用觀察者模式,單片機觀察者模式

單片機中應用觀察者模式


本文部落格連結:http://blog.csdn.net/jdh99,作者:jdh,轉載請註明.


環境:

主機:WIN8

開發環境:MDK5.13

mcu: stm32f103RB


說明:

之前在java中應用觀察者模式,現將此模式的思想應用在單片機程式設計中

Android編程:觀察者模式設計:

http://blog.csdn.net/jdh99/article/details/41821295


觀察者模式本質:

有兩個模組A,B。A是目標,B是觀察者。則B能觀察到A的變化。

在程式實現中過程是:

1.A產生資料

2.A通知B

3.B處理資料


單片機中實現的方法:

Java中通過介面實現此思想,單片機是C語言編程,則可以通過函數指標來實現。

原始碼中dw1000通訊模組提供了兩個被觀察的目標:接收資料,發送資料完成。


原始碼:

dw1000.h

/********************************************************************** dw1000通訊模組標頭檔*(c)copyright 2015,jdh*  All Right Reserved*建立時間:2015/1/5 by jdh*修改時間:2015/1/6 by jdh**********************************************************************/#ifndef _DW1000_H_#define _DW1000_H_/**********************************************************************標頭檔**********************************************************************/#include "world.h"/**********************************************************************宏定義**********************************************************************//**********************************************************************接收資料緩衝最大長度**********************************************************************/#define LEN_DW1000_BUF_RX128/**********************************************************************資料結構**********************************************************************//**********************************************************************dw1000時間結構**********************************************************************/union _Dw1000_Time{uint8_t pt[8];uint64_t value;};/**********************************************************************接收資料結構**********************************************************************/struct _Dw1000_Rx{//接收資料uint8_t buf[LEN_DW1000_BUF_RX];//接收資料的dw1000時間union _Dw1000_Time time;};/**********************************************************************觀察者模式:接收資料處理函數指標**********************************************************************/typedef void (*T_Dw1000_Deal_Rx)(struct _Dw1000_Rx);/**********************************************************************觀察者模式:發送資料完成處理函數指標**********************************************************************/typedef void (*T_Dw1000_Deal_Tx_End)(union _Dw1000_Time);/**********************************************************************接收緩衝**********************************************************************/struct _Rx_Buf_CC1100{//接收時間T_Time time;//源IDuint16_t src_id;//功能碼uint8_t cmd;//資料uint8_t data[3];//rssiint rssi;//lqiuint8_t lqi;};/**********************************************************************函數**********************************************************************//**********************************************************************介面函數:模組載入**********************************************************************/void dw1000_load(void);/**********************************************************************介面函數:模組運行**********************************************************************/void dw1000_run(void);/**********************************************************************介面函數:中斷處理函數**********************************************************************/void dw1000_irq_handler(void);/**********************************************************************介面函數:判斷是否可以發送*返回:0:不可以發送,1:可以發送**********************************************************************/uint8_t cc1100_judge_tx(void);/**********************************************************************介面函數:發送資料*參數:cmd:功能碼*     id:目標id*     data:3位元組資料**********************************************************************/void cc1100_tx(uint8_t cmd,uint16_t id,uint8_t *data);/**********************************************************************介面函數:得到接收資料*返回:接收資料**********************************************************************/struct _Rx_Buf_CC1100 cc1100_get_rx_buf(void);/**********************************************************************介面函數:設定頻點*參數:freq:需要設定的頻點**********************************************************************/void cc1100_set_freq(uint8_t freq);/**********************************************************************介面函數:註冊觀察者:接收資料**********************************************************************/void dw1000_register_observer_rx(T_Dw1000_Deal_Rx function);/**********************************************************************介面函數:註冊觀察者:發送完成**********************************************************************/void dw1000_register_observer_tx_end(T_Dw1000_Deal_Tx_End function);#endif

dw1000.c

/********************************************************************** dw1000通訊模組主檔案*(c)copyright 2015,jdh*  All Right Reserved*建立時間:2015/1/5 by jdh*修改時間:2015/1/6 by jdh**********************************************************************//**********************************************************************標頭檔**********************************************************************/#include "dw1000.h"/**********************************************************************宏定義**********************************************************************//**********************************************************************觀察者最大個數**********************************************************************/#define MAX_OBSERVER10/**********************************************************************靜態變數**********************************************************************//**********************************************************************接收資料觀察者列表**********************************************************************/static T_Dw1000_Deal_Rx Observer_Rx[MAX_OBSERVER];static uint8_t Len_Observer_Rx = 0;/**********************************************************************發送完成觀察者列表**********************************************************************/static T_Dw1000_Deal_Tx_End Observer_Tx_End[MAX_OBSERVER];static uint8_t Len_Observer_Tx_End = 0;/**********************************************************************靜態函數**********************************************************************//**********************************************************************接收處理**********************************************************************/static void deal_rx(void);/**********************************************************************發送結束處理**********************************************************************/static void deal_tx_end(void);/**********************************************************************函數**********************************************************************//**********************************************************************介面函數:模組載入**********************************************************************/void dw1000_load(void){    }/**********************************************************************介面函數:模組運行**********************************************************************/void dw1000_run(void){}/**********************************************************************介面函數:註冊觀察者:接收資料**********************************************************************/void dw1000_register_observer_rx(T_Dw1000_Deal_Rx function){Observer_Rx[Len_Observer_Rx++] = function;}/**********************************************************************介面函數:註冊觀察者:發送完成**********************************************************************/void dw1000_register_observer_tx_end(T_Dw1000_Deal_Tx_End function){Observer_Tx_End[Len_Observer_Tx_End++] = function;}/**********************************************************************介面函數:中斷處理函數**********************************************************************/void dw1000_irq_handler(void){uint32_t status = 0;uint32_t clear = 0; // will clear any events seenuint8_t resetrx;status = dwt_read32bitreg(SYS_STATUS_ID) ;            // read status register low 32bitif(status & SYS_STATUS_LDEDONE){if((status & (SYS_STATUS_LDEDONE | SYS_STATUS_RXPHD | SYS_STATUS_RXSFDD)) != (SYS_STATUS_LDEDONE | SYS_STATUS_RXPHD | SYS_STATUS_RXSFDD)){resetrx = 0xe0;//got LDE done but other flags SFD and PHR are clear - this is a bad frame - reset the transceiverdwt_forcetrxoff(); //this will clear all events//set rx resetdwt_writetodevice(PMSC_ID, 0x3, 1, &resetrx);resetrx = 0xf0; //clear RX resetdwt_writetodevice(PMSC_ID, 0x3, 1, &resetrx);//dwt_write16bitoffsetreg(SYS_CTRL_ID,0,(uint16)SYS_CTRL_RXENAB) ;}}if((status & SYS_STATUS_RXFCG) && (status & SYS_STATUS_LDEDONE))  // Receiver FCS Good    {//clear all receive status bits (as we are finished with this receive event)clear |= status & CLEAR_ALLRXGOOD_EVENTS  ;    dwt_write32bitreg(SYS_STATUS_ID,clear) ;         // write status register to clear event bits we have seen//接收處理deal_rx();    }else{if (status & SYS_STATUS_TXFRS)  // Transmit Frame Sent{clear |= CLEAR_ALLTX_EVENTS; //clear TX event bitsdwt_write32bitreg(SYS_STATUS_ID,clear) ;         // write status register to clear event bits we have seen//發送結束處理deal_tx_end();}else{if (status & SYS_STATUS_RXRFTO) {//接收逾時clear |= status & SYS_STATUS_RXRFTO ;dwt_write32bitreg(SYS_STATUS_ID,clear) ;         // write status register to clear event bits we have seendwt_setrxtimeout(0);dwt_rxenable(0) ;}else{//異常 清除所有標識 clear |= CLEAR_ALLRXERROR_EVENTS;dwt_write32bitreg(SYS_STATUS_ID,clear) ;         // write status register to clear event bits we have seendwt_forcetrxoff(); //this will clear all events//set rx resetdwt_writetodevice(PMSC_ID, 0x3, 1, &resetrx);        resetrx = 0xf0; //clear RX reset        dwt_writetodevice(PMSC_ID, 0x3, 1, &resetrx);dwt_rxenable(0) ; }}}}/**********************************************************************接收處理**********************************************************************/static void deal_rx(void){struct _Dw1000_Rx rx;uint16_t len;uint8_t i = 0;len = dwt_read16bitoffsetreg(RX_FINFO_ID, 0) & 0x3FF;if (len >= 127) {return;}dwt_write32bitreg(SYS_STATUS_ID,CLEAR_ALLRXGOOD_EVENTS) ; //得到接收時間dwt_readrxtimestamp(rx.time.pt);rx.time.value &= MASK_40BIT;//得到接收資料dwt_readfromdevice(RX_BUFFER_ID,0,len,rx.buf) ;//通知觀察者for (i = 0;i < Len_Observer_Rx;i++){Observer_Rx[i](rx);}//uint8   resetrx;//////resetrx = 0xe0;   //got LDE done but other flags SFD and PHR are clear - this is a bad frame - reset the transceiver////dwt_forcetrxoff(); //this will clear all events////dwt_writetodevice(PMSC_ID, 0x3, 1, &resetrx);//set rx reset////resetrx = 0xf0;  //clear RX reset////dwt_writetodevice(PMSC_ID, 0x3, 1, &resetrx);dwt_write16bitoffsetreg(SYS_CTRL_ID,0,(uint16)SYS_CTRL_RXENAB) ;}/**********************************************************************發送結束處理**********************************************************************/static void deal_tx_end(void){union _Dw1000_Time time;uint8_t i = 0;//獲得發送時間dwt_readtxtimestamp(time.pt) ;time.value &= MASK_40BIT;//通知觀察者for (i = 0;i < Len_Observer_Tx_End;i++){Observer_Tx_End[i](time);}}

main.c中觀察dw1000模組的接收資料:

//增加接收資料觀察者dw1000_register_observer_rx(deal_rx);


處理函數:

void deal_rx(struct _Dw1000_Rx rx) { //處理... __nop(); __nop(); __nop(); }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.