您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 1_第3章单片机软件工程基础
09ho5主编第3章单片机软件工程基础3.1前后台程序结构3.2状态机建模3.3事件触发程序结构3.1前后台程序结构3.1.1任务3.1.2实时性3.1.3前后台程序的编写原则3.1.4函数重入3.1.5临界代码3.1.6前后台程序结构的特点3.1.1任务(1)单任务程序如果整个处理器系统只实现一个单一功能,或者只处理一种事件,称为“单任务”程序。(2)轮询式多任务程序在实际应用中,大多数的单片机系统至少包括信息获取、显示、人机交互、数据通信等功能,且要求这些功能同时进行,属于多任务程序。(3)前后台多任务程序在大部分实际情况中,程序主循环一次的时间都较长(数毫秒至数秒)。(1)单任务程序(2)轮询式多任务程序(3)前后台多任务程序图3.1.1一个前后台程序结构的例子3.1.2实时性(1)实时性最高的事件(2)实时性较高的事件(3)实时性较低的事件(1)实时性最高的事件它指对于要求零延迟、立即响应或立即动作的事件。例如高速波形的产生、波形采集触发、微秒级脉宽测量等场合,要求响应速度在数十至数百纳秒级,甚至小于单片机的一个指令执行周期。(2)实时性较高的事件对于允许数微秒至数十微秒延迟的事件,可以利用中断响应(前台)来处理。但要注意主循环(后台)中不能长时间关闭中断,否则仍会造成实时性下降。(3)实时性较低的事件1)对于允许数毫秒至数秒延迟的事件,可以在主程序中查询处理。2)如果某事件虽然要求实时性较低,但本身出现的时间很短,小于一个循环周期,仍有可能会被漏掉。3)如果上述情况无法产生中断或标志位,可以使用定时中断查询事件,然后置标志位。4)如果在一个循环周期内,某事件会连续突发出现多次,对事件捕获要求实时性高,但对事件处理的实时性要求不高,可以利用中断获取事件信息,并用FIFO将事件信息存储起来,在主循环内将这些信息依次取出逐个处理。3.1.3前后台程序的编写原则(1)消除阻塞(2)节拍(3)尽量使用低CPU占用率的外设(4)使用缓冲区(5)时序程序设计(1)消除阻塞在前文中已经大量出现过“阻塞”这个词语,含义是长时间占用CPU资源。从前后台程序的结构中可以看出,它之所以可以实现多任务同时执行,本质是快速地依次循环执行各个任务。(2)节拍在前后台程序中,如果主循环的周期是固定的,对于定时、延时等与时间相关的任务来说,可以利用主循环内的计数来实现计时,仅在时间到达的时刻做相应处理,消除因等待而产生的阻塞。(3)尽量使用低CPU占用率的外设•对于软件系统来说,为了让更多的任务能够同时进行,硬件上就应选择CPU占用率更低的方案。例如同样完成显示功能,用动态扫描LED所耗费的CPU资源就比静态显示要多。图3.1.2采用数组作为扫描显示的缓冲区(4)使用缓冲区图3.1.3动态扫描的典型硬件电路(4)使用缓冲区图3.1.4一个经典的键盘程序(4)使用缓冲区图3.1.5采用定时中断读取键盘(4)使用缓冲区图3.1.6采用FIFO作为键盘缓冲区(4)使用缓冲区(5)时序程序设计时序的产生中间包含大量的延迟。例如先高电平0.1s再低电平0.2s…。如果用软件延迟来实现电平变化之间的延迟,必然会阻塞CPU。图3.1.7步进电动机驱动的硬件电路与时序(5)时序程序设计3.1.4函数重入图3.1.8非重入代码因中断造成的错误3.1.4函数重入(1)决定函数可重入性的因素(2)避免函数重入性隐患的方法(1)决定函数可重入性的因素首先,若某函数对静态数据进行了赋值操作和访问,则它是不可重入的。其次,涉及硬件设备操作的函数大部分都是不可重入的。第三,函数重入性与C语言编译器有关。(2)避免函数重入性隐患的方法1)应尽量使用可重入函数。2)在进入不可重入函数之前关闭中断,退出该函数之后再开中断。3)采用双缓冲区结构。4)采用信号量。3.1.5临界代码(1)依靠软件产生时间严格时序的程序段(2)共享资源互斥性造成的临界代码(3)避免函数重入造成的临界代码(4)CPU字长造成的临界代码(5)临界代码保护的方法(1)依靠软件产生时间严格时序的程序段某些产生很短延迟的程序,可以直接用软件延迟完成。因为占用CPU很短,不会造成严重的阻塞。但此时一定要注意如果延迟过程被中断,产生的延迟将不准确。例3.1.91-Wire总线时序规定:向1-Wire总线器件写一个字时,一字节由8bit构成,低位在先。每个比特发送时序如下:先拉低,保持1~15μs;再根据该比特是1或者0输出高或低电平,保持60~120μs,再拉高至少1μs(见图3.1.9)。为其编写代码,找出并保护临界代码区。图3.1.91-Wire总线写1bit的时序(2)共享资源互斥性造成的临界代码涉及共享资源的访问操作,都属于临界代码。共享资源访问时需要被独占,避免数据破坏。程序中任何可被占用的实体都称为“资源”。(3)避免函数重入造成的临界代码在“函数重入”一节中,避免函数重入的方法之一是在不可重入函数开始之前关闭中断,之后开中断。对于后台任务和中断都要调用的不可重入函数来说,整个函数都是临界代码区。(4)CPU字长造成的临界代码MSP430单片机具有16位CPU内核。这说明它具有16位字长的处理能力,每条指令都可以处理16比特数据。(5)临界代码保护的方法第一种方法,也是最简单的方法,就是在上面各例中采用的用DINT()语句关闭中断,临界代码结束后用EINT()函数开启中断。第二种方法,也是在嵌入式软件中最通用的方法。第三种方法是关中断前将总中断允许控制位状态保存到一个变量里,然后再关中断保护临界代码,之后根据保存的控制字决定是否恢复中断。第四种方法是用软件模拟堆栈的行为,将进入临界代码的次数和退出临界代码的次数进行统计,如果各临界代码之间有调用关系,则只对最外层的临界代码区进行中断开关操作。3.1.6前后台程序结构的特点这种串行的顺序执行带了了许多优点:首先,在后台循环中,一个任务执行完毕后才执行下一任务。其次,在后台任务顺序执行的结构中,不会出现多个后台任务同时访问共享资源的情况。第三,前后台程序的结构灵活,实现形式与实现手段多样,可以根据实际需要灵活地调整。•但这种灵活性也为前后台程序带来了众多的缺点:•首先,程序多任务的执行依靠每个任务的非阻塞性来保证,这要求编程者耗费大量的时间精力来消除阻塞,而且最终的代码的样子,可能与对任务的描述差异很大•其次,程序的健壮性及安全性没有保障。•第三,每个程序员的思路、实现方法、软件架构等各不相同,而前后台程序中软件实现方法是开放式的,并无统一的标准和方法。•第四,实际上,前后台系统的整体实时性比预计的要差。•第五,缺乏软件的描述手段。3.1.6前后台程序结构的特点3.2状态机建模3.2.1初识“状态机”3.2.2状态机模型的描述方法3.2.3通过状态转移图生成代码3.2.4状态机建模应用实例3.2.1初识“状态机”(1)流程图的缺点(2)状态机建模的例子(1)流程图的缺点图3.2.1在洗衣过程中插入对上盖的处理(1)流程图的缺点图3.2.2电子表按键操作的流程图(1)流程图的缺点双色报警器。这是一种工业现场大量使用的简单报警指示装置,由一个报警输入(I/O口)、双色报警灯(红黄两色,I/O口控制)、以及一个确认按钮构成。三者之间的逻辑关系是:1)当报警出现后,红灯亮。2)报警自动消失后,黄灯亮,直到确认键按下后才灭。3)当报警未消失时,按下确认键,黄灯亮,此后报警消失时报警灯自动灭。图3.2.3双色报警器的流程图(1)流程图的缺点(2)状态机建模的例子图3.2.4双色报警器(2)状态机建模的例子1)在“正常状态”,如果出现“报警”事件,则系统变成“报警未确认”状态,同时亮红灯。2)在“报警未确认状态”,如果出现“报警撤销”事件,则系统变成“报警自行撤销”状态,同时亮黄灯。3)在“报警自行撤销”状态如果发生“确认”事件,则系统变成“正常”状态,报警灯灭。4)在“报警未确认”状态,如果发生“确认”事件,则系统变成“报警确认”状态,黄灯亮。5)在“报警确认”状态,如果发生“报警撤销”事件,则系统回到“正常状态”,报警灯灭。图3.2.5报警状态转移图3.2.2状态机模型的描述方法(1)状态转移图(2)状态转移表(转移矩阵)(1)状态转移图状态转移图又称状态跳转图,它用圆圈或圆角的矩形表示系统的各种状态,用一个带箭头的黑点表示初始状态;用有向箭头表示状态的状态转移(跳转)。例3.2.1以洗衣机控制逻辑为例,要求洗衣过程“先正转2s,再暂停1s,然后反转2s,再暂停1s,依次循环”。画出状态转移图。图3.2.6洗衣机控制程序的状态转移图例3.2.2某电子表具有两个按键A和B用于操作与设置,按键功能和操作方法如下。为该电子表的按键操作程序画出状态转移图,并写出代码。图3.2.7电子表程序的状态转移图•状态转移的规则不仅可以用图形来表示,还能以二维文本列表或矩阵方法来表示。(2)状态转移表(转移矩阵)(2)状态转移表(转移矩阵)3.2.3通过状态转移图生成代码(1)在状态中判断事件(事件查询)(2)在事件中判断状态(事件触发)图3.2.9将该状态机模型写成代码(1)在状态中判断事件(事件查询)(2)在事件中判断状态(事件触发)另一种实现方法是在每个事件的中断(或查询到事件发生)函数内,判断当前状态,并根据当前状态执行不同的动作,再做相应的状态转移。3.2.4状态机建模应用实例例3.2.3在MSP430单片机上,P1.5、P1.6、P1.7口各接有一个按键(S1、S2、S3),按下为低电平。编写一个键盘程序。要求能够识别长、短按键并返回不同键值。当按键时间小于2s时,认为是一次短按键,按键时间大于2s后返回一次长键(0xC0+键值),之后每隔0.25s返回一次连续长按键(0x80+键值)。且要求键盘程序不阻塞CPU运行。图3.2.10长短键的状态机模型与时序图先用语言描述按键过程状态与事件之间的关系:1)在按键“未按下状态”时,若键被按下,按键状态变为“短按状态”。2)在按键处于“短按状态”时,若键被释放,认为是一次短按键,短键的键值压入键盘缓冲区,并回到“未按下状态”。3)在按键处于“短按状态”时,若超过2s,认为是一次长按键,“首次长键”的键值压入键盘缓冲区,并将按键状态变为“长按状态”。4)在按键处于“长按状态”时,每当超过0.25s,认为是一次“连续长键”,长键的键值压入键盘缓冲区,但状态不改变。5)在键盘处于“长按状态”时,若键被释放,回到“未按下状态”。例3.2.4增量式旋转编码器(见图3.2.12)是一种控制系统中常见的转角测量装置,常被安装在各种旋转轴末端,以测量轴转角。它输出如图3.2.11所示的两路相位差90°的脉冲(以下简称A路、B路)指示位置。旋转编码器每转过一定角度,就输出一个脉冲。当旋转编码器顺时针旋转时,A路脉冲超前B路脉冲90°;当旋转编码器逆时针旋转时,A路脉冲滞后B路脉冲90°。计算脉冲个数可以获知转角,根据相位差可以知道旋转方向,从而计算出旋转轴相对角度的变化。图3.2.11旋转编码器的输出时序图图3.2.12旋转编码器图3.2.13旋转编码器4细分原理图3.2.14旋转编码器4细分的状态转移图图3.2.15旋转编码器与MSP430单片机的连接例3.2.5在MSP430F425单片机上,P1.3接有一只红色LED,P1.1接有一只绿色LED,均为高电平点亮。要求串口收到“red”字符串时,点亮红色LED;收到“green”字符串时点亮绿色LED。收到“black”字符串时关闭所有LED。要求不阻塞CPU,在串口中断内完成。且要求无论单词前后是否有其他字母,都要正确解析。图3.2.16字符串“red”匹配过程的状态转移图图3.2.17字符串“green”与字符串“black”的匹配过程3.3事件触发程序结构3.3.1事件触发结构3.3.2事件引擎3.3.3中断优先级与中断嵌套3.3.4事件触发程序实例3.3.1事件触发结构图3.3.1事件触发结构程序3.3.2事件引擎图3.3.2事件、中断与事件引擎3.3.3中断优先级与中断嵌套图3
本文标题:1_第3章单片机软件工程基础
链接地址:https://www.777doc.com/doc-3024937 .html