DSP开发笔记一

article/2025/10/1 20:09:53

前言

​ 本笔记首先对DSP的特点及其选型进行了描述,然后重点记录DSP开发环境的搭建及基础工程示例,对为DSP开发新手有一定的指导作用。

1. DSP简介

1.1 主要特点

  1. 在一个指令周期内可完成一次乘法和一次加法;
  2. 程序和数据空间分开,可以同时访问指令和数据;
  3. 片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问;
  4. 具有低开销或无开销循环及跳转的硬件支持;
  5. 快速的中断处理和硬件I/O支持;
  6. 具有在单周期内操作的多个硬件地址产生器;
  7. 可以并行执行多个操作;
  8. 支持流水线操作,使取指、译码和执行等操作可以重叠执行。

1.2 主要厂商

TI

  • 面向数字控制、运动控制的TMS320C2000系列;
  • 面向低功耗、手持设备、无线终端应用的TMS320C5000系列;
  • 面向高性能、多功能、复杂应用领域的TMS320C6000系列

ADI

  • 21xx系列:16位定点dsp,主要以218x和219x系列为代表,性能优异,内部RAM大,外围接口多,适合作为控制类芯片使用;
  • SigmaDSP:完全可编程的单芯片音频DSP;
  • blackfin系列:ADI最新推出的一款dsp,是高性能16位DSP信号处理能力与通用微控制器使用方便的性能结合;
  • SHARC 系列:32位浮点dsp,包括前期的2106x系列,和目前的主力21160,21161系列,提供与大内存容量结合的简单浮点算法,具有高水平的浮点性能;
  • TigerSHARC系列:从SHARC系列发展而来,比SHARC具有更高的浮点运算功能;

其他

  • Motorola:定点DSP 处理器MC56001,浮点DSP芯片MC96002;
  • Freescale(Nxp):MSC8xx系列,DSP56Fxx;

国产

  • 进芯电子:仿TI的c2000系列;

1.3 DSP性能参数

  1. 运算速度
  • MIPS:百万条指令/秒,定点DSP芯片运算速度的衡量指标。
  • MOPS:百万操作/秒,通常操作包括CPU操作外,还包括地址计算、DMA访问数据传输、I/O操作等。一般说MOPS越高意味着乘积-累加和运算速度越快。MOPS可以对DSP芯片的性能进行综合描述。
  • MFLOPS:百万次浮点操作/秒,这是衡量浮点DSP芯片的重要指标。
  • ACS:指令周期,即执行一条指令所需的时间,通常以ns(纳秒)为单位。
  • FFT/FIR执行时间:运行一个N点FFT或N点FIR程序的运算时间,该指标可以作为衡量芯片性能的综合指标。
  1. 运算精度
  • 16位、32位定点:动态范围小,需要注意定标及溢出,功耗低,成本低;
  • 32位浮点:动态范围大,编程相对简单一些,功耗高;

1.4 DSP选型其他因素

  1. 外设、特定功能需求
    如:同步/异步串口、A/D、D/A、以太网、音频处理等;
  2. 片内存储
    DSP片内存储器可用来放程序和数据;
  3. 封装、功耗
    一般定点功耗较低,当然也有低功耗版浮点dsp但其速度很低;
    QFP封装对底板要求较低,BGA封装需求多层板;

初次选型建议:

最先考虑C2000系列,如果满足需求,选型型号: TMS320F28335(支持FPU,150MHz,100元左右);

其次考虑C674X系列,如TMS320C6747(375~456-MHz,3648 MIPS and 2736 MFLOPS,100元左右);


2. DSP基础开发

从初版学习开发考虑,建议选用TI的DSP,其资源和技术支持均非常成熟。

2.1 开发环境

TI

  • 开发工具
    CCS(Code Composer Studio),提供免费版本。
  • 编程语言
    汇编语言和C语言。
  • 仿真器
    XDS100、XDS110、XDS200、XDS560等,通常使用性价比较高的XDS100即可。
  • 软件库
    c2000系列:controlSUITE、C2000Ware(新版)
    其他:有对应的sdk,如TMS320C6747,提供 PROCESSOR-SDK-C6747(包含TI-RTOS)

ADI

  • 开发工具
    VISUAL DSP++,提供90天测试版(正版2w左右,每个系列对应一个版本)。
  • 编程语言
    汇编语言和C语言。
  • 仿真器
    不同系列仿真器不同;
    一般低性能版2000元左右;
  • 软件库
    Technical Library

2.2 DSP开发环境搭建(TI)

本章搭建示例基于c2000系列,主要为裸机开发,资源有限不建议运行OS,其他系列可参考搭建。

CCS安装

经实际测试ccs版本选择应注意以下事项:
ccs版本较多,win10系统不支持ccs6以下的版本;
ccs6以上的版本去掉了软件仿真功能;
ccs9版本只支持64位系统(该版本不能移植老版本的软件仿真功能);

本文选择安装 ccs6

软件库安装

最新ccs9版本推荐使用 c2000ware;
ccs9之前版本使用 controlSUITE;


CCS基础工程示例

新建工程

新建一个基于TMS320F28335的工程,如下所示:

在这里插入图片描述

空工程组成介绍:

  • cmd文件

    由于嵌入式DSP资源比较紧张,存在内部RAM、Flash 和外部RAM与Flash,需要人工干预来进行合理的资源分配;

    链接配置文件,给出了程序空间和数据空间的设置,及编译后各程序段在程序或数据空间的具体位置。类似于IAR的 icf文件和 keil 的sct文件。

    一般ccs工程有两个cmd文件,一个对寄存器进行存储映射,一个是对Flash, Ram进行存储分配。

    上图中的 28335_RAM_lnk.cmd 定义了程序、数据等在Ram上的分配,即程序运行与ram,通常用于仿真调试,一般情况下直接用TI给的,不需要做修改即可满足调试用。

    当程序需要下载固化时,选择 F28335.cmd。

    DSP2833x_Headers_nonBIOS.cmd 这个文件就是寄存器的存储映射,当工程实际操作硬件时需要添加到工程中。

  • targetConfigs

    仿真器的配置,直接双击文件选择使用的仿真器和对应芯片型号即可,后面讲述怎么添加软件仿真器功能。

工程添加软件库

已安装好 controlSUITE。

设备基础软件库:D:\ti\controlSUITE\device_support\f2833x\v142;

  • DSP2833x_common 文件夹:存放了DSP2833x 开发所需的外设、内核、DSP运算库、CMD 等文件。
  • DSP2833x_headers 文件夹:存放了DSP2833x 开发所需的外设头文件、带和不带BIOS CMD 等文件。

其他的应用库到时按需添加。


下面我们移植官方软件库实现简单的GPIO控制功能。

在工程目录下面 DSP2833x_Libraries 文件夹,用于存放从controlSUITE中拷贝出来的库文件。
将 DSP2833x_common 和 DSP2833x_headers 拷贝到 DSP2833x_Libraries目录中。

在这里插入图片描述

在工程中新建 APP(用户应用驱动),User(用于程序),Libraries(官方库),cmd等文件夹

在这里插入图片描述

最小工程所需文件按下图所示添加到工程中

在这里插入图片描述

工程头文件路径包含

在这里插入图片描述

GPIO反转程序编写

#include"DSP2833x_Device.h"		//芯片型号、外设使能相关宏定义
#include"DSP2833x_Examples.h"	///*** @brief LED使用GPIO外设初始化*/
void LED_Init(void)
{EALLOW;	//关闭写保护SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;	// 开启GPIO时钟//LED1端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;	//设置为通用GPIO功能GpioCtrlRegs.GPCDIR.bit.GPIO68=1;	//设置GPIO方向为输出GpioCtrlRegs.GPCPUD.bit.GPIO68=0;	//使能GPIO上拉电阻GpioDataRegs.GPCSET.bit.GPIO68=1;	//设置GPIO输出高电平EDIS;	//开启写保护
}/** @brief 主程序*/
void main(void)
{InitSysCtrl();	//系统时钟初始化,默认已开启F28335所有外设时钟LED_Init();while(1){GpioDataRegs.GPCTOGGLE.bit.GPIO68=1;//设置GPIO输出翻转信号DELAY_US(1000);}}

编译没有错误,基础工程搭建成功。


CCS6添加软件仿真功能

本方法适用于从 ccs6-ccs8.

1.下载仿真功能文件
链接: https://pan.baidu.com/s/1eZT7SGoGIRRsxPYCOLz3Xw 提取码: z94n

2.拷贝文件到ccs指定位置

找到CCS安装路径,将网盘中的simulator文件夹复制到CCS安装路径中的ccs_base文件夹内;

在这里插入图片描述

将网盘中的configurations文件夹复制到ccs_base\common\targetdb\文件夹下;

在这里插入图片描述

将网盘中的tisim_connection.xml复制到ccs_base\common\targetdb\connections\文件夹下;

[外链图片转存失败(img-hM8KsLmH-1567049031067)(C:\Users\wangh\AppData\Roaming\Typora\typora-user-images\1566454729839.png)]

将网盘中的devicer文件夹中的内容复制到安装路径ccs_base\common\targetdb\drivers\文件夹下;

[外链图片转存失败(img-c7gCWnjP-1567049031067)(C:\Users\wangh\AppData\Roaming\Typora\typora-user-images\1566454795285.png)]

重新打开ccs,即可为工程配置软件仿真如下:

在这里插入图片描述

接下来工程就支持软件仿真了,当然涉及到外设相关操作时会出错(比如ADC采集)。

2.3 DSP运算仿真实验

专业术语

功能术语

  • FPU:Float Point Unit,浮点运算单元;
  • FixedPoint:定点;
  • VCU:Viterbi and complex unit,用来执行高效 Viterbi、复杂算术运算,16 位快速傅里叶变换 (FFT) 和 CRC 算法的加速器;
  • CLA: 控制律加速器,把一些与控制系统性能息息相关的代码放到CLA中独立运行,不占用CPU时间;

库术语

  • RTS:实时运行库,DSP编程开发,则RTS库提供C/C++代码的运行环境,不同功能可能需要选择器对应的rts库;
  • SGEN:信号产生库;

数学术语

  • DFT:离散傅里叶变换;
  • FFT:快速傅里叶变换,是离散傅立叶变换的快速算法;
  • CFFT:对复数进行fft变换;
  • RFFT:对实序列进行fft变换;
  • FIR滤波器:Finite Impulse Response 有限脉冲响应滤波器;
  • IIR滤波器:无限冲激响应滤波器;

正弦函数仿真显示

测试代码如下

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
#include "math.h"#define PI  	3.1415926      	//定义圆周率
#define Fs     	1000          	//定义采样频率 Hz
#define F1    	100           	//信号频率  Hz
#define F2    	20
#define Sample_points    1024	//采样点数float signal1[Sample_points];
float signal2[Sample_points];int main(void)
{int i;float t;for(i=0;i<Sample_points;i++){t = i*1.0/Fs;signal1[i] = sin(2*PI*F1*t);signal2[i] = sin(2*PI*F2*t);}while(1);
}

很简单的一段代码,大致意思就是生成了两个不同频率的正弦信号,分别保存在了数组signal1和signal2中。

下面我们通过软件仿真功能将代码运行起来,同时同步graph工具图形化显示函数计算数据。

Graph设置如下:

在这里插入图片描述

运行程序,显示效果如下

在这里插入图片描述

接着我们看其傅里叶变换,Graph提供直接生成fft功能,点击菜单栏Tools->Graph->FFT Magnitude,如图所示:

在这里插入图片描述

正玄函数fft变换显示如下:

在这里插入图片描述

DSP函数库实现RFFT

这一节将需要进行稍微复杂一点的操作,涉及到变量存储的分配及cmd文件修改,FFT计算原理,函数库及其运行支持库的设置,CFFT相关库函数等知识点。

#pragma DATA_SECTION

利用CCS进行DSP编程时,如果不指定变量的存储位置,那么编译器会自动给变量分配存储位置。但是,有些时候,需要将某个变量存放到某个特定的位置,这个时候就可以利用#pragma DATA_SECTION指令了。

如进行CFFT和ICFFT都要求输入的数组格式对齐,即变量存储的起始地址为2xFFTsize*sizeof(float),例如256点的FFT变换,则变量的起始地址必须是1024的倍数,格式对齐的方式利用变量定义的方式进行。

如:

#pragma DATA_SECTION(RFFTin1Buff, "RFFTdata1");  
float32 RFFTin1Buff[RFFT_SIZE]; 

定义 RFFTin1Buff 数组到 RFFTdata1的RAM段;

RFFTdata1再cmd文件中进行RAM分配,后面实例代码中进行说明。

#pragma CODE_SECTION

利用#pragma CODE_SECTION指令可以将程序从Flash搬到RAM中运行,从而提高程序执行速率。

这个部分后面涉及程序优化时再进行详细描述。

RFFT工程实例

1.拷贝dsp FPU运算库到工作区间,便于工程引用;

2.给工程添加dsp FPU运算库,从controlSUITE拷贝;

在这里插入图片描述

3.FPU库头文件路径引用及编译器相关设置

选择fpu运行库

在这里插入图片描述

FPU头文件路径添加

在这里插入图片描述

示例程序:

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
#include "math.h"
#include "float.h"
#include "FPU.h"	//dsp 浮点运算库#define	RFFT_STAGES		8	//RFFT运算阶数
#define	RFFT_SIZE		(1 << RFFT_STAGES)#pragma DATA_SECTION(RFFTin1Buff,"RFFTdata1");  //Buffer alignment for the input array,
float32 RFFTin1Buff[RFFT_SIZE];                 //RFFT_f32u(optional), RFFT_f32(required)//Output of FFT overwrites input if//RFFT_STAGES is ODD
#pragma DATA_SECTION(RFFToutBuff,"RFFTdata2");
float32 RFFToutBuff[RFFT_SIZE];                 //Output of FFT here if RFFT_STAGES is EVEN#pragma DATA_SECTION(RFFTmagBuff,"RFFTdata3");
float32 RFFTmagBuff[RFFT_SIZE/2+1];             //Additional Buffer used in Magnitude calc#pragma DATA_SECTION(RFFTF32Coef,"RFFTdata4");
float32 RFFTF32Coef[RFFT_SIZE];                 //Twiddle bufferfloat	RadStep = 0.1963495408494f;             // Step to generate test bench waveform
float	Rad = 0.0f;RFFT_F32_STRUCT rfft;void main(void)
{Uint16	i;//	InitSysCtrl();	//没有硬件支撑时,予以注销DINT;
//	InitPieCtrl();IER = 0x0000;IFR = 0x0000;
//	InitPieVectTable();EINT;   // Enable Global interrupt INTMERTM;   // Enable Global realtime interrupt DBGM// 清空输入缓存for(i=0; i < RFFT_SIZE; i++){RFFTin1Buff[i] = 0.0f;}// 测试样例波形Rad = 0.0f;for(i=0; i < RFFT_SIZE; i++){RFFTin1Buff[i]   = sin(Rad) + cos(Rad*2.3567); 	// 实部输入信号Rad = Rad + RadStep;}rfft.FFTSize   = RFFT_SIZE;			// FFT变换的长度,FFTSize=2^stagerfft.FFTStages = RFFT_STAGES;		// 傅里叶变换的阶数rfft.InBuf     = &RFFTin1Buff[0];  	// 输入数组rfft.OutBuf    = &RFFToutBuff[0];  	// 输出数组rfft.CosSinBuf = &RFFTF32Coef[0];  	// 转化因子数组rfft.MagBuf    = &RFFTmagBuff[0];  	// RFFT_f32_sincostable(&rfft);       	// 计算傅里叶变换的转化因子 Calculate twiddle factorfor (i=0; i < RFFT_SIZE; i++){RFFToutBuff[i] = 0;			   	//Clean up output buffer}for (i=0; i < RFFT_SIZE/2; i++){RFFTmagBuff[i] = 0;		       	//Clean up magnitude buffer}RFFT_f32(&rfft);				   	//实数傅里叶变换RFFT_f32_mag(&rfft);				//计算幅值 Calculate magnitudefor(;;);} //End of main

上面示例程序中使用 #pragma DATA_SECTION 定义了一些数组到RAM段,这些RAM段须在cmd文件中定义分配。

在这里插入图片描述

在这里插入图片描述

设置仿真器为软件仿真器,编译程序没有错误,然后运行。

设置Graph及数据波形显示如下:

样例输入波形:

在这里插入图片描述

RFFT变换之后的波形:

[外链图片转存失败(img-Hfd7bdlT-1567049031069)(C:\Users\wangh\AppData\Roaming\Typora\typora-user-images\1566547619499.png)]

2.4 DSP常用外设

待续…

3. DSP进阶开发

本章开发基于TMS320C6748,运行TI-RTOS.

3.1 术语介绍

  • RTSC:Real-Time Software Component,实时软件组件。RTSC是一个基于C的编程模型,用于开发创建或实施嵌入式平台实时软件组件。
  • XDC:eXpress DSP Components,是一个为嵌入式实时系统提供可重用组件(称作:包)的标准。
  • XDCtools:包含使用RTSC的工具和运行时组件,提供了TI-RTOS及其组件(包括SYS/BIOS)需要的底层核心工具。 其功能如同Linux开发中发编译工具链。

总体来说就是TI提供XDC标准的SDK(里面包含如函数库、BIOS、DSP库等),通过XDCtools进行编译,整体以包的形式操作,而无需添加c文件到工程中。

理解CCS的这个工程框架,有利于工程的搭建。


3.2 C6748工程搭建

工程环境

CCS8.3.0

ti-processor-sdk-rtos-omapl138-lcdk-05.03.00.07

这个组合经测试正常,因为使用TI的sdk需要考虑到 ccs、XDCtools、及sdk三者的版本匹配问题,否则程序无法正确编译。

很遗憾的是首先老版本软件仿真器不支持C6748芯片,CCS8.3更是运行软件仿真器出错,如需深入调试还是需要硬件支持来调试功能。

工程创建

  1. CCS添加sdk包

    Window–>Preferences–>Code Composer Studio–>Products

    点击Add,添加我们安装的sdk软件包

在这里插入图片描述
在这里插入图片描述

我们会看到下面会出现我们芯片所需要的软件包,点击Apply,然后ccs会提示安装sdk里面包含的包,安装完成后ccs重启。

  1. 新建SYS/BIOS工程

    File–>New–>CCS Project

在这里插入图片描述

选择工程需要的组件

在这里插入图片描述

这样一个基础的RTOS工程就创建完成,程序编译正常。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/k0aCaF64.shtml

相关文章

UML状态图示例

状态图是用于表示对象状态的UML图。 在图书管理系统中&#xff0c;图书有不同的状态&#xff0c;我们可以用状态图表示如下&#xff1a;

数据库课程设计——宾馆管理系统UML状态图

客户账号状态图 前台登录状态图 客户预订状态图 会员卡状态图

【转】超详细的UML状态图符号,初学者也能轻松看懂状态图

UML状态图&#xff0c;用于显示状态机&#xff0c;即描述一个对象所处的可能状态以及状态之间的转移。用状态图建模可以帮助开发人员分析复杂对象的各种状态的转换&#xff0c;以及对象何时执行怎样的动作。那状态图又是怎样表示这些信息的呢&#xff1f;要想看明白其中的奥妙&…

菜鸟实战UML——状态图

状态图 状态图(Statechart Diagram)&#xff1a;是描述一个实体基于事件反应的动态行为&#xff0c;显示了该实体如何根据当前所处的状态对不同的事件做出反应。通常我们创建一个UML状态图是为了以下的研究目的&#xff1a;研究类、角色、子系统、或组件的复杂行为。 理解&am…

UML——活动图和状态图

目录 活动图 活动图的基本要素 状态图 状态图的基本要素 状态图与活动图之间的区别 活动图 概念&#xff1a;活动图本质上是一种流程图&#xff0c;它描述活动的序列&#xff0c;即系统从一个活动到另一个活动的控制流。 作用 描述一个操作的执行过程中所完成的工作或者…

UML状态图 2021.07.18

概述 UML状态图主要用于描述对象具有的各种状态、状态之间的转换过程以及触发状态转换的各种事件和条件。 UML 状态图的目的: UML 状态图可以捕获对象、子系统和系统的生命周期&#xff0c;可以告知一个对象可以拥有的状态&#xff0c;并且事件(如消息的接收&#xff0c;时间…

UML状态机图

状态机图&#xff08;State Machine Diagram&#xff09;也叫状态图、有限状态机图&#xff08;Finite Diagram&#xff09;&#xff0c;是一种描述所有状态及状态之间流转规则的图形。在软件设计领域&#xff0c;“状态”在业务系统中无处不在&#xff1a;订单要有状态&#x…

UML—状态图

【内容】 1.什么是状态图 状态图描述一个特定对象的所有可能状态以及由于各种事件的发生而引起的状态之间的转移。状态图侧重于从行为的结果来描述&#xff0c;只涉及一个特定的对象&#xff0c;常用于动态特性建模。 2.状态图的组成 &#xff08;1&#xff09;起点、终点 …

UML——状态图

7 状态图&#xff08;Stage Diagram&#xff09; 7.1 概述 状态图主要用于描述对象的状态变化以确定何种行为改变了对象状态&#xff0c;以及对象状态变化对系统的影响。 通常只用于描述单个对象的行为。 状态图在描述单个复杂对象的行为时非常有助于我们理解一个对象的行为…

UML活动图与状态图

笔记基于《UML和模式应用》教材 UML活动图 基本的UML表示法 基本的UML活动图表示法&#xff0c;包括动作、分区、分叉点、连接点和对象节点等。分区有助于观察多个参与者以及业务过程中涉及的并行动作&#xff0c;对象节点可以描述动作周围移动的事物。 其他UML活动图表示法…

UML状态图和活动图

转载于https://www.cnblogs.com/jingwhale/p/4230235.html UML状态图和活动图 UML状态图和活动图 统一建模语言UML&#xff08;Unified Modeling Language&#xff09;是非专利的第三代建模和规约语言。UML是一种开放的方法&#xff0c;用于说明、可视化、构建和编写一个正在…

UML图之『状态图』就是这么简单搞定

UML图之状态图 状态图的组成元素&#xff1a; 初始状态 初始状态是状态机的起始位置&#xff0c;它不须要事件的触发。由黑色实心圆点来表示 状态 状态是对象运行某项活动或等待某个事件的条件。 状态用圆角矩形表示 复合状态 复合状态是具有子状态&#xff08;或称为嵌…

UML 状态图 statechart diagram

1. 什么是状态图 状态图是一个类对象所可能经历的所有历程的模型图。状态图由对象的各个状态和连接这些状态的转换组成。说明对象在它的生命期中响应事件所经历的状态序列&#xff0c;以及它们对那些事件的响应。 2. 状态图的作用 1). 状态图描述了状态之间的转换顺序&#x…

UML状态图

状态图&#xff08;Statechart digram&#xff09;是系统分析的一种常用工具&#xff0c;系统分析员在对系统建模时&#xff0c;最先考虑的不是基于活动之间的控制流&#xff0c;而是基于状态之间的控制流&#xff0c;因为系统中对象的状态变化最易被发现和理解。 状态机…

使用EA绘制UML状态图

1.创建包&#xff0c;并命名 2.右击包&#xff0c;创建图 3.创建状态图并命名 3.拖入需要的元素&#xff0c;并命名 4.将Initial与State联系起来 点击Initial&#xff0c;旁边会出现一个向上的小箭头&#xff0c;点击小箭头&#xff0c;将其与State连在一起 5.选择Initial和S…

UML状态图详解

先放目录&#xff0c;一共四部分&#xff1a; 什么是UML状态图&#xff1f; UML状态图的组成 UML状态图实例 UML状态图怎么画&#xff1f; 一、什么是UML状态图&#xff1f; 状态图&#xff08;UML 1.x规范中的称呼&#xff09;&#xff0c;是一种展示状态机的图&#xff…

UML 状态图

在系统分析员对某对象建模时&#xff0c;最自然的方法并不是着眼于从活动到活动的控制流&#xff0c;而是着眼于从状态到状态的控制流。 状态机 定义&#xff1a; 状态机是展示状态与状态转换的图。在计算机科学中&#xff0c;状态机的使用非常普遍&#xff1a;在编译技术中通…

时序图、流程图、状态图、协作图之间的区别

时序图 时序图用于描述对象之间的传递消息的时间顺序, 即用例中的行为顺序. 当执行一个用例时, 时序图中的每条消息对应了一个类操作或者引起转换的触发事件. 在 UML 中, 时序图表示为一个二维的关系图, 其中, 纵轴是时间轴, 时间延竖线向下延伸. 横轴代表在协作中各个独立的…

UML之状态图

一、状态图概要 状态图是一种行为图。描述一个特定对象的所有可能的状态以及引起状态转换的事件。 在面向对象的软件系统中&#xff0c;一个对象无论多么简单或者多么复杂&#xff0c;都必然会经历一个从开始创建到最终消亡的完整过程&#xff0c;这个过程通常被称为对象的生命…

一张图阐述UML状态图的画法【软件工程】

文章目录 I.介绍状态图II.一图搞定状态图画法 I.介绍状态图 状态图展示了一个特定对象的所有可能状态以及由于各种事件的发生而引起的状态间的转移。 它有两大特征&#xff1a; 1️⃣所有的变化都是针对某一个特定的对象&#xff0c;这个对象会触发各种的状态。 2️⃣触发的…