简介

一直一以来都是站在实现某个模块功能的角度去做软件开发,没有尝试过站在系统的层面去做开发。最近正好不忙,觉得是时候以系统工程师的视角,去开发一个完整的系统。接下来的几篇文章,我会记录一个USB转CAN总线系统(简称CAN盒子)的开发过程。

这个过程偏向于软件层面,从需求分析,系统架构设计,软件架构设计,到软件单元的实现。整个开发过程不完全遵循"V-Cycle“的开发流程,但会尽可能的靠近。

SYS.1 | 需求获取

需求获取过程的目的是在产品和/或服务的整个生命周期中收集、处理和跟踪演进的利益相关者(stakeholder)需要和需求,从而建立需求基线,作为构建所需工作产品的基础。

市面上CAN盒子很多,以其中一个CAN盒子参数,作为客户需求进行开发

  • USB连接的适配器(全速模式,与USB 1.1,USB 2.0和USB 3.0兼容)
  • 高速CAN连接(ISO 11898-2)
  • 比特率从5 kbit / s到1 Mbit / s
  • 时间戳分辨率小于50微秒
  • 符合CAN规范2.0A(11位ID)和2.0B(29位ID)
  • 通过USB供电
  • 提供PC端的驱动程序和API
  • 可以通过D-SUB,9针总线连接

1 未连接   2 CAN-L   3 地线   4 未连接   5 未连接

6 地线   7 CAN-H   8 未连接   9 未连接

为了便于后面需求管理和需求追溯,使用Enterprise Architect管理需求

SYS.2 |  系统需求分析

系统需求分析过程的目的是将已确定的利益相关者(stakeholder)需求转换为一组系统需求,以指导系统的设计。

系统需求分析需要做以下事情:

  • 指定系统需求。使用利益相关者需求和对利益相关者需求的更改来识别系统所需的功能和功能。在系统需求中指定功能和非功能的系统需求。
  • 组织系统需求。在系统需求描述中组织系统需求,比如

  • 对项目相关集群进行分组
  • 按照项目的逻辑顺序排序
  • 根据项目的相关标准进行分类
  • 根据利益相关者的需求划分优先级
  • 分析系统需求。分析特定的系统需求,包括它们之间的相互依赖性,以确保正确性、技术可行性和可验证性,并支持风险识别。分析对成本、进度和技术的影响。
  • 制定验证标准。为每个系统需求制定验证标准,为需求的验证提供定性和定量的措施。
  • 建立双向可追溯性。在利益相关者需求和系统需求之间建立双向的可追溯性。

Enterprise Architect中加入系统需求,并把系统需求跟客户需求一一对应上

建立追溯矩阵

-----------------------------------------------------------------------------------END

[参考资料]

[开发笔记usbTOcan]需求获取与系统需求分析的更多相关文章

  1. [开发笔记usbTOcan]软件需求分析和软件架构设计

    前面文章进行了系统分析和系统架构设计,手工焊接了一个板子,集合EK-TMC123GXL开发板(请忽略焊接技术) SWE.1 | 软件需求分析 软件需求分析过程的目的是将系统需求的软件相关部分转化为一组 ...

  2. [开发笔记usbTOcan]系统架构设计

    SYS.3 | 系统架构设计 系统架构设计过程的目的是建立一个系统体系结构设计,并确定哪些系统需求分配给系统的哪些元素,并根据确定的标准评估系统架构. 系统结构设计需要做一下工作: 开发系统架构设计. ...

  3. [开发笔记usbTOcan]用树莓派搭建私有Git服务器

    0 | 思路 在开始编程前,先创建一个版本管理库,以前一直用SVN,但目前用Git的还是比较,正好利用这个机会学习GIt. 想过使用Github提供的免费服务器,但项目目前还没有做开源的准备,于是就有 ...

  4. [开发笔记usbTOcan]PyUSB访问设备

    前面的几个章节的介绍,基本把usbTOcan的底层代码设计好,现在需要介绍PC端的PyUSB进行简单的测试. 在文章开始之前,需要简单的介绍一下整个系统. 0 | 部署 这里使用了两块TM4C123G ...

  5. [开发笔记]-使用jquery获取url及url参数的方法

    使用jquery获取url以及使用jquery获取url参数是我们经常要用到的操作 1.jquery获取url很简单,代码如下: window.location.href; 其实只是用到了javasc ...

  6. 钉钉开发笔记(5)android系统中html软键盘的适配

    最近项目中发现个别Android手机中存在弹出的软键盘会遮挡输入框的现象,最后自己写了一个方法(如下),问题基本解决. 记录下来,防止忘记.有什么不对的地方欢迎指正.O(∩_∩)O 1 //键盘适配 ...

  7. Java开发笔记(八十一)如何使用系统自带的注解

    之前介绍继承的时候,提到对于子类而言,父类的普通方法可以重写也可以不重写,但是父类的抽象方法是必须重写的,如果不重写,编译器就直接在子类名称那里显示红叉报错.例如,以前演示抽象类用法之时,曾经把Chi ...

  8. 树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110940484长期持续带来更多项目与技术分享, ...

  9. python开发笔记-通过xml快捷获取数据

    今天在做下python开发笔记之如何通过xml快捷获取数据,下面以调取nltk语料库为例: import nltk nltk.download() showing info https://raw.g ...

随机推荐

  1. LuoguB2001 入门测试题目 题解

    Update \(\texttt{2021.7.3}\) 经测试,本题 \(a,b\) 范围在 long long,对代码进行了修改,并修改一些笔误,更新了数据范围. \(\texttt{2021.7 ...

  2. java 编程基础 Class对象 反射:动态代理 和AOP:java.lang.reflect.Proxy:(Proxy.newProxyInstance(newProxyInstance​(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h))

    为什么我们使用动态代理 静态代理会让类变多了,多了代理类,工作量变大了,且不易扩展.比如我们上节课的例子,要实现不同的扩展方法就要编写不同的代理类,非常麻烦.   Proxy类的使用规则 Proxy提 ...

  3. java 网络编程基础 UDP协议的Socket:DatagramSocket;广播Socket:MulticastSocket

    什么是UDP协议: UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket 但这两个 Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象.Java 提供了 ...

  4. JavaScript 中的防抖和节流

    什么是防抖 函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时.如下图,持续触发 scrol ...

  5. go:遍历获取gin请求的所有参数

    背景:为了提高程序的通用性,需要将前端request中请求的参数,包含表单参数全部取到. 代码: 1 func DataMapByRequest(c *gin.Context)(dataMap map ...

  6. 使用docker自定义oraclejdk启动jar包

    Dockerfile文件 FROM centos:7 #把java与tomcat添加到容器中 ADD jdk-8u161-linux-x64.tar.gz /usr/local/ #安装 vim编辑器 ...

  7. JAVA验证身份证号码是否正确

    package com.IdCard; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.D ...

  8. 钉钉提供的内网穿透之HTTP穿透

    此方法无需自行提供服务器和域名 官方地址:https://developers.dingtalk.com/document/resourcedownload/http-intranet-penetra ...

  9. Subsequence(hdu3530)

    Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  10. uniapp 兼容H5复制文本功能,亲测可用

    封装copyText函数,具体如下: copyText(val){ let result // #ifndef H5 uni.setClipboardData({ data: val, success ...