状态机在嵌入式系统中的应用
Clear_Uart1TxbStBuf(void){ Uart1Tx.bStBuf = Uart1_TxBuf_Empty;//设置串口1发送缓冲区为空 …… } 3.1.3 串口1数据发送状态机 串口1发送缓冲区的成员bStBuf有3种状态。 ① Uart1_TxBuf_Rdy: 串口1发送缓冲区数据准备好。 ② Uart1_TxBuf_Wait: 串口1发送缓冲区数据等待。 ③ Uart1_TxBuf_Empty: 串口1发送缓冲区空。 3种状态的转移情况如图3所示。 图3 串口1的发送缓冲区状态机 当串口1发送缓冲区在Uart1_TxBuf_Rdy状态下时,软件可以向串口的发送缓冲区中写入数据。写入数据后,串口1发送缓冲区的状态将转移到Uart1_TxBuf_Rdy。 在将需要发送的数据拷贝到串口1发送缓冲区后,开启串口1的发送中断,软件将进入串口1的发送中断服务程序。这个中断服务程序将检测串口1发送缓冲区的状态。如果状态为Uart1_TxBuf_Rdy,则说明串口1发送缓冲区中有数据需要发送,这时串口1缓冲区的数据通过串口1的发送中断把所有的数据发送给GSM Modem。当数据发送完毕后,串口1发送缓冲区的状态将转移到Uart1_TxBuf_Wait状态,否则,将维持当前的状态。 当串口1发送缓冲区的状态在Uart1_TxBuf_Wait状态时,它可以有两条路径让串口1发送缓冲区的状态转移到Uart1_TxBuf_Empty: 其一是串口1软件定时器超时。 其二是相应的条件成立。如发送端消息,当软件从串口1的接收缓冲区中解析出“+CMGSn(1≤n≤255)”信息或者发送失败的信息时,串口1发送缓冲区的状态将转移到Uart1_TxBuf_Empty状态,同时停止串口1软件定时器;读短消息收到“+CMGR……”信息。3.2 短信数据的发送 如图2所示,需要通过串口1发送的数据包括: 读取/删除短信数据、下行功率查询数据、信源信息查询数据、未读短信查询数据、短消息发送缓冲区数据、告警上报发送缓冲区数据。其中,读取/删除短信数据、下行功率查询数据、信源信息查询数据和未读短信查询数据, 直接由GSM Modem处理,并作出处理结果应答。因此,这类数据直接通过串口1发送缓冲区发送。 而短信数据(短消息发送缓冲区数据、告警上报发送缓冲区数据)发送需要两步操作: 先发送短信的目的电话号码,再发送短信消息内容。发送是否完成,与GSM Modem和GSM网络有关。因此,这类数据的发送,先将发送操作的所有数据存储到短信数据缓冲区中,然后由软件通过短信数据缓冲区的状态,将数据通过串口1发送缓冲区发送给GSM Modem。 3.2.1 短信数据结构 短信数据包括短消息发送缓冲区数据和告警上报发送缓冲区数据。根据短信发送操作的两个步骤,短信数据缓冲区的数据结构定义如下: typedef struct{ unsigned char bStBuf;//bStBuf = SmsTx_Emty或者= SmsTx_CmdRdy或者 = SmsTx_Dly1或者= SmsTx_DatRdy或者= SmsTx_Dly2或者= SmsTx _Wait unsigned char cmd_len; char cmd_buf[32]; unsigned short dat_len; char dat_buf[SMS_LEN+1]; unsigned char retry_time;//重传次数 }SmsTx_t; ① bStBuf成员: 用于描述短信数据缓冲区的状态。 ② cmd_len成员: 用于描述cmd_buf中数据的长度。 ③ cmd_buf成员: 用于存储短消息发送中的控制命令,如AT+CMGS=13583823789。 ④ dat_len成员: 用于描述存储短消息发送中的信息体长度。 ⑤ dat_buf成员: 用于存储短消息发送中的信息体。 ⑥ retry_time成员: 用于描述短消息在发送失败时,重传的次数。 3.2.2 短信数据发送状态机 短信数据缓冲区的状态有6种: ① SmsTx_Empty: 短信数据缓冲区空。 ② SmsTx_CmdRdy: 短信数据缓冲区控制命令准备好。 ③ SmsTx_Dly1: 短信数据缓冲区延时1。 ④ SmsTx_DatRdy: 短信数据缓冲区消息体准备好。 ⑤ SmsTx_Dly2: 短信数据缓冲区延时2。 ⑥ SmsTx_Wait: 短信数据缓冲区等待。 其状态的转移情况如图4所示。 图4 短信数据发送状态机 状态机的转移过程通过短消息发送缓冲区数据的发送来说明,其告警上报发送缓冲区的数据发送与此相同。 结语 在整个移动2G光纤直放站近端机的监控软件中,除了短消息收发处理,还包括实时采样、实时告警上报等任务。其所有的软件设计都采用类似于短信收发处理的状态机、队列和软件定时器的设计思路,极大地提高移动2G光纤直放站近端机监控软件的效率。这种在前后台系统中使用状态机、队列和软件定时器的设计思路,可以应用到其他的嵌入式前后台系统中,是一种值得学习、借鉴的嵌入式软件设计思路。
- 数字信号处理(DSP)应用系统中的低功耗设计(05-02)
- SHARC引领第四代通用DSP高端应用潮流(09-27)
- 在应用可编程测控网络设计(03-15)
- 基于dsPIC33F系列单片机的应用程序升级方法(04-03)
- 采用混合时钟模式提高Linux时钟精度的方法(05-10)
- MSP430低功耗原理及其在海温测量中的应用(06-06)