ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于 EA 的嵌入式 UML 建模实战:AHT21 温湿度传感器驱动全图建模

基于 EA 的嵌入式 UML 建模实战:AHT21 温湿度传感器驱动全图建模 一、类图1.1 类图中的关系比较常用的关系有以下几种关联含义两个类之间存在业务上的连接关系是最基础的关系。对象之间互相知道对方可单向 / 双向导航示例学生(Student)和课程(Course)。学生选课课程被学生选。学生对象持有课程引用课程也可以持有学生列表概括泛化继承含义is-a是一个。子类继承父类所有属性、方法可以重写。示例动物(Animal)是父类狗(Dog)、猫(Cat)是子类。狗是动物继承动物的 name、age并重写叫声()方法组合组成含义强生命周期的整体 - 部分关系。部分不能脱离整体独立存在整体销毁部分跟着销毁示例订单(Order)和订单项(OrderItem)。订单删除所有订单项必须一起删除订单项不能脱离订单单独存在关联类含义当关联关系本身也需要携带属性 / 方法时单独抽出来的类。多对多关联最常用示例学生和课程是多对多选课关系。选课这个关联本身有属性成绩、选课时间学生、课程本身不能存放成绩所以新建选课记录(SC)作为关联类实现含义类实现接口的契约。接口定义方法签名类去实现接口所有方法示例 接口支付(Payment)定义pay()微信支付(WechatPay)、支付宝支付(AliPay)实现这个接口模板绑定含义绑定 UML 模板类参数化类给模板参数传入实际类型。对应 C 模板、Java 泛型示例模板类ListTListStudent就是模板绑定把模板参数T绑定为Student类型。Cvectorintvector是模板int 是绑定的实际类型。1.2 实操本文以 AHT21 温湿度传感器 BSP 驱动为例在 EA 中搭建 UML 类图完成嵌入式组件的面向对象建模实操新建enum新建Interface打开属性的过程与上面同理新建ClassAHT21 驱动实体类bsp_aht21_driver_t新建Class接口实现类建立关系二、活动图添加 Action在本例中主要使用了原子的最小不可拆分的执行步骤简单一行逻辑不调用外部行为 / 函数一次性执行完调用操作调用类上面定义的 Operation成员函数 / API直接绑定类图里的函数值规范 计算表达式、生成一个值输出数值结果。做公式计算其他的调用行为调用另一个独立行为另一个活动图 / 状态机 / 交互图用来做分层、子流程接受事件阻塞等待直到收到某个信号事件才继续往下跑。例如等待I2C_TRANS_DONE信号等待 I2C 中断回调发出信号接收时间事件阻塞等待指定时长时间到自动继续定时器等待发送信号主动向外异步发送一个信号给别的对象 / 状态机非阻塞发完直接往下走创建对象实例化新建一个类的对象销毁对象销毁、释放对象实例释放资源添加 决策最终三、顺序图顺序图按照时间先后顺序传递消息、互相调用的动态交互过程核心重点是时序。3.1 实操在顺序图中继续沿用之前定义的 AHT21 的类添加 生命线在这个步骤中需要注意其中的aht21_inst、bsp_aht21_driver_t、iic_driver_interface_t、timebase_interface_t、yield_interface_t是需要将之前所创建的类拖动到顺序图中。以aht21_inst为例此时需要我们选择 生命线这样做有个好处当进行连线时可以直接选择相应的 消息还需注意的其中的 返回还有一个模块比较重要即下图中的 Fragment上图中存在以下选项替代alt多分支二选一 / 多选一等价if … else if … else。每个分区写监护条件只有满足条件的那一段执行互斥示例if…else二选一选择opt可选分支单分支等价if没有 else。条件满足就执行片段内消息不满足直接跳过什么都不跑示例仅当需要延时的时候才执行pf_rtos_yield(300)条件不成立直接跳过这段消息跳出break中断跳出类似 C 语言break。监护条件成立时执行本片段并且终止外层整个交互流程不再执行 break 后面所有消息示例一旦 IIC 返回错误直接终止整个外层时序后面所有 IIC 消息不再执行直接退出初始化流程平行par并行执行。片段内多条生命线消息不强制先后顺序可以并发执行示例片段内多条生命线消息并发执行不保证先后顺序。需注意par一般不填条件循环loop循环执行可以设置循环条件、最小 / 最大次数。条件成立反复重复片段内部消息示例循环重试。IIC ACK 应答失败时最多重试 3 次发送寄存器指令满足条件就重复片段内 IIC 收发消息危急critical临界区。片段内消息是原子操作执行期间不能被其他并行交互打断示例临界区一般不填条件否定neg非法交互片段描述不允许发生的时序。用来定义 “禁止出现的消息序列”用于校验、断言错误场景示例定义不允许出现的非法时序断言assert断言用来声明本片段时序必须成立用于模型校验。断言条件必须为 true如果不满足代表模型 / 运行出错示例断言校验。声明执行完这段 IIC 初始化之后状态必须等于AHT21_OK严格的strict强顺序。片段内所有消息严格按图上从上到下顺序执行不允许乱序。示例一般不填条件顺序seq弱顺序。跨不同生命线的消息不强制顺序只有同一条生命线上的消息保持先后顺序示例一般不填条件忽略ignore忽略指定消息。在本片段执行期间某些消息即使出现直接忽略不影响流程。可以写忽略的消息列表示例在本片段执行期间即使收到中断消息Irq_Event直接忽略不处理考虑consider仅考虑指定消息。和 ignore 相反本片段内只有列出的消息才会被识别其余所有消息全部忽略示例本片段里只识别列出的 IIC 收发消息其余所有消息全部忽略四、状态图以 AHT21 为例定义状态连线双击 中间连线注意下上图中 触发器 下的 类型调用调用对象的一个操作成员函数 / API作为触发源触发来源外部代码主动调用这个类的成员函数适用场景驱动对外 APIpf_init/pf_read_temp_humi/pf_sleep/pf_deinit时间定时器延时 / 超时触发触发来源等待一段时间到期自动触发不需要外部函数调用、信号适用场景I2C 等待从机超时、传感器等待上电稳定、轮询超时例BUSY状态等待 50ms 超时自动跳ERROR信号异步消息 / 中断、硬件事件外部向对象发送一个信号触发来源硬件中断、底层回调、异步通知不是直接调用本类函数适用场景I2C 传输完成中断、DMA 完成、硬件报错信号修改变更事件当某个布尔条件的值发生变化时自动触发触发来源属性 / 变量发生改变检测到布尔表达式变为 true适用场景轮询监测变量变化示例(i2c_bus_is_idle true)总线变为空闲瞬间触发转移此处需要注意的是修改事件和Guard的区别修改事件事件本身变量变化这个动作是触发器Guard转移的附加判断事件来了之后再判断 Guard 是否满足才允许跳转当选择 调用 后通过选择后面的 设置来选择之前在类之中新建的 操作。五、用例图以上面的 AHT21 为例添加 参与者添加 用例可以在场景中添加具体的测试步骤双击 用例 即可进入 场景添加 关系关联该角色可以启动 / 使用这个用例双方发生交互。包含基础用例一定会调用另一个公共子用例不能跳过。主用例执行过程中必须执行被包含用例是主流程的一部分扩展在满足特定触发条件时扩展用例插入、增强基础用例基础用例本身可以独立正常运行。基础用例正常跑不出事就不执行扩展只有满足触发条件才执行扩展用例一般用来处理异常、备选流程。扩展用例还可设置一定的触发条件六、对象图以串口为例UML 类图Class Diagram—— 是UART_HandleTypeDef和UART_InitTypeDef的结构体模板描述类型定义、成员、二者的组合关系UML 对象图Object Diagram—— 是实例化之后huart1 这个句柄实例的内存快照每个成员都赋予了具体初始化数值类图UART_HandleTypeDef为 UART 句柄结构体包含一个UART_InitTypeDef Init成员UART_HandleTypeDefUART 总句柄保存外设基地址、收发缓冲区指针、DMA 句柄、状态机、锁、错误码UART_InitTypeDef仅保存串口配置参数波特率、数据位、停止位、校验位等只负责初始化阶段的参数配置对象对象图是编译 初始化之后huart1 实例的某一瞬间内存状态huart1:UART_HandleTypeDef实例名huart1类型是UART_HandleTypeDefhuart1_Init:UART_InitTypeDefhuart1里面Init成员的实例填充了实际参数波特率 1152008 位数据1 停止位无校验收发模式无硬件流控16 倍过采样
返回列表