微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 程序设计总则之全部

程序设计总则之全部

时间:10-02 整理:3721RD 点击:
设计总则之一
程序质量的评估:
程序的优劣可以从两个方面进行评估,定量指标和定性指标
定量指标包括:
1)程序代码执行效率;
2)程序占用资源多少。
定性指标包括:
1)可调试性,即是否方便排除程序语法错误;
2)可测试性,即是否方便验证程序功能的正确性;
3)可维护性,即是否方便程序的修改和升级;
4)可移植性;
5)可读性。
设计总则之二
程序架构
   为了便于维护和移植,推荐使用层次化的软件设计方法。可把整个软件分为三层:应用层、界面层和底层驱动层,各层之间的关系如图1所示。

层次化设计说明:
1)底层驱动层主要包含直接和硬件相关的驱动程序,如:数码管显示、按键、蜂鸣器、继电器和电机控制等。底层的各个模块间要保持各自的独立性,不产生直接的数据交互,底层也不直接访问应用层,如果有需要,都要通过见面层进行数据交互。
2)界面层主要提供数据交互,为应用层和底层驱动之间以及底层驱动层各模块之间提供数据的交互。
3)应用层主要完成具体功能的实现,它通过界面层控制底层驱动层各模块来完成所需的功能,而不能越过界面层直接访问底层驱动层。所有的用户接口要在应用层来实现。
    a)一个好的架构必须将底层硬件包装起来,为应用程序提供一组丰富的函数操作(buffer or parameter),例如在中断的处理中,应用程序不需要知道中断的堆栈如何保护,不需要知道地址操作,只需要读取中断产生的旗标动作。
4)在即时性软件系统里面,为达到高效率的即时性与反应力,所以程序使用大量的事件触发方式来设计任务。事件有可能来自外部的触发(key、rxdata、sensor、detect……)也可能是系统内部自行产生的(timer、alarm、flag),与事件触发方式相对应的是定时查询方式,一般来说查询效率较差,因为有多余的动作而且系统反应时间与查询时间间隔有关,但是在小型的mcu系统里面用查询方式反而简单许多。
设计总则之三
设计基本原则
1)尽量减少各个子程序功能模块间的耦合度(耦合度是指一个程序的执行对另外一个程序的影响力),保证各自的独立性。一般情况下,建议子程序模块功能的划分要尽可能细化,功能尽量单一,减少子程序模块间的数据交互。
2)在满足功能需求的情况下,可适当牺牲代码的执行速度,以保证程序的透明度。
3)主要子程序模块间的交互,要通过特定的界面跟应用层进行沟通,可使用FIFO或是BUFFER两种方式。每种子程序模块都可以有自己的FIFO。例如有key buffer 、key fifo或
直接进入AP fifo三种设计方式。
4)每个子程序模块只能有唯一一个程序入口地址在程序的首部,只能有唯一一个程序出口地址在程序的尾部。
5)上电复位时要对所有的RAM空间进行初始化(建议用户寄存器清零,系统寄存器进行必要设定),不要使用未经初始化的变量。RAM未经过完整的初始化,容易导致程序执行的不确定性,这一不良现象往往在批量生产中有所体现。
6)系统中如果需要等待一些未知的应答信号,如通信或等待输入信号时,必须进行超时或异常处理,以防止程序进入“死等”状态。
例如在红外接收中,由于信号的突然消失或干扰从而无法得到一帧完整或正确的信息,这时需要复位接收程序的入口条件并退出接收程序,而不是一直等待信号的来临。不然无法进行下次接收甚至会影响到其他程序的执行。
7)通过对系统数据结构的划分与组织的改进,以及对程序算法的优化来提高空间效率。这种方法时解决软件空间效率的根本办法。
8)保证循环体内的工作量最小化。应仔细考虑循环体内的语句是否可以放在循环体之外,使循环体内工作量最小,从而提高程序的执行效率。
9)在多重循环中,应将最忙的循环放在最内层。
10)中断处理程序应尽量短。有效的做法为:在中断中进行标记,在主程序中进行处理。但一些实时性要求较高的程序例外。此外,进入中断时应该保存涉及道德变量和寄存器。
11)看门狗的正确使用。看门狗主要用于微控制器死机时的时间溢出复位,需要程序适时清除。正确的处理方式为:整个系统程序中尽量保证只有一处清看门狗位置,而且应处在主循环的主干位置。切忌不可在定时中断中清狗,因为微控制器有时只是在主循环中死掉。(所有AC电源的应用程序,都必须强迫加入看门狗选项,尤其是条件式的看门狗有利于系统发生异常的重启动)

   为了说明这种思想的好处,我特贴出一暖风机的应用层程序,大家看看
(当然这里面也涉及到了状态机的思想)。
/************************************************************
函数名称:mnapp
功能说明:应用层函数。
创建日期:2008.12.4
使用晶体:4MHZ晶振
************************************************************/
mnapp:
    mov    a,sys_state        ;状态分析
    @jmp_a    4   
mnapp00:
    jmp    mnapp10            ;状态0(关机)
    jmp    mnapp20            ;状态1(正常运行状态)
    jmp    mnapp30            ;状态2(温度设定状态)
    jmp    mnapp40            ;状态3(定时设定状态)
;******************************************************
;状态0事件分析
;******************************************************
mnapp10:
    clr    r
    call    rd_FIFO            ;事件分析
    mov    a,r
    @jmp_a    10
    jmp    mnapp90            ;无键按下   
    jmp    mnapp10_0        ;power on/off键
    jmp    mnapp10_1        ;模式键
    jmp    mnapp10_2        ;+键
    jmp    mnapp10_3        ;-键
    jmp    mnapp10_4        ;定时键
    jmp    mnapp10_5        ;摆风键
    jmp    mnapp10_6        ;定时设定值确认
    jmp    mnapp10_7        ;定时时间到
    jmp    mnapp10_8        ;温度设定值确认   
;0--1(关机--POWER事件)
mnapp10_0:
    mov_    sys_state,#1        ;转到状态1
    call    long_ring        ;长鸣
    mov_    LCD_buf+0,tmpbuf1    ;开机显示当前温度;?1   
    mov_    LCD_buf+1,tmpbuf2
    mov_    LCD_buf+3,#00010001b    ;显示温度图标和自动模式图标
    jmp    mnapp80            ;跳到mnapp80刷新显示
;0--2(关机--模式事件)
mnapp10_1:
    jmp    mnapp90            ;其他键不做处理
;0--3(关机--+事件)
mnapp10_2:
    jmp    mnapp90   
;0--4(关机---事件)   
mnapp10_3:
    jmp    mnapp90
;0--5(关机---定时事件)
mnapp10_4:
    jmp    mnapp90
;0--6(关机---摆风事件)
mnapp10_5:
    jmp    mnapp90
;0--7(关机---定时设定值确认事件)
mnapp10_6:
    jmp    mnapp90
;0--8(关机---定时时间到事件)
mnapp10_7:
    jmp    mnapp90
;0--9(关机---温度设定值确认事件)
mnapp10_8:
    jmp    mnapp90
;******************************************************
;状态1事件分析
;******************************************************
mnapp20:
    clr    r
    call    rd_FIFO            ;事件分析
    mov    a,r
    @jmp_a    10
    jmp    mnapp90            ;无键按下   
    jmp    mnapp20_0        ;power on/off键
    jmp    mnapp20_1        ;模式键
    jmp    mnapp20_2        ;+键
    jmp    mnapp20_3        ;-键
    jmp    mnapp20_4        ;定时键
    jmp    mnapp20_5        ;摆风键
    jmp    mnapp20_6        ;定时设定值确认事件
    jmp    mnapp20_7        ;定时时间到事件
    jmp    mnapp20_8        ;温度设定值确认事件
;1--1(状态1--power键)
mnapp20_0:
    jmp    mnapp70            ;关机   
;1--2(状态1--模式键)
mnapp20_1:
    call    short_ring        ;短鸣   
    call    changemodel        ;模式图标改变   
    jmp    mnapp80            ;显示刷新
;1--3(状态1--+键)
mnapp20_2:
    call    short_ring        ;短鸣
    bts0    LCD_buf+3.0        ;判断工作在何种模式下为1自动模式,为0设定模式
    jmp    mnapp20_2_1        ;工作在自动模式下,则转换到状态2
    call    fengsuinc        ;工作在设定模式下,则加风速
    jmp    mnapp80            ;显示刷新
mnapp20_2_1:
    mov_    sys_state,#2        ;转到温度设定状态
    mov_    set_tim,#250        ;2.5s确认设定
    mov_    LCD_buf+0,stmpbuf1    ;定时设定完,显示当前温度
    mov_    LCD_buf+1,stmpbuf2
    bset    LCD_buf+3.4
    bclr    LCD_buf+3.5
    jmp    mnapp80            ;显示刷新        
;1--4(状态1-- -键)
mnapp20_3:
    call    short_ring        ;短鸣
    bts0    LCD_buf+3.0        ;判断工作在何种模式下
    jmp    mnapp20_3_1        ;工作在自动模式下,则转换到状态2
    call    fengsudec        ;工作在设定模式下,则减风速
    jmp    mnapp80            ;显示刷新
mnapp20_3_1:
    mov_    sys_state,#2        ;转到温度设定状态
    mov_    set_tim,#250        ;2.5s确认设定
    mov_    LCD_buf+0,stmpbuf1    ;定时设定完,显示当前温度
    mov_    LCD_buf+1,stmpbuf2
    bset    LCD_buf+3.4
    bclr    LCD_buf+3.5
    jmp    mnapp80            ;显示刷新        
;1--5(状态1--定时键)
mnapp20_4:
    call    short_ring        ;短鸣
    bts0    LCD_buf+3.7
    jmp    mnapp20_4_1
    mov_    set_tim,#250        ;2.5s确认设定
    mov_    sys_state,#3        ;转到定时设定状态
    mov_    LCD_buf+0,setime_buf1    ;显示当前定时值
    mov_    LCD_buf+1,setime_buf2
    bclr    LCD_buf+3.4
    bset    LCD_buf+3.7
    bset    LCD_buf+3.5
    bset    LCD_buf+3.2
    jmp    mnapp80
mnapp20_4_1:
    mov_    time_buf1,#0        ;关定时功能
    mov_    time_buf2,#0
    bclr    LCD_buf+3.7
    bclr    LCD_buf+3.2   
    jmp    mnapp80
;1--6(状态1--摆风键)
mnapp20_5:
    call    short_ring        ;短鸣
    call    swing            ;改变摆风状态
    jmp    mnapp80
;1--7(状态1--定时设定值确认事件)
mnapp20_6:
    jmp    mnapp80
;1--8(状态1--定时时间到事件)
mnapp20_7:
    jmp    mnapp70
;1--9(状态1--温度设定值确认事件)
mnapp20_8:
    jmp    mnapp80
;*****************************************************
;状态2事件分析
;*****************************************************
mnapp30:
    clr    r
    call    rd_FIFO            ;事件分析
    mov    a,r
    @jmp_a    10
    jmp    mnapp90            ;无键按下   
    jmp    mnapp30_0        ;power on/off键
    jmp    mnapp30_1        ;模式键
    jmp    mnapp30_2        ;+键
    jmp    mnapp30_3        ;-键
    jmp    mnapp30_4        ;定时键
    jmp    mnapp30_5        ;摆风键
    jmp    mnapp30_6        ;定时设定值确认
    jmp    mnapp30_7        ;定时时间到
    jmp    mnapp30_8        ;温度设定值确认
;2--1(状态2--power键)
mnapp30_0:
    jmp    mnapp70   
;2--2(状态2--模式键)
mnapp30_1:
    call    short_ring        ;短鸣   
    call    changemodel        ;模式图标改变   
    jmp    mnapp80            ;显示刷新
;2--3(状态2--+键)
mnapp30_2:
    call    short_ring        ;短鸣
    call    tmpinc            ;加设定目标温度
    jmp    mnapp80            ;显示刷新
;2--4(状态2-- -键)
mnapp30_3:
    call    short_ring        ;短鸣
    call    tmpdec            ;减设定目标温度
    jmp    mnapp80            ;显示刷新
;2--5(状态2--定时键)
mnapp30_4:
    mov_    sys_state,#3        ;转到定时设定状态
    mov_    set_tim,#250        ;2.5s确认设定        
    jmp    mnapp80
;2--6(状态2--摆风键)
mnapp30_5:
    call    short_ring        ;短鸣
    call    swing            ;改变摆风状态
    jmp    mnapp80
;2--7(状态2--定时设定值确认)
mnapp30_6:
    jmp    mnapp90   
;2--8(状态2--定时时间到)
mnapp30_7:
    jmp    mnapp70            ;关机   
;2--9(状态2--温度设定值确认)
mnapp30_8:
    mov_    sys_state,#1        ;转到正常运行状态
    mov_    LCD_buf+0,tmpbuf1    ;温度设定完毕显示但前温度   
    mov_    LCD_buf+1,tmpbuf2
    jmp    mnapp80
;*****************************************************
;状态3事件分析
;*****************************************************
mnapp40:
    clr    r
    call    rd_FIFO            ;事件分析
    mov    a,r
    @jmp_a    10
    jmp    mnapp90            ;无键按下   
    jmp    mnapp40_0        ;power on/off键
    jmp    mnapp40_1        ;模式键
    jmp    mnapp40_2        ;+键
    jmp    mnapp40_3        ;-键
    jmp    mnapp40_4        ;定时键
    jmp    mnapp40_5        ;摆风键
    jmp    mnapp40_6        ;定时设定值确认
    jmp    mnapp40_7        ;定时时间到
    jmp    mnapp40_8        ;温度设定值确认
;3--1(状态3--power键)
mnapp40_0:
    jmp    mnapp70   
;3--2(状态3--模式键)
mnapp40_1:
    call    short_ring        ;短鸣   
    call    changemodel        ;模式图标改变   
    jmp    mnapp80            ;显示刷新
;3--3(状态3--+键)
mnapp40_2:
    call    short_ring        ;短鸣
    jmp    mnapp80            ;显示刷新
;3--4(状态3-- -键)
mnapp40_3:
    call    short_ring        ;短鸣
    jmp    mnapp80            ;显示刷新
;3--5(状态3--定时键)
mnapp40_4:
    call    short_ring        ;短鸣
    call    timing            ;定时设定   
    jmp    mnapp80
;3--6(状态3--摆风键)
mnapp40_5:
    call    short_ring        ;短鸣
    call    swing            ;改变摆风状态
    jmp    mnapp80
;3--7(状态3--定时设定值确认)
mnapp40_6:
    mov_    sys_state,#1        ;转到正常运行状态
    mov_    time_buf1,setime_buf1    ;开启定时
    mov_    time_buf2,setime_buf2
    bclr    LCD_buf+3.5
    jmp    mnapp90   
;3--8(状态3--定时时间到)
mnapp40_7:
    jmp    mnapp70            ;关机   
;3--9(状态3--温度设定值确认)
mnapp40_8:
    jmp    mnapp80
mnapp70:
    mov_    sys_state,#0        ;转到关机状态
    call    long_ring        ;长鸣
    mov_    LCD_buf+0,#10        ;清屏
    mov_    LCD_buf+1,#10
    clr    LCD_buf+2
    clr    LCD_buf+3
    mov_    control_buf,LCD_buf+2    ;控制刷新,关闭风扇和电热丝
    bset    CONrfb_flag
    jmp    mnapp80        
mnapp80:
    bset    LCDrfb_flag        ;显示刷新
mnapp90:
    ret

牛啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top