mirror of
https://gitee.com/dlmu-cone/bf_original_balance_chassis
synced 2026-07-24 11:37:45 +08:00
更新了大量文档
This commit is contained in:
22
README.md
22
README.md
@@ -27,9 +27,9 @@
|
||||
|
||||
本框架主要代码分为**BSP、Module、APP**三层。三层的代码分别存放在同名的三个文件夹中,这三个文件夹存放在根目录下。开发过程中主要编写APP层代码,Module层与BSP层不建议修改。如需添加module(如oled屏幕、其他传感器和外设等),请按照规范编写并联系组长提交commit到dev分支或对应的功能名分支,完善后合并至主分支。在配置git的时候,将自己的`user.name`配置成英文缩写或易懂的nick name。
|
||||
|
||||
BSP层构建于ST的HAL(硬件抽象层)之上。为了方便使用,已经将CMSIS相关、HAL库和实时系统、DSP支持等文件都放在`HAL_N_Middlewares`文件夹下(包括Cube生成的外设初始化的Inc和Src文件夹)。
|
||||
BSP层构建于ST的HAL(硬件抽象层)之上,针对RoboMaster竞赛所用电控外设和模块的特点对其进行了进一步封装;Module层是基于bsp的封装打造的各种模块,旨在为app层提供**硬件无关的接口**,即应用层不应该出线任何与片上外设相关的代码。
|
||||
|
||||
**main.c的位置在**`HAL_N_Middlewares/Src/main.c`
|
||||
**main.c的位置在**`Src/main.c`
|
||||
|
||||
- **代码格式**:
|
||||
|
||||
@@ -119,23 +119,21 @@
|
||||
**编写和使用指南**
|
||||
|
||||
- 补充与修改:某款主控对应的BSP层应保持相同,当认为该层可能缺少部分功能或有错误时,请联系组长确认后解决并更新整个框架,**请勿自行修改提交**。 请在你修改/增加的bsp_XXX.md中提供测试用例和使用示范以及任何其他需要注意的事项,并在代码必要的地方添加注释。
|
||||
- 代码移植:BSP层也是在不同系列、型号的stm32间执行代码移植时主要需要关注的代码层。向功能更强系列移植一般只需要重配cube,而向功能较少的系列移植还需要去掉其不支持的功能。如果仅是对同一型号的开发板进行HAL初始化配置的修改,一般只需要给app层的应用重新分配外设和引脚,或修改波特率和通信频率等。
|
||||
- 代码移植:BSP层也是在不同系列、型号的stm32间执行代码移植时主要需要关注的代码层。向功能更强系列移植一般只需要重配cube,而向功能较少的系列移植还需要去掉其不支持的功能。如果仅是对同一型号的开发板进行CUBEMX初始化配置的修改,一般只需要给app层的应用重新分配外设和引脚,或修改波特率和通信频率等。
|
||||
- 子文件与文件夹:
|
||||
- bsp.c/h:该层用于bsp基础功能初始化的文件,其中.h被include至main.c中,以实现整个代码层的初始化。include了该层所有模块的.h并调用各模块的初始化函数。目前需要初始化的bsp只有log和dwt,**不同主频的MCU需要修改dwt初始化的参数**。**注意**,有些外设如串口和CAN不需要在bsp.c中进行模块层的初始化,他们会在module层生成实例(即C语言中的结构体)并注册到bsp层时自动进行初始化。以此达到提高运行速度避免未使用的模块被加载的问题。
|
||||
- bsp.c/h:该层用于bsp基础功能初始化的文件,其中`bsp.h`被include至main.c中,以实现必须的底层初始化,目前需要初始化的bsp只有log和dwt,**不同主频的MCU需要修改dwt初始化的参数**。**注意**,有些外设如串口和CAN不需要在bsp.c中进行模块层的初始化,他们会在module层生成实例(即C语言中的结构体)并注册到bsp层时自动进行初始化。以此达到提高运行速度避免未使用的模块被加载的问题。
|
||||
- bsp_xxx.c/h:每一个成对的.c/h对应一种外设,当上面两个代码层需要使用某个外设时,这里的文件就是对应的交互接口。
|
||||
- 注册回调函数与接收:通信类外设模块有的定义了回调函数(函数指针类型),module层的模块需要自行处理接收回调函数,在注册bsp的时候应传入对应参数格式的回调函数指针,使得接收中断发生的时候bsp层可以自行找到对应的上层回调函数进行调用。这也是回调函数设计的初衷:为底层代码调用上层代码提供接口,当特定事件发生的时候完成触发(自行搜索hook函数)。
|
||||
|
||||
## Module层
|
||||
|
||||
- 主要功能:实现对设备的封装,如将IMU、PC、电机等视为一个完整的功能模块,让应用层不需要关心其底层的具体实现,直接使用接口。
|
||||
- 主要功能:实现对设备的封装,如将IMU、PC、电机等视为一个完整的功能模块,让应用层(app)不需要关心其底层的具体实现,直接使用接口。
|
||||
|
||||
- 文件夹
|
||||
|
||||
- **注意,module层没有也不需要进行统一初始化**。app层的应用会包含一些模块,因此由app来调用各个模块的init或register函数,只有当一个module被app实例化,这个模块才会存在。
|
||||
- **注意,module层没有也不需要进行统一初始化**。app层的应用会包含一些模块,因此由app来调用各个模块的init()或register()函数,只有当一个module被app实例化,这个模块才会存在。
|
||||
|
||||
> 命名为init()的初始化一般来说是开发板的独占资源,即有且只有一个这样的模块,无法拥有多个实例,如板载陀螺仪、LED、按键等。命名为register()的模块则可以拥有多个,比如电机。
|
||||
|
||||
- monitor文件夹:实现看门狗功能。提供回调函数和count可选(TODO)
|
||||
> ~~命名为init()的初始化一般来说是开发板的独占资源,即有且只有一个这样的模块,无法拥有多个实例,如板载陀螺仪、LED、按键等。命名为register()的模块则可以拥有多个,比如电机。~~ legacy support,为了保证代码风格统一,所有接口统一命名为xxxRegister()。
|
||||
|
||||
- algorithm:该层软件库存放位置,这些功能与硬件无关,而是提供通用的数据结构和“算子”以供该层的其他部分调用,主要是算法、控制器、底盘和位姿解算等。
|
||||
|
||||
@@ -147,7 +145,7 @@
|
||||
|
||||
- 结构体:
|
||||
|
||||
也就是所说的“实例”,定义一个module结构体,对于app层来说就是拥有某一个功能模块的实例,比如一个特定的电机。在对电机进行操作的时候,传入该结构体指针。
|
||||
也就是所说的“实例”,定义一个module结构体,对于app层来说就是拥有某一个功能模块的实例,比如一个特定的电机。在对电机进行操作的时候,为实现面向对象的功能,需要在接口函数中传入该结构体指针。
|
||||
|
||||
- 函数:
|
||||
|
||||
@@ -155,9 +153,9 @@
|
||||
|
||||
- 封装程度:
|
||||
|
||||
应尽可能使到上层使用时不考虑下层所需的操作。如在使用电机时,这个电机的数据该和哪些电机的数据在一个数据包中发送,can的过滤器设置,均属于应该自动处理的功能;接收类的driver应该封装到只有初始化(用于初始化的`register`和发送控制命令`set_control`两个函数和一个实时更新的用于给app层提供该信息的数据结构体)。
|
||||
app层使用时与底层实现无关。如在使用电机时,这个电机的数据该和哪些电机的数据在一个数据包中发送,can的过滤器设置,均属于应该自动处理的功能;通信类的模块应该封装到只有初始化、发送和读取。对于电机,则是用于初始化的`register`和发送控制命令`set_control`两个函数和一个实时更新的用于给app层提供该信息的数据结构体(电机反馈信息)。
|
||||
|
||||
Module层主要存放的是类型定义和实例指针数组,在该层没有进行实例化(定义或通过malloc分配空间),若在APP层没有实例化,则该模块的存在与否不会影响编译后的可执行文件,只会占用初始化和代码区所需的少量内存。module只会保存每个实例对象的指针,在没有初始化的时候仅仅占用一个指针数组的空间。因此,基于本框架的其他工程没有必要删除APP层未使用的module文件。
|
||||
Module层主要存放的是类型定义和实例指针数组,在该层没有进行实例化(定义或通过malloc分配空间),若在APP层没有实例化,则该模块的存在与否不会影响编译后的可执行文件,只会占用.c文件中的static变量和代码区的少量内存(有些module只会保存每个实例对象的指针,在没有初始化的时候仅仅占用一个指针数组的空间)。因此,基于本框架的其他工程没有必要删除APP层未使用的module文件。
|
||||
|
||||
务必为模块添加说明文档和使用范例,以及其他需要注意的事项(如果有)。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user