概述
为什么用UML画图
茂哥是初入职时的导师,他评审检视我的代码、指导我的设计(使用UML),在此,致敬茂哥!
当时对UML体会不深,同样的随着工作的积累,发现UML是一个好的工具,来表达、呈现和分析各方的设计。
本文主题
使用UML进行代码分析,主要是NXP官方S32SDK,该SDK真是一个不错的东西,顺带画个图描叙一下使用C++开发MCU专栏中IIC实例的Demo调用关系。
主业务流程
主业务代码实现详见【使用C++开发MCU】IIC实例之读取温度传感器(基于NXP S32K146 MCU)
。
这里我们实现了一个温度传感器TMP类CTmp,一个I2C接口II2C,应用向tmp对象请求温度,tmp对象调用I2C的读取接口,我们C++版本的IIC驱动再封装了NXP官方的驱动(为了省事,当然也可以全部用C++实现)。
下面两个小结则用UML分析NXP官方的驱动,只展现了中断方式的。
写入接口分析
调发送接口,对驱动状态(state)进行赋值,排队发送从机地址,发送起始信号,发送数据,设置TXFIFO,启动中断。然后触发了中断(TXFIFO==0),中断中关闭发送中断,结束。
调用LPI2C_Cmd_MasterTransmit将字节流写入MTDR,将会立即启动发送。
但S32SDK可能考虑到数据太多上次还没发完TXFIFO不够等因数,又实现了一个软件Queue队列,增加了一个排队发送函数LPI2C_DRV_MasterQueueData,该函数判断软件队列是否为空,为空则直接调用LPI2C_Cmd_MasterTransmit直接写硬件TXFIFO立即发送。
若上述是直接写硬件TXFIFO,接下来设置LPI2C_Set_MasterTxFIFOWatermark为0,则必然进一次中断,在中断中调用LPI2C_Set_MasterInt(baseAddr, LPI2C_MASTER_TRANSMIT_DATA_INT, false);关闭发送中断。
若上述是写入软件Queue队列,后续设置TxFIFOWatermark为0,也必然进一次中断,进入中断后,先将软Queue中数据调用LPI2C_Cmd_MasterTransmit发完,再将txBuff调用LPI2C_DRV_MasterQueueData发送,最终txSize为0时,结束发送(发送停止信号),发送相关信号量与事件。
通过上述的软Queue,避免了上层用户发送IIC数据时判断TXFIFO满不能发送,然后死等这种情况,S32SDK通过合理的软队列搭配中断这种套餐,很好的实现了异步发送。通过提供LPI2C_DRV_MasterSendDataBlocking这种Blocking接口,在异步接口的基础上又很好的实现了同步发送。
PS:文字后续又进行了补充(2021/12/22),UML图中可能不能很好的正确表达。
读取接口分析
调读取接口,对驱动状态(state)进行赋值,排队发送从机地址,发送起始信号,发送数据,设置RXFIFO的Watermark为我们读取数据的大小,使能中断。
若总线上接收到数据,将触发了中断,中断中读取MRDR到缓冲区rxBuff,然后收尾。
S32SDK同样也考虑到了rxSize大于RXFIFOSIZE的情况,在中断中对Watermark也进行调节。同上写入接口分析分析小节,很好的实现了异步接收。
结语
我的UML功底不强,欢迎指导。
最后
以上就是哭泣纸鹤为你收集整理的【使用C++开发MCU】03-IIC实例之UML画个图展现设计(分析NXP S32SDK IIC Driver)为什么用UML画图本文主题主业务流程写入接口分析读取接口分析结语的全部内容,希望文章能够帮你解决【使用C++开发MCU】03-IIC实例之UML画个图展现设计(分析NXP S32SDK IIC Driver)为什么用UML画图本文主题主业务流程写入接口分析读取接口分析结语所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复