当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]状态机在嵌入式系统中的应用

在嵌入式前后台系统中,外部的异步事件通过中断来捕获并运行在后台,而其他的任务则运行于前台。提高系统中的任务处理能力,是嵌入式前后台系统设计的重点。本文描述了利用状态机来提高嵌入式前后台系统任务处理能力的实现方法。为了便于研究和描述状态机在嵌入式前后台软件系统中的应用,本文将以移动2G光纤直放站近端机的监控软件案例来阐述和说明。

  1 移动2G光纤直放站近端机监控单元

  对于移动2G光纤直放站近端机监控单元,只介绍与本文有关部分的原理框图,如图1所示。图中GSM

  Modem通过AT91SAM7S256的串口1相连。由于GSM

  Modem的特性和短消息的收发,其通信收发处理相对比较繁琐和复杂。例如,发送短消息时,需要向Modem发送“AT+CMGS=电话号码”并等待一定的时间,再发送短消息内容,等待发送成功。短消息发送成功后,GSM

  Modem将回应“+CMGS序号”的信息。其发送需要等待的时间长短不定。

  

 

  图1 直放站近端机监控单元

  在移动2G光纤直放站近端机中,通过串口1发送到GSM

  Modem的数据不仅仅是短消息,还包括下行功率查询、信源信息查询、读取/删除短消息等。因此,针对移动2G光纤直放站近端机监控单元的要求和软件系统为前后台系统的特点,移动2G光纤直放站近端机监控单元的监控软件设计采用了状态机和队列的方式。

  2 软件的设计思路

  根据前后台软件系统的特点,结合移动2G光纤直放站近端机的硬件结构,以移动2G光纤直放站近端机的监控软件中的短消息收发子系统为例,来阐述软件的设计思路。GSM

  Modem的短消息接收采用软件主动读取的方式,即软件以中断方式接收到短消息在Modem中存储的序号,然后软件主动读取短消息和删除已读取的短消息。短消息的收发处理流程如图2所示。

  2.1 短消息的接收

  如图2所示,GSM

  Modem主动上报的信息将存储到串口1接收缓冲区中,软件从串口1接收缓冲区的数据中解析出短信序号(Modem收到的短消息在Modem中的存储序号)存储到短信序号队列(短信序号缓冲区1~n)中,然后软件通过短信序号队列的状态来决定是否需要向Modem发送读取短信或者删除短信命令。

  当软件发送读短消息命令后,GSM

  Modem将对应序号的短信息送出,数据将存储到串口1接收缓冲区中,软件再从串口1接收缓冲区的数据中解析出短消存储到短信队列(短信缓冲区1~m)中。这样需要软件处理的短消息就存储到了短信队列中,而处理的事情则交由软件的其他区处理。

  

 

  图2 直放站短信收发处理流程[!--empirenews.page--]2.2 短消息的发送

 

  对所有需要发送到GSM

  Modem的数据,则通过UART1发送缓冲区来完成。具体发送哪些数据(读取/删除短信、下行功率查询、信源信息查询、未读短信查询)或者缓冲区的数据(短消息发送缓冲区、告警上报发送缓冲区)由软件根据相应的状态来选择确定。

  3 设计思路的实现

  3.1 串口1数据的发送

  3.1.1 串口1发送缓冲区的数据结构

  串口1是否有数据需要发送,由串口1的发送缓冲区的状态来决定。串口1发送缓冲区的数据结构定义如下:

  typedef struct{

  unsigned char bStBuf;//bStBuf =

  Uart1_TxBuf_Rdy或者=Uart1_TxBuf_Wait或者=Uart1_TxBuf_Empty

  unsigned short Index;

  unsigned short Len;

  char Buf[270];

  }Uart1Buf_t;

  ① bStBuf成员: 串口1发送缓冲区的状态。

  ② Index成员: 串口1发送数据缓冲区索引。

  ③ Len成员: 串口1发送数据缓冲区中有效数据的长度。

  ④ Buf成员: 串口1发送数据缓冲区。

  3.1.2 串口1发送缓冲区软件定时器

  由于GSM Modem的特性致使串口1不能不间断地发送数据,因此,对串口1的数据发送设定一个软件定时器。软件定时器用于控制GSM

  Modem是否可以接收来自串口1的新数据。软件定时器的结构定义如下:

  typedef struct{

  unsigned char bTimerSt;//软件定时器的状态: Timer_START或Timer_STOP

  unsigned int TimerCtn;//软件定时器的计数器

  void (*func)(void);//超时后相应的处理功能函数指针

  }SoftTimer_t;

  ① bTimerSt成员: 用于描述软件定时器的状态。它有2种状态:

  ◆ Timer_START——开始软件定时器;

  ◆ Timer_STOP——停止软件定时器。

  ② TimerCtn成员: 用于描述软件定时器的定时时间。它是一个32位的计数器,硬件定时的基准时间为20

  ms(建议设置在前后台系统主程序循环1次需要的时间),因此最大定时时间为20 ms×232=85 899 345.92 s。

  ③ func成员:

  用于描述软件定时器超时需要去处理相应事情的函数。该函数是在定时器中断服务程序下运行的,因此为了减少中断服务程序占用CPU的时间,函数只作简单的状态设置或者清除工作,如函数Clear_Uart1TxbStBuf。

  void 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……”信息。[!--empirenews.page--]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光纤直放站近端机监控软件的效率。这种在前后台系统中使用状态机、队列和软件定时器的设计思路,可以应用到其他的嵌入式前后台系统中,是一种值得学习、借鉴的嵌入式软件设计思路。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭