Go to file
NeoZng fa4a78a7a1 重新组织了说明文档分类,添加了VSCode自定义入门教程,编写了部分Readme文档 2023-07-24 23:29:13 +08:00
.assets 更新了vscode配置文档以提供动态监视相关的教程 2023-07-23 13:32:19 +08:00
.vscode 使用位锁替换mutex和semaphore实现,仅支持单核 2023-07-19 13:58:42 +08:00
Drivers 重新组织文件结构,方便修改cubemx进行移植或新增/减少功能 2023-04-13 11:33:31 +08:00
Inc 修改了freertos的支持include,增加了daemon的上线等待时间,增加pid参数整定指南 2023-06-23 15:56:20 +08:00
Middlewares 修复添加新版cmsis-dap时flash溢出的问题 2023-07-11 01:38:57 +08:00
Src 清除所有的legacy support,增加编译时的内存使用预测和Werror选项,统一命名。 2023-07-14 17:24:44 +08:00
application 重新组织了说明文档分类,添加了VSCode自定义入门教程,编写了部分Readme文档 2023-07-24 23:29:13 +08:00
bsp 更新了vscode配置文档以提供动态监视相关的教程 2023-07-23 13:32:19 +08:00
modules 添加了回调任务的支持,允许bsp将回调函数设置为在中断中唤醒任务而不是直接执行,有助于提高实时性 2023-07-23 00:17:11 +08:00
.gitignore 增加了debug文档和一些todo 2023-02-22 13:53:25 +08:00
.mxproject 清除所有的legacy support,增加编译时的内存使用预测和Werror选项,统一命名。 2023-07-14 17:24:44 +08:00
Bug_Report.md 修复CAN中断优先级导致函数重入访问static变量的问题,提升了bsp和部分module的性能。 2023-03-23 18:22:24 +08:00
LICENSE add LICENSE. 2022-11-12 12:02:28 +00:00
Makefile 添加了回调任务的支持,允许bsp将回调函数设置为在中断中唤醒任务而不是直接执行,有助于提高实时性 2023-07-23 00:17:11 +08:00
Makefile.upgrade 增加了cmd/powershell下自动添加源文件的支持 2023-07-13 15:37:58 +08:00
README.md 重新组织了说明文档分类,添加了VSCode自定义入门教程,编写了部分Readme文档 2023-07-24 23:29:13 +08:00
STM32F407.svd init commit 2022-10-20 17:13:02 +08:00
STM32F407IGHx_FLASH.ld 修改文档文件夹位置,添加部分文档 2023-06-14 20:07:39 +08:00
TODO.md 修改文档结构,更新TODO list 2023-07-23 23:04:44 +08:00
VSCode+Ozone使用方法.md 更新了vscode配置文档以提供动态监视相关的教程 2023-07-23 13:32:19 +08:00
basic_framework.ioc 修改了freertos的支持include,增加了daemon的上线等待时间,增加pid参数整定指南 2023-06-23 15:56:20 +08:00
openocd_dap.cfg 添加了部分说明文档 2022-12-19 17:15:42 +08:00
openocd_jlink.cfg 增加了一键下载(不调试)的支持,并更新了makefile,添加了make clean支持 2022-11-29 20:00:46 +08:00
startup_stm32f407xx.s init commit 2022-10-20 17:13:02 +08:00
stm32.jflash 发布beta版本,目前基本功能都可用 2022-12-11 14:59:45 +08:00
task.ps1 更新了程序流程和数据流图,增加ozone一键调试的支持,补充了legacy support warn 2023-02-15 18:28:25 +08:00
合理地进行PID参数整定.md 更新了vscode配置文档以提供动态监视相关的教程 2023-07-23 13:32:19 +08:00
如何定位bug.md 更新了大量文档 2023-06-03 21:58:21 +08:00
必须做&禁止做.md 重新组织了说明文档分类,添加了VSCode自定义入门教程,编写了部分Readme文档 2023-07-24 23:29:13 +08:00
架构介绍与开发准则.md 修改文档结构,更新TODO list 2023-07-23 23:04:44 +08:00
让VSCode成为更称手的IDE.md 重新组织了说明文档分类,添加了VSCode自定义入门教程,编写了部分Readme文档 2023-07-24 23:29:13 +08:00

README.md

YueLu2022/2023 EC basic_framework-dev

可能是最完整最详细最好的电控开源!

[TOC]

本框架设计参考了哈尔滨工业大学(深圳)南工骁🦅战队的EC_framework以及RoboMaster官方的RoboRTS-firmware。

基于basic_framework打造的C++进阶重构版本powerful_framework现已发布增加全新的消息交互机制和严格的跨任务数据读写保护采用了现代构建系统CMake+Ninja以追求极致的编译速度各种针对嵌入式的编译优化全开DIY程度进一步提升更有自定义CMSIS-DSP和Eigen等扩展库支持快来加入试用/和我们一起开发吧😋

架构

软件栈

多任务协作

设计思想

框架在结构上分为三层bsp/module/app。整体使用的设计模式是结构层级模式即每个“类”包含需要使用的底层“类”通过组装不同的基础模实现更强大的功能。而最顶层的app之间则通过pub-sub消息机制进行解耦,使得在编写代码时不会出现相互包含的情况。

pub-sub机制的体现以本仓库的app层为例包含了chassisgimbalshootcmd四个应用每个应用都对应了机器人上的不同模组。cmd应用负责从机器人控制信号来源遥控器/上位机/环境传感器)处获取信息并解析成各个执行单元的实际动作(电机/舵机/气缸/阀门等的扭矩/速度/位置/角度/开度等),并将此信息发布出去。chassis、gimbal、shoot等包含了执行单元的应用则订阅这些消息,并通过自己包含的子模块,调用它们的接口实现动作。

结构层级模式的体现以chassis应用为例chassis中包含了4个底盘电机模块。当chassis收到cmd应用的信息希望让底盘以1m/s的速度前进。chassis首先根据底盘的类型舵轮/麦克纳姆轮/全向轮/平衡底盘)以及对应的动力学/运动学解算函数计算得到每个电机的输目标输入值此时chassis将输入通过电机模块motor module的接口将设定值告知电机。而每个电机模块又有各自的PID计算模块和自身电流&速度&角度传感器的信息可以计算出最终需要的电流设定值。假设该电机使用CAN协议与电调通信则电机通过自身包含的CANInstancebsp_can提供用于和实际硬件交互电机模块将设定值电流值或其他指令按照通信协议组织在CAN报文中通过CANInstance提供的接口把最终控制数据发送给电调实现控制闭环。可以看到包含关系为chassis∈motor∈bspcan

有了上面的大体认知,我们分别介绍框架的三层结构。

  • bsp即板级支持包提供对开发板外设的软件抽象让module层能使用和硬件无关的接口由bsp提供进行数据处理与交互。bsp层和ST的HAL为强耦合与硬件直接绑定。若要向其他的ST芯片移植基本不需要修改bsp层若是其他单片机则建议保留接口设计,对接口调用进行重现实现。每一种外设的头文件中都定义了一个XXXInstancexxx为外设名其中包含了使用该外设所需要的所有数据如发送/接收的数据长度id如果有父指针指向module实例的指针用于回调等。由于C没有class因此所有bsp的接口都需要传入一个额外的参数XXXInstance*用于实现c++的this指针以区分具体是哪一个实例调用了接口。
  • module即模块层,包括了需要开发板硬件外设支持的(一般用于通信)真实硬件模组如电机、舵机、imu、测距传感器以及通过

执行顺序与数据流

开发工具

介绍完整的工作流。

工具链

强烈推荐使用arm-gnu工具链进行编译arm-none-eabi-xxx

官方下载地址:Arm GNU Toolchain Downloads Arm Developer

我们更推荐使用Msys2进行库和开发工具管理关于如何使用Msys2请参考如何使用本框架

仍然支持使用arm-cc工具链即keil默认的工具链进行开发在cubemx初始化时生成MDK项目即可然后再手动添加basic_framework的所有头文件和源文件。但非常不建议这样做arm-cc仅支持单线程编译且编译优化选项远不如arm-gnu多自定义程度同样不比。若你一定要这样做则可以在VSCode中安装keil assistant插件。

IDE?

使用VSCode作为“IDE”。需要的插件支持均已经在VSCode+Ozone使用方法.md中给出。通过VSCode强大的插件系统、language server以及代码补全高亮助力效率倍增。编译则使用集成的task进行还可以将开发环境终端加入VSCode进一步提升体验。基本的调试如变量&寄存器查看均已在插件中提供支持,launch.json可以进行高自由度的自定义。

Git集成与额外插件补充让版本管理和协作从未如此简单,live share把你的伙伴们聚在一起集思广益一同对抗困难的bug。更多特性和开发技巧请参考"如何使用本框架"章节。

不论如何请不要使用KEIL作为你的代码编辑器。

调试和性能分析

  • 基础的调试可以在VSCode中完成。cortex-debug插件的最新版本已经支持多个gdb-serverjlink/stlink/openocd/pyocd的live watch动态变量监视和变量示波器可视化。若不是有特别的需求请勿使用串口调试器

  • 有高速变量查看和数据记录、多路数据可视化的需求如进行pid参数整定、查找难以定位的bug使用Segger Ozone

  • FreeMaster也可以作为调试的备选项。

  • 基本的、日常性能分析可以通过bsp_dwt完成。若要分析关于任务运行和每个函数执行的详细信息和时间,推荐使用Segger Systemviewer

如何使用本框架

后续计划