使用doxygen分析MCAL源码的层次架构-基于YTM32

使用doxygen分析MCAL源码的层次架构-基于YTM32

文章目录

  • 使用doxygen分析MCAL源码的层次架构-基于YTM32
    • 引言
    • 准备和安装软件
    • 生成Call Graph
      • 配置`Wizard > Project`页面
      • 配置`Wizard > Mode`页面
      • 配置`Expert > Project`页面
      • 配置`Expert > Build`页面
      • 配置`Expert > Dot`页面
      • 分析并生成源码
      • 查看生成内容
      • 查看生成的调用流图
    • 总结
    • 参考文献

引言

阅读MCAL源码包中的源码,猜测MCAL可能只是MCU底层SDK向AutoSAR的一个适配接口。为了验证这个猜测,比较直接的做法,就是通过源码“逆向”出软件包中函数的调用关系,试图归纳出实际的源码设计层次架构。为此,我想到多年前在CI服务器上生成SDK API手册时,偶然发现的可以使用doxygen工具生成函数调用关系图的方法,打算摩拳擦掌,“搞”它一下子。

通过函数调用关系分析层次架构(抽象流图),是入手研究复杂软件的常用方法,也是软件架构师的基操,666 ^v^

文末有彩蛋。。。

准备和安装软件

doxygen 是跨平台的工具,官网:http://www.doxygen.nl/,支持Linux、Windows、Mac OS X系统(本文将以Windows版本为例)。支持C语言在内的多种语言的分析,生成的帮助文档格式可以是CHM、RTF、PostScript、PDF、HTML和Unixman page等。它是一款优秀的文档自动生成工具,可以将代码中的注释转换成帮助文档(注释格式要符合 doxygen 要求才行,FFmpeg API Documentation 就是用doxygen自动生成的)。本文使用doxygen的主要目的是生成函数调用关系图,也可以通过静态分析代码,生成「头文件引用关系图」、「函数调用关系图」、「继承图」以及「协作图」来可视化文档之间的关系。

doxygen(for Windows)的下载链接:https://www.doxygen.nl/files/doxygen-1.9.8-setup.exe

doxygen 自身没办法直接生成关系图,需要依赖 graphviz 才行,得先安装 graphviz。

官网:http://www.graphviz.org/
下载:https://graphviz.gitlab.io/_pages/Download/windows/graphviz-2.38.msi

生成Call Graph

运行 doxywizard.exe。

配置Wizard > Project页面

配置doxygen工程的目录、即将扫描源码的目录、产生输出文件的目录等。
使用doxygen分析MCAL源码的层次架构-基于YTM32_第1张图片

配置Wizard > Mode页面

选定目标源码的编程语言,为C语言。
使用doxygen分析MCAL源码的层次架构-基于YTM32_第2张图片

配置Expert > Project页面

可以选择生成中文文档。
使用doxygen分析MCAL源码的层次架构-基于YTM32_第3张图片

配置Expert > Build页面

配置引用的对象类型。
使用doxygen分析MCAL源码的层次架构-基于YTM32_第4张图片

配置Expert > Dot页面

启用DOT,启用生成CALL_GRAPH,配置生成DOT的工具路径。

使用doxygen分析MCAL源码的层次架构-基于YTM32_第5张图片

分析并生成源码

使用doxygen分析MCAL源码的层次架构-基于YTM32_第6张图片

查看生成内容

使用doxygen分析MCAL源码的层次架构-基于YTM32_第7张图片

查看生成的调用流图

以查看Mcu.c文件的包含关系为例:
使用doxygen分析MCAL源码的层次架构-基于YTM32_第8张图片
以查看Mcu_ClockInit()函数的调用关系为例:
使用doxygen分析MCAL源码的层次架构-基于YTM32_第9张图片

查看Mcu模块与其他模块的关联关系:
使用doxygen分析MCAL源码的层次架构-基于YTM32_第10张图片

总结

在doxygen生成的网站中大略过了一遍YTM32 MCAL的调用关系流图,以MCU驱动模块为例,做了简要的架构分析。MCU驱动模块的实现源码主要位于Mcu目录中(另有Mcu_Cfg.h文件位于board目录中),MCU驱动模块还引用了RteDet目录中的组件,以及Platform中关于硬件硬件的访问。根据AutoSAR MCAL的规范,McuDetRte等组件位于同一层次,并存在相互调用的关系。MCU驱动模块为了区分MCAL的同层调用关系和面向硬件的调用关系,专门在Mcu.c文件和Mcu_Lld.c文件中分两层实现了MCU驱动模块的功能:

  • 在Mcu.c文件中,可以调用MCAL同层次组件的服务,向AutoSAR的BSW提供底层服务。向下通过调用Mcu_Lld.c文件中函数,实现对本组件专属硬件的访问。
  • 在Mcu_Lld.c文件中,不能调用MCAL层次上的服务,仅能访问MCU硬件资源,并仅能又Mcu.c文件中的函数调用。

类似地,其他的MCAL层的驱动模块也是如此分层地设计和实现。

如此,可以推断,本文分析的YTM32B1ME05的MCAL软件包为代表,若在YTM32B1MD14芯片(或其他车规MCU)的MCAL软件包中,在基于这个层次架构实现MCAL软件包中,需要适配的,也仅仅是Mcu_Lld.c文件这个层级上的源码。

参考文献

  • doxygen+graphviz轻松绘制函数调用图(call graph),
    https://www.cnblogs.com/realjimmy/p/12892179.html
  • 绘制函数调用图(call graph)(4):doxygen + graphviz,
    https://blog.csdn.net/benkaoya/article/details/79763668

你可能感兴趣的:(YTM32,AutoSAR,嵌入式硬件,单片机,汽车电子)