【架构】工程代码结构(附带NXP、ST官方demo)

1. 起因

最近在做我们应用层内部代码从2.0到3.0版本的迁移,除了删减增加模块,规范写法,最主要的就是重新规划了代码的结构。我们代码的特点就是并行了很多项目,这些项目有共同的地方,又有区别。把哪些部分抽出来做共有库,哪些做自己的项目内部,makefile怎么构思(关于makefile我也会写一篇快速入门)。
有时候回头看看自己的代码,怎么可以写的这么乱,模块化一点都不好,接口乱七八糟。最近重构代码的冲动越来越强烈。
这么想想,小工程就算了,大一点的项目,还是应该提前把结构和接口设计好,代码怎么分层,功能怎么划分,再开始写。
不过很多工程,前期设计好了,也经不住需求的一再变更,改改改改,就变成了一坨忍不住想重写的翔……
算了不抱怨了,还是看看别人是怎么分层的。

2. Demo结构解析

这里列的几个例子不是linux应用层的,是单片机的demo。

2.1 ST公司的STM32Cube

Cube版本:
在这里插入图片描述

简单来说,布局如下:
工程名

  • Document:文档
  • Driver:硬件驱动
    • Bsp:板级的接口,比如串口、IO、定时器……
    • CMSIS:内核接口,这个一般是内核厂家提供,代码不用改,
    • STM32F7xx_HAL_Driver:ST厂家提供的HAL库,与以前提供的3.5的标准外设库属于同级,都是对寄存器配置的封装。HAL库是一个硬件抽象层,便于不同芯片之间的移植。(大家底层不一样,但是HAL库的接口都一样)
  • Middleware:中间件包含的是一些位于系统代码和应用代码之间的,这里感觉就是在HAL库和用户调用之间又封装了一层,把一些协议栈封装进来了。
    • ST:ST自己的一些协议栈
      • STemWin:ST自己的界面
      • STM32_Audio:音频驱动
      • STM32_USB_Device_Library:封装了USB协议
      • STM32_USB_Host_Library
    • Third_Party:第三方库(协议栈)
      • Fatfs:文件系统
      • FreeRTOS:操作系统
      • LwIP:IP协议栈
      • ……
  • Project:不同的项目,我理解应用层的代码都写在这里面,就是流程,对BSP的调用,对middleware的调用
  • Utilities :这一块不太懂,是公共库?公共资源?字库图库这些?
  • xxxx.ioc : 图形化配置文件,可以用CubeMx打开

2.2 NXP公司的S32DS

S32DS版本:S32 Design Studio for Power Architecture Version: 2.1
在这里插入图片描述

NXP家的S32DS架构如下:
工程

  • Include:我理解是 应用层的头文件
  • Generated Code:这个是根据图形化配置,系统自动生成的代码(配置数组),实际使用的使用,把这些配置数组加载到系统接口上就能实现对外设的配置。
  • Project_Settings:
    • Debugger:调试器配置
    • Linker_File:链接.ld文件
    • startup_code:启动代码,这个应该是厂家提供,不用改的
  • SDK
    • plantform
      • devices:设备
      • driver:类似bsp,对寄存器操作的封装
      • pal:NXP基于driver层上又封装了一层PAL层,把不同芯片的接口统一了。类似ST的HAL库,都是便于移植用的。
    • rtos
      • FreeRTOS_PA:没啥说的,就是移植的freetos
      • osif: NXP自己的一个裸核的系统。bareMetal。
  • Source:我理解是应用层的代码
  • Document
  • xxx.pe:图形化配置界面。
  • xxx.ld:链接文件

2.3 自己写的应用层

这是我目前在整理的结构,个人感觉还挺好的,毕竟已经是做的第2次重构了,比较贴合我们的真实需求。
因为保密考虑,只列了一部分简单结构,能体现出来结构优势即可。

  • api:一些公有库的头文件
    • BaseApi
  • lib
    • BaseLib:包含一些硬件模块的驱动
      • Can:Can的驱动接口
      • Gpio:Gpio的驱动接口
      • NetSend:网络驱动接口
      • I2C:I2C的驱动接口
      • Uart:串口的驱动接口
    • Isp:摄像头芯片的图像调整
    • Common:读写文件、读写DDR、时间获取
    • Xcore:cache映射
    • ……
  • project:以上都属于共有库的部分,适合于一些项目来做开发,在project目录下,做不同项目的区别,流程、交互、协议等。
    • zu3_foresight
      • main
        • main.c
        • Buf_Manage:buf管理,不同项目的buf分的数据大小管理方式都不一样的。
        • Buf_Send:buf发送,涉及到和上位机(显示界面)的交互协议,不同项目定的不同
        • Weight_Load:权重加载,前视环视的的weight结构是不同的,也是跟着项目走的
        • Fpga_Cfg:Fpga配置,不同项目FPGA的bit不同,寄存器列表也不同。
        • ……
    • zu5_fisheye
    • 7020_foresight
    • ……

这样的好处就是,能多个项目做在一起,最大限度的共用一些库。
某些东西在一个项目中优化了,不用所有的分支全部合一遍。
比较典型的就是ISP模块,ISP工程师更新了ISP模块,只要更新到共同依赖库的Isp模块中,保持接口不变,其他的项目就都可以同步使用到这个改进,而不像一起,N个分支要全部合一遍。
对于我们这种需求多变,分支超级超级多的版本,就比较好用。不同的项目,在project文件夹下建立自己的项目工程,写自己的makefile就好。
外面的库都编成公共库,最后链接进来就好。

3. 实践

参考了两家的代码,感觉做非应用层项目,和底层关系会比较近,还是ST的架构会好一些,模块化分层会好做一些。
以一台PH滴定仪的设计为例,实操一下。

  • Document
  • Driver
    • Core:内核接口,CMSIS
    • HAL:HAL库接口,STM32F7xx_HAL_Driver
    • BSP:基于HAL又封装一层,应用层可以直接调用
  • Middleware
    • Third_Party:一些第三方库的移植
      • FreeRTOS
      • FATFS
      • EasyFlash
      • FreeModbus
    • Module:一些功能模块,基于BSP层,封装了一些功能模块的接口,供流程调用
      • FuncCommon 版本控制,硬件版本,软件版本 IO口
      • FuncRelay 继电器模块 依赖 IO口
      • FuncPumpT600 泵T600模块 依赖串口
      • FuncValueSv01 六通阀模块 依赖串口
      • FuncPumpKzq1 柱塞泵模块
      • FuncTemperaturePT 测温模块 Max31865 依赖IIC
      • FuncDebug 调试模块 依赖 flash
      • FuncAuthentication 加密模块 依赖 IIC 随机数
      • FuncStriier 搅拌器模块 依赖 IO
      • FuncLiquidLevel 液位模块 依赖IO
      • FuncMcgs屏幕MCGS交互模块 依赖串口
        • 接口:更新结果,更新步骤,更新温度,更新状态…
      • FuncWarn:
        • 接口:报警事件更新,报警触发,报警消除
  • Project:放置不同项目,以F离子滴定仪为例展开子文件夹
    • PH_AutoTitration:PH滴定仪
    • ORP_AutoTitration:ORP滴定仪
    • Spectrophotometer:分光光度计
    • F_Spectrophotometer:F离子滴定仪
      • Workspace
        • KeilMdk521:基于keil MDK 5.21建立的工程文件
        • sourceInsight4:基于SourceInsight4.0 建立的工程文件
        • CubeIde:基于cube建立的工程文件
      • UsrApp:放一些业务代码(server)
        • SvcWarn :报警流程
        • SvcMcgs:屏幕(MCGS组态屏)交互,modbus主机
        • SvcProcess:流程控制
        • SvcComm:外部通信交互,modbus从机,维护通信协议
        • main.c
<think>好的,我现在需要帮助用户寻找Autosar相关的demo工程或示例项目。首先,用户提到的引用内容中有几个资源,比如引用[1]提到了使用EB(可能是Elektrobit的工具)创建工程,引用[2]提到了DEMO故障处理和AutoSAR分析,引用[3]则涉及普华小满的工程实践和J-Link烧录。这可能意味着用户对实际的操作步骤和具体的示例项目有需求,而不仅仅是理论上的讲解。 接下来,我需要考虑Autosar的官方资源。Autosar官网通常会提供标准文档和一些示例,虽然可能不是完整的工程,但可以作为起点。用户可能需要访问官网的下载区域,但需要注意注册和权限的问题。 然后,主流的工具供应商比如Vector、Elektrobit、ETAS等,他们通常会提供与自家工具配套的示例工程。例如,Vector的Davinci工具链可能有Demo项目,用户需要联系供应商获取或者查看他们的文档和培训材料。 开源项目也是一个方向,比如Arctic Core,虽然已经归档,但可能仍有参考价值。另外,普华基础软件可能有基于Autosar的示例,引用[3]提到的普华小满工程实践就是一个例子,用户可以参考相关文档或联系厂商。 汽车电子社区和论坛,比如英飞凌、NXPST的开发者社区,可能会有用户分享的项目或教程。GitHub、GitLab上搜索Autosar相关关键词,也可能找到一些开源或学术项目。 培训机构和书籍提供的配套资源也是潜在来源,比如《AUTOSAR标准与车用控制器软件开发》可能附带有示例代码。 在回答用户时,需要将这些资源分门别类,结构清晰地呈现,同时结合用户提供的引用内容,特别是他们提到的EB创建工程、普华小满的实践,以及DEMO故障处理的示例,这些都需要重点强调。 另外,用户可能遇到的问题是,很多Demo工程是绑定特定工具的,比如EB、Vector等,需要用户有相应的工具链才能使用,这点需要提醒用户注意。同时,下载示例可能需要注册账号或联系供应商,这也是需要考虑到的步骤。 最后,确保回答符合系统级指令的要求,比如正确使用LaTeX格式,生成相关问题,结构清晰等。需要检查是否有数学表达式需要转换,但在这个问题中可能较少涉及,但如果有提到版本号或其他可能需要格式化的内容,需要注意。 总结回答的结构:先分点列出资源类型,每个类型下具体说明获取方式,结合用户的引用内容,最后给出相关问题。</think>### Autosar Demo工程及示例项目获取指南 根据您提供的引用内容和实际需求,以下是获取Autosar相关示例项目的系统化方法: #### 1. **主流工具链配套资源** - **Elektrobit (EB)** 引用[1]提到的EB创建工程方法,可通过其工具链$Tresos/ISOLAR$获取基础模块配置示例[^1]。需联系销售获取试用版工具包,内置$CAN$、$NVM$等基础模块模板。 - **Vector Davinci** 提供完整的$AUTOSAR\ Classic\ Platform$示例项目,包含$UDS$诊断协议栈和$NM$网络管理模块配置,需通过官网申请开发者账号下载[^2]。 #### 2. **国内厂商实践项目** - **普华基础软件** 引用[3]提到的普华小满工程实践,其开源仓库提供$S32K144$芯片的$J-Link$烧录示例工程,集成$ASW$应用层组件开发框架: ```c /* S32DS工程中的烧录配置片段 */ GDB Server Path: C:\Program Files\SEGGER\JLink_V796\GDBServerCL.exe ``` 可通过[普华AUTOSAR开源社区](https://www.puhuaq.com/autosar)获取[^3]。 #### 3. **开源参考实现** - **Arctic Core (v4.4.0)** 提供符合$AUTOSAR\ 4.2.2$标准的BSW模块源码,包含$ECU$状态管理、$WdgM$看门狗等核心模块: $$ EcuM_Init(); // ECU状态机初始化 WdgM_MainFunction(); // 看门狗主函数 $$ - 访问[GitHub Arctic Core](https://github.com/arccore/arctic-core)获取(需注意代码归档状态)。 #### 4. **芯片厂商参考设计** - **英飞凌AURIX** $TC3xx$系列开发包中提供$AUTOSAR\ MCAL$驱动示例,包含$ADC$采样周期配置矩阵: ```xml <AdcChannelConfig> <SampleTime>10</SampleTime> <!-- 单位:μs --> </AdcChannelConfig> ``` - 在[MyInfineon开发者平台](https://www.infineon.com/aurix)下载需签订NDA。 #### 5. **学术研究项目** - **EMC²研究计划** 提供基于$AUTOSAR\ Adaptive\ Platform$的自动驾驶参考架构,包含$DDS$通信中间件集成方案,论文附带的$GitLab$仓库含$POSIX$操作系统适配层代码
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值