编辑推荐: |
本文主要实例讲解了软件详细设计相关内容。
希望对您的学习有所帮助。
本文来自于微信公众号耐思时刻,由火龙果软件Linda编辑、推荐。 |
|
1、软件详细设计实例引言
之前的系列文章分别写到了《软件需求设计》、《软件架构设计》、《软件详细设计》等相关ASPICE设计。本文主要讲解软件详细设计的实操部分。
下面先放一张图,让大家直观感受下软件需求设计、软件架构设计、软件详细设计之间的联系。

软件详细设计:即,针对每个组件,展开详细描述,分析清楚其内部是怎么实现这个组件的。
故,每个组件,从大到小,展开描述,一般需包含如下信息:
本软件组件是由几个.c和.h组成的?其主要用途描述。
本软件组件由几个软件单元组成?共包含哪些函数,其用途描述。
软件包含哪些全局变量、静态变量、宏定义等。
每个软件单元之间怎么形成本软件组件,怎么形成对应的功能?
a) 动态行为图
b) 软件单元之间的接口要定义描述清楚。
软件组件分析:是否为关键组件的分析,软件复杂度的分析、软件资源使用情况分析等。
注意,如上图所示:一个软件单元,可能包含1个或多个函数。
2、软件详细设计实例
2.1、背景描述
继续之前的例子,先描述下该例子的背景,已经看过前面文章的,此小节的内容可以跳过。
系统需求:
1) SYSReq_001:ECU需要采集外部设备A输入的电压信息
2) SYSReq_002:当电压持续超过16V时(持续时间1000ms),判断为过压。
3) SYSReq_003:当发生过压情况时,切断电源;
软件需求:
4) SWReq_001:软件间隔10ms,从MCU的哪个PIN脚,进行电压ADC采样;
5) SWReq_002:当电压持续超过16V时(持续时间1000ms),判断为过压。
6) SWReq_003:当发生过压情况时,通过MCU有哪个PIN脚,切断外部ECU2的电源供电;
系统架构动态图:

软件架构静态架构图:

软件架构动态图:

今天的详细设计示例,针对上图的ADC软件组件展开详细描述。
2.2、软件单元静态设计
ADC组件由两个文件组成:Adc.c和Adc.h。

此组件实现了如下功能:
1) 初始化ADC功能
2) 周期进行ADC采样
3) 执行ADC滤波
4) 将ADC转换为实际电压值
静态设计图如下:

该ADC软件组件由如下4个单元,7个函数组成:
AdcTask:Adc_Task ()
AdcDriver:Adc_GetRawValue()、Adc_Init()
Adc_Filter:Adc_UpdateAdcWindow()、Adc_CalculateAverage()
Adc_Voltage:Adc_AdcToVoltage()、Adc_GetVoltage()
具体如下表:

2.3、软件接口设计
需罗列出所有的接口,包含全局变量或函数接口,且最好区分出内部接口与外部接口。
1、外部接口(即本组件与其他组件之间互相交互的接口)

2、内部接口(本组件内部,不同单元之间互相交互的接口)

2.4、变量与符号
需要罗列出所有的全局变量、变量类型、内部静态变量、宏定义等,具体如下:
1、全局变量定义:无
2、变量类型定义:无
3、内部静态变量定义:

4、宏定义:

2.5、 动态行为图
涉及到由不同单元共同形成某个功能时,则需要画出各自单元之间互相交互的动态行为图,参考下图:

这边重点补充说明下,软件详细设计是软件架构设计的进一步细化与延续,具体看下图:

2.6、函数设计
注意:下面的软件流程图,主要是示例用,让大家直观了解下该部分需要包含的内容。为了节省时间,我是结合AI工具,用UML自动生成的,没有再细细核对,所以可能画得没那很完善,哈。
若对如何用AI工具来画流程图,可以参考我上篇文章《UML代码自动生成软件流程图》。
2.6.1、Adc_GetRawValue
函数名称:Adc_GetRawValue()
输入参数:none
输出参数:uint16_t adc_value,即值范围0-1023
功能说明:该函数主要实现ADC寄存器获取当前的ADC值。
软件流程图:

2.6.2、Adc_UpdateAdcWindow
函数名称:Adc_UpdateAdcWindow()
输入参数:uint16_t adc_value,即值范围0-1023
输出参数:none
功能说明:该函数主要实现将当前ADC值存入滤波的滑动窗口中。
软件流程图:

2.6.3、Adc_CalculateAverage
函数名称:Adc_CalculateAverage ()
输入参数:none
输出参数:uint8_t avg_adc_value
功能说明:该函数主要实现ADC值滤波功能。
软件流程图:

2.6.4、Adc_FilterValue
函数名称:Adc_FilterValue ()
输入参数:uint16_t adc_value,即值范围0-1023
输出参数:uint8_t avg_adc_value
功能说明:该函数主要实现ADC值滤波功能。
软件流程图:

2.6.5、Adc_Task
函数名称:Adc_Task ()
输入参数:none
输出参数:none
功能说明:Adc主任务调度接口函数。
软件流程图:

2.7、其他
软件详细设计中还需要说明如下相关内容:
1、关于关键性的分析
例如分类标准:
高关键性:全新开发的组件,或软件的功能、可靠性和法规合规性有重大影响的组件。
一般关键性:不影响软件的正常运行,或影响较小的软件组件,主要涉及辅助功能或用户界面的组件。
本组件设计:该ADC组件会影响到功能的开启关闭,所以是一个关键组件。
2、关于复杂性的分析
可以通过圈复杂度的大小,来判断软件的复杂度。
例如:1-9为低,10-19为中,20-29为高
3、关于可测试性的分析
可通过相关工具进行软件单元的白盒测试。
4、关于资源的一些限制条件,如Flash占用多少,RAM占用多少,CPU负载占用多少等。
5、关于软件质量的要求的分析,如静态路径树,圈复杂度等。
3、总结
这部分总结的内容,和前面引言的内容很相似。本来想着要不要删除掉,但后面想说,留着也不错,大家看起来方便些,省得再翻到前面去。
首先,软件需求设计,软件架构设计、软件详细设计的关系,可以梳理为下图:

软件详细设计需要针对每个组件,展开详细描述,分析清楚其内部是怎么实现这个组件的。
一般需包含如下信息:
1、静态设计:
a) 本软件组件是由几个.c和.h组成的?其主要用途描述。
b) 本软件组件由几个软件单元组成?共包含哪些函数,其用途描述。
2、软件包含哪些变量与符号,如:全局变量、静态变量、宏定义等。
3、动态行为图:
a) 每个软件单元之间怎么形成本软件组件,怎么形成对应的功能?
b) 软件单元之间的接口要定义描述清楚。
4、软件组件分析:是否为关键组件的分析,软件复杂度的分析、软件资源使用情况分析等。
5、一个软件单元,可能包含1个或多个函数。
|