AT32 F435简介4/N ChibiOS porting plan

news2024/9/23 11:18:08

AT32 F435简介4/N ChibiOS porting plan

  • 1. 源由
  • 2. 框图
  • 3. Makefile
  • 4. 分析
    • 4.1 Startup Code
    • 4.2 RT Port Layer
    • 4.3 HAL Board Layer
    • 4.4 HAL Port Layer
  • 5. 总结
  • 6. 参考资料

1. 源由

  1. 对比STM32 F405进行AT32 F435 MCU的资料研读,期望获取更多差异化信息;
  2. 配合ChibiOS的porting工作,有理有据;
  3. 寻找AT32 F435的一些亮点功能和特性;

2. 框图

ChibiOS总体框图

根据ChibiOS总体框图,整个ChibiOS移植涉及以下几个部分:

  • Startup Code: ./os/common/startup
  • RT Port Layer: ./os/common/ports
  • HAL Board Layer: ./os/hal/boards
  • HAL Port Layer: ./os/hal/ports

3. Makefile

以STM32H743为例,分析如下:

Makefile
 ├──> [Licensing files]
 │   └──> $(CHIBIOS)/os/license/license.mk
 ├──> [Startup files]
 │   └──> $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32h7xx.mk
 ├──> [HAL-OSAL files]
 │   ├──> $(CHIBIOS)/os/hal/hal.mk
 │   ├──> $(CHIBIOS)/os/hal/ports/STM32/STM32H7xx/platform.mk
 │   ├──> $(CHIBIOS)/os/hal/boards/ST_NUCLEO144_H743ZI/board.mk
 │   └──> $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk
 ├──> [RTOS files]
 │   ├──> $(CHIBIOS)/os/rt/rt.mk
 │   └──> $(CHIBIOS)/os/common/ports/ARMv7-M/compilers/GCC/mk/port.mk
 ├──> [Auto-build files in ./source recursively.]
 │   └──> $(CHIBIOS)/tools/mk/autobuild.mk
 ├──> [Other files]
 │   ├──> $(CHIBIOS)/os/test/test.mk
 │   ├──> $(CHIBIOS)/test/rt/rt_test.mk
 │   └──> $(CHIBIOS)/test/oslib/oslib_test.mk
 ├──> $(STARTUPLD)/STM32H743xI.ld
 ├──> $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/rules.mk
 └──> $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/arm-none-eabi.mk

4. 分析

接下来结合2/3章节,分析移植ChibiOS涉及的内容:

4.1 Startup Code

$(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32h7xx.mk内容包含:

# List of the ChibiOS generic STM32H7xx startup and CMSIS files.
STARTUPSRC = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/crt1.c
          
STARTUPASM = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/crt0_v7m.S \
             $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/vectors.S

STARTUPINC = $(CHIBIOS)/os/common/portability/GCC \
             $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC \
             $(CHIBIOS)/os/common/startup/ARMCMx/devices/STM32H7xx \
             $(CHIBIOS)/os/common/ext/ARM/CMSIS/Core/Include \
             $(CHIBIOS)/os/common/ext/ST/STM32H7xx

STARTUPLD  = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/ld

# Shared variables
ALLXASMSRC += $(STARTUPASM)
ALLCSRC    += $(STARTUPSRC)
ALLINC     += $(STARTUPINC)
  • 启动代码定义,详见:
$(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32h7xx.mk
 ├──> [ARMCMx_GCC_STARTUP]
 │   └──> $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/crt1.c
 ├──> [ARMCMx_GCC_STARTUP_V7M]
 │   └──> $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/crt0_v7m.S
 └──> [ARMCMx_GCC_VECTORS Cortex-Mx Interrupt Vectors]
     └──> $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/vectors.S
  • 地址符号定义,详见:
$(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32h7xx.mk
 ├──> $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/ld/rules_stacks.ld
 ├──> $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/ld/rules_code.ld
 ├──> $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/ld/rules_data.ld
 └──> $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/ld/rules_memory.ld

4.2 RT Port Layer

$(CHIBIOS)/os/common/ports/ARMv7-M/compilers/GCC/mk/port.mk内容包含:

# List of the ChibiOS/RT ARMv7M generic port files.
PORTSRC = $(CHIBIOS)/os/common/ports/ARMv7-M/chcore.c
          
PORTASM = $(CHIBIOS)/os/common/ports/ARMv7-M/compilers/GCC/chcoreasm.S

PORTINC = $(CHIBIOS)/os/common/portability/GCC \
          $(CHIBIOS)/os/common/ports/ARM-common \
          $(CHIBIOS)/os/common/ports/ARMv7-M

# Shared variables
ALLXASMSRC += $(PORTASM)
ALLCSRC    += $(PORTSRC)
ALLINC     += $(PORTINC)
  • $(CHIBIOS)/os/common/ports/ARMv7-M/compilers/GCC/chcoreasm.S代码定义:

a) __port_switch
b) __port_thread_start
c) __port_switch_from_isr

  • $(CHIBIOS)/os/common/ports/ARMv7-M/chcore.c代码定义:

a) SVC_Handler
b) PendSV_Handler
c) port_init
d) __port_set_region
e) __port_irq_epilogue

4.3 HAL Board Layer

$(CHIBIOS)/os/hal/boards/ST_NUCLEO144_H743ZI/board.mk内容包含:

# List of all the board related files.
BOARDSRC = $(CHIBIOS)/os/hal/boards/ST_NUCLEO144_H743ZI/board.c

# Required include directories
BOARDINC = $(CHIBIOS)/os/hal/boards/ST_NUCLEO144_H743ZI

# Shared variables
ALLCSRC += $(BOARDSRC)
ALLINC  += $(BOARDINC)

$(CHIBIOS)/os/hal/boards/ST_NUCLEO144_H743ZI/board.c代码定义:

a) gpio_init
b) stm32_gpio_init
c) __early_init
d) sdc_lld_is_card_inserted
e) sdc_lld_is_write_protected
f) mmc_lld_is_card_inserted
g) mmc_lld_is_write_protected
h) boardInit

4.4 HAL Port Layer

$(CHIBIOS)/os/hal/ports/STM32/STM32H7xx/platform.mk内容包含:

# Required platform files.
PLATFORMSRC := $(CHIBIOS)/os/hal/ports/common/ARMCMx/nvic.c \
               $(CHIBIOS)/os/hal/ports/STM32/STM32H7xx/stm32_isr.c \
               $(CHIBIOS)/os/hal/ports/STM32/STM32H7xx/hal_lld.c

# Required include directories.
PLATFORMINC := $(CHIBIOS)/os/hal/ports/common/ARMCMx \
               $(CHIBIOS)/os/hal/ports/STM32/STM32H7xx

# Optional platform files.
ifeq ($(USE_SMART_BUILD),yes)

# Configuration files directory
ifeq ($(HALCONFDIR),)
  ifeq ($(CONFDIR),)
    HALCONFDIR = .
  else
    HALCONFDIR := $(CONFDIR)
  endif
endif

HALCONF := $(strip $(shell cat $(HALCONFDIR)/halconf.h | egrep -e "\#define"))

else
endif

# Drivers compatible with the platform.
include $(CHIBIOS)/os/hal/ports/STM32/LLD/ADCv4/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/BDMAv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/CRYPv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/DACv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/DMAv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/EXTIv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/FDCANv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/GPIOv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/I2Cv3/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/MACv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/MDMAv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/OTGv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/QUADSPIv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SDMMCv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SPIv3/driver_v2.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/RNGv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/RTCv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SYSTICKv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/TIMv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/USARTv3/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/xWDGv1/driver.mk

# Shared variables
ALLCSRC += $(PLATFORMSRC)
ALLINC  += $(PLATFORMINC)
  • 平台移植部分:

a) $(CHIBIOS)/os/hal/ports/common/ARMCMx/nvic.c
b) $(CHIBIOS)/os/hal/ports/STM32/STM32H7xx/stm32_isr.c
c) $(CHIBIOS)/os/hal/ports/STM32/STM32H7xx/hal_lld.c

  • 接口移植部分:

a) $(CHIBIOS)/os/hal/ports/STM32/LLD/ADCv4/driver.mk
b) $(CHIBIOS)/os/hal/ports/STM32/LLD/BDMAv1/driver.mk
c) $(CHIBIOS)/os/hal/ports/STM32/LLD/CRYPv1/driver.mk
d) $(CHIBIOS)/os/hal/ports/STM32/LLD/DACv1/driver.mk
e) $(CHIBIOS)/os/hal/ports/STM32/LLD/DMAv2/driver.mk
f) $(CHIBIOS)/os/hal/ports/STM32/LLD/EXTIv1/driver.mk
g) $(CHIBIOS)/os/hal/ports/STM32/LLD/FDCANv1/driver.mk
h) $(CHIBIOS)/os/hal/ports/STM32/LLD/GPIOv2/driver.mk
i) $(CHIBIOS)/os/hal/ports/STM32/LLD/I2Cv3/driver.mk
j) $(CHIBIOS)/os/hal/ports/STM32/LLD/MACv2/driver.mk
k) $(CHIBIOS)/os/hal/ports/STM32/LLD/MDMAv1/driver.mk
l) $(CHIBIOS)/os/hal/ports/STM32/LLD/OTGv1/driver.mk
m) $(CHIBIOS)/os/hal/ports/STM32/LLD/QUADSPIv2/driver.mk
n) $(CHIBIOS)/os/hal/ports/STM32/LLD/SDMMCv2/driver.mk
o) $(CHIBIOS)/os/hal/ports/STM32/LLD/SPIv3/driver_v2.mk
p) $(CHIBIOS)/os/hal/ports/STM32/LLD/RNGv1/driver.mk
q) $(CHIBIOS)/os/hal/ports/STM32/LLD/RTCv2/driver.mk
r) $(CHIBIOS)/os/hal/ports/STM32/LLD/SYSTICKv1/driver.mk
s) $(CHIBIOS)/os/hal/ports/STM32/LLD/TIMv1/driver.mk
t) $(CHIBIOS)/os/hal/ports/STM32/LLD/USARTv3/driver.mk
u) $(CHIBIOS)/os/hal/ports/STM32/LLD/xWDGv1/driver.mk

5. 总结

通过分析ChibiOS总体框图和Makefile,初步分析移植ChibiOS到特定的MCU上,需要完成的工作量。

通过科学合理安排:a) 任务优先级;b) 移植工作切片/分割;可逐步推进、完成相应移植工作。

6. 参考资料

【1】Ardupilot开源飞控之ChibiOS简介
【2】ARTERY AT32F435
【3】ST STM32F405/415

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1324976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 架构 - 组件化

一、概念 组件化是对单个功能进行开发,使得功能可以复用。将多个功能组合起来就是一个业务模块,因此去除了模块间的耦合,使得按业务划分的模块成了可单独运行的业务组件。(一定程度上的独立,还是依附于整个项目中&…

Python 多维数组详解(numpy)

文章目录 1 概述1.1 numpy 简介1.2 ndarray 简介 2 数组操作2.1 创建数组:array()2.2 裁切数组:切片2.3 拼接数组:concatenate()2.4 拆分数组:array_split()2.5 改变数组形状:reshape() 3 元素操作3.1 获取元素&#x…

uint29传输格式

前言 不知道谁想出来的。 反正我是想不到。 我看网上也没人讲这个。 写篇博客帮一下素未谋面的网友。 uint29 本质上是网络传输的时候,借用至多4字节Bytes,表达29位的无符号整数。 读8位数字,判断小于128? 是的话,返回末7位…

一文读懂PMP项目管理

PMP项目管理是什么 PMP(Project Management Professional)指项目管理专业人员资格认证,由美国项目管理协会(Project Management Institute,简称PMI)发起,目前已在全球206个国家和地区进行认证&…

Axure中继器的基本使用

介绍中继器 在 Axure 中,中继器是一种交互设计元素,用于在不同页面之间传递数据或触发特定的事件。它可以帮助模拟真实的用户交互流程和页面之间的传递逻辑,继承关系用于描述两个元件之间的父子关系。通过使用继承关系,您可以创建…

实现高效、透明、公正的采购寻源——鸿鹄电子招投标系统

在数字化时代,企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台,涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等…

如何将图片转为PDF

问题描述:如何将图片转为PDF,有时需要将纸质文档扫描成PDF,然后上传到网上。 解决办法:平时使用的方法是将图片插入到word文件中,然后将图片设置为浮于文字下方,然后调整图片的大小,铺满整个wo…

米家APP如何转让家庭创建者里面设备所有权

环境: 米家APPv8.11.203 问题描述: 米家APP如何转让家庭创建者里面设备所有权,需要添加到HA里面 解决方案: 1.登入创建者账户先把家庭共享给要转让得账户,权限选中管理员 2.登入要转入账户,先加入创建者…

深入学习《大学计算机》系列之第1章 1.4节——从二进制起源窥见的奥秘

一.欢迎来到我的酒馆 第1章 1.4节,从二进制起源窥见的奥秘。 目录 一.欢迎来到我的酒馆二.二进制的起源1.关于莱布尼茨2.莱布尼茨和牛顿的恩怨情仇 二.二进制的起源 本节内容属于知识拓展,通过讲解几个小故事,向大家介绍二进制的起源。 1.关…

为你自己学laravel - 15 - model的更新和删除

为你自己学laravel。 model的部分。 这一次讲解的是model当中怎么从数据库当中更新数据和删除数据。 先从数据库当中抓出来资料。 当然我们是使用php artisan tinker进入到终端机。 我们的做法是想要将available这个栏位修改成为true。 第一种更新方法 上面我们就是修改了对…

OpenHarmony开发环境快速搭建(无需命令行)

一. 搭建Windows环境 在嵌入式开发中,很多开发者习惯于使用Windows进行代码的编辑,比如使用Windows的Visual Studio Code进行OpenHarmony代码的开发。但当前阶段,大部分的开发板源码还不支持在Windows环境下进行编译,如Hi3861、H…

金三银四精选面试题系列

Java中有哪几种方式来创建线程执行任务? 1. 继承Thread类 public class ZhouyuThread extends Thread{public static void main(String[] args) {ZhouyuThread thread new ZhouyuThread();thread.start();}Overridepublic void run() {System.out.println("h…

MyBatis进行CRUD中添加数据实现主键回填

文章目录 MyBatis进行CRUD中添加数据实现主键回填1、创建一个mybatis项目2、实现添加数据时主键回填在MyBatisTest.java中添加下面方法在UserMapper.java中添加对应的属性在UserMapper.xml中添加sql语句如下运行结果如下(取消commit方法注释后就不会出现Rolling back回滚进行真…

<长篇文章!!>数据结构与算法的重要知识点与概要总结 ( •̀ ω •́ )✧✧临近考试和查漏补缺的小伙伴看这一篇就都懂啦~

目录 一、数据结构概论二、算法概论三、线性表四、栈五、队列六、串七、多维数组与矩阵八、广义表九、树与二叉树十、图 一、数据结构概论 1、数据元素和数据项 数据由数据元素组成,即数据元素是数据的基本单位,而数据元素又由若干个数据项组成&#xf…

PHP-Xlswriter高性能导出Excel

使用背景 使用传统的PHPExcel导出效率太慢,并且资源占用高,数据量大的情况,会导致服务占用大量的资源,从而导致生产意味,再三思索后,决定使用其他高效率的导出方式 PHP-Xlswriter PHPExcel 因为内存消耗过…

vue中的侦听器和组件之间的通信

目录 一、侦听器 监听基本数据类型: 监听引用数据类型: 计算属性和watch区别? 二、组件通信/传值方式 1.父子组件传值 父组件给子组件传值: (1)props (2)provide inject &…

Android定制ROM简介

Android定制ROM简介 这篇文章是为对自定义ROM、AOSP等词汇不太熟悉的技术爱好者和好奇的人写的。我希望通过向您介绍这个世界来开始博客写作。 在我们将注意力转向定制ROM之前,让我们先了解一些基础知识。 什么是操作系统? 维基百科对此的定义简洁而…

Python 常用模块time和datetime

【一】python中表示时间的三种方式 import time# 时间戳 res time.time() print(res, type(res)) # 1703055531.8492236 <class float># 格式化的时间字符串 res time.strftime(%Y-%m-%d %X) print(res, type(res)) # 2023-12-20 14:58:51 <class str># 结构化的…

《数据结构、算法与应用C++语言描述》- 最小赢者树模板的C++实现

赢者树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_30winnerTree 比赛规则 假定有 n 个选手参加一次网球比赛。比赛规则是“突然死亡法”(sudden-death mode)&#xff1a;一名选手只要输掉一场球&#xff0c;就被淘汰。一对一对…

openstack-neutron服务安装

文章目录 网络服务概述概念主机网络 安装并配置控制节点先决条件完成下面的步骤以创建数据库&#xff1a;用数据库连接客户端以 root 用户连接到数据库服务器&#xff1a;创建 neutron 数据库:对neutron 数据库授予合适的访问权限&#xff0c;使用合适的密码替换NEUTRON_DBPASS…