ArduPilot 第2章 任务调度

本文详细解析了Ardupilot中任务调度的工作原理,包括如何通过`run`函数调用任务,以及如何通过定时器确保任务按照预设频率执行。特别关注了执行频率的计算逻辑和时间限制机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


参考文献
https://blog.csdn.net/guanzhiyuan1994/article/details/51327451

前言

本文主要介绍Ardupilot任务调度,Ardupilot通过定时器定时调度一系列任务实现任务调度

一、定义任务

Ardupilot程序与arduino的形式类似,包含一个setup()函数与一个loop()函数。setup()只执行一次,loop()函数在setup()函数执行后循环执行。
为了执行任务首先要将任务定义出来。在ArduCopter.cpp程序中,首先在 AP_Scheduler::Task Copter::scheduler_tasks[]中定义了一系列要完成的任务。
第一个参数是要调用的函数,
第二个参数通过定义tick的个数(一个tick为1/400Hz=2.5ms)来定义执行的频率。
第三个参数为该任务的最大执行时间,这在后面scheduler.run(time_available)函数中将用来判断是否要继续执行该任务。

请添加图片描述

二、任务调度

1.run函数调用

代码如下(示例):
这些AP_Scheduler::Task Copter::scheduler_tasks[]数组中定义的任务将在loop()

<think>嗯,用户现在问的是为了学习ArduPilot应该先学STM32还是Arduino。之前用户已经询问过ArduPilot是否基于Arduino,而我的回答指出虽然早期有关联,但现在已经独立了。所以现在用户可能是在考虑学习路径,需要明确哪个平台更适合作为基础。 首先,用户可能对ArduPilot的架构不太熟悉,所以需要解释清楚为什么推荐STM32而不是Arduino。虽然用户之前的问题已经澄清了ArduPilot不再基于Arduino,但可能需要进一步说明两者的区别。 接下来,用户可能是一个刚入门的开发者或者爱好者,想要进入无人机飞控领域,但不知道从哪里开始。他们可能对嵌入式系统有一定的兴趣,但不确定该选择哪个硬件平台。需要考虑到他们的现有知识水平,是否具备C/C++基础,或者是否需要从更简单的Arduino入手。 然后,分析STM32和Arduino的优缺点。Arduino适合快速原型开发,有大量库和社区支持,容易上手,但抽象层次高,可能不利于深入理解底层硬件。而STM32更接近ArduPilot的实际开发环境,涉及实时操作系统、硬件抽象层等,但学习曲线较陡峭。 需要确定用户的最终目标是否是深入参与ArduPilot开发,还是只是了解无人机飞控的基本概念。如果是前者,STM32和实时系统更为重要;如果是后者,Arduino可能足够入门,但可能无法满足后续需求。 另外,用户可能没有考虑到中间的学习路径,是否需要分阶段学习。比如,先通过Arduino快速入门,再转向STM32。但根据ArduPilot的现状,直接学习STM32可能更有效率,避免重复学习。 还要考虑资源问题,用户是否有STM32开发板,或者是否愿意投资购买。Arduino板子通常更便宜且普及,但STM32开发板如Pixhawk可能更贴近实际应用。 最后,综合之前的回答,强调ArduPilot当前使用的技术栈,如ChibiOS、HAL层、MAVLink等,这些都与STM32相关,而Arduino的知识在此处应用有限。因此,推荐用户学习STM32及相关技术,同时补充必要的嵌入式系统和实时操作系统知识。</think>--- ### **结论** **优先学习STM32,但需结合嵌入式系统知识**。 ArduPilot的现代架构与STM32生态高度关联,但单纯学习STM32或Arduino均不足够,需聚焦以下方向: --- ### **1. 为什么STM32比Arduino更重要?** #### **硬件与性能需求** - **ArduPilot的当前硬件平台**: - 主控芯片:STM32系列(如F4/F7/H7),主频200MHz+,支持硬件浮点运算。 - Arduino开发板(如Mega 2560)性能不足(16MHz主频,无FPU),无法满足实时控制需求。 - **关键能力要求**: - 直接寄存器操作(如配置定时器PWM输出)。 - 中断优先级管理(如传感器数据的高频中断读取)。 #### **软件架构差异** - **Arduino局限**: - 单线程轮询(`loop()`函数),无法实现多任务实时调度。 - 硬件抽象层(HAL)高度封装,难以理解底层驱动原理。 - **ArduPilot核心依赖**: - **实时操作系统(RTOS)**:如ChibiOS,需掌握任务创建、同步机制(信号量/互斥锁)。 - **硬件抽象层(AP_HAL)**:需理解跨平台驱动设计(如SPI/I2C/CAN的通用接口)。 --- ### **2. 具体学习路径建议** #### **第一阶段:STM32基础** 1. **硬件层**: - 学习STM32CubeMX配置工具,掌握时钟树、GPIO、定时器、DMA配置。 - 实践案例:用TIM1生成6路PWM信号控制电机(需计算重载值ARR与占空比CCR)。 2. **开发环境**: - 工具链:Keil MDK或STM32CubeIDE(基于GCC)。 - 调试技能:SWD/JTAG调试、逻辑分析仪抓取时序。 3. **关键代码示例**: ```c // STM32 HAL库配置PWM输出(以TIM1为例) TIM_HandleTypeDef htim1; htim1.Instance = TIM1; htim1.Init.Prescaler = 84-1; // 84MHz主频,分频后1MHz htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 20000-1; // 20ms周期(50Hz) HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // 启动PWM输出 ``` #### **第二阶段:RTOS与ArduPilot相关技术** 1. **实时操作系统**: - 学习ChibiOS/RT或FreeRTOS,重点掌握: - 多线程任务调度(如创建导航、控制、通信线程)。 - 资源同步(信号量保护传感器数据队列)。 2. **ArduPilot代码实践**: - 从GitHub克隆代码库,编译Pixhawk固件: ```bash git clone https://github.com/ArduPilot/ardupilot ./ardupilot/Tools/environment_install/install-prereqs-ubuntu.sh ./waf configure --board Pixhawk4 ./waf copter ``` - 分析关键模块(如`libraries/AP_Math`中的姿态解算算法)。 #### **第三阶段:补充知识** - **通信协议**: - MAVLink协议(无人机专用,需解析`common.xml`消息定义)。 - CAN总线(用于分布式传感器扩展)。 - **控制理论**: - PID调参(参考`AP_PID`库的实现)。 - 卡尔曼滤波(如`AP_NavEKF3`中的状态估计)。 --- ### **3. 为什么不完全推荐Arduino?** - **适用场景错位**: - Arduino适合快速原型验证(如简单传感器读取),但无法支撑: - 高频率控制循环(ArduPilot要求400Hz以上)。 - 复杂导航算法(如EKF状态估计需要FPU加速)。 - **知识迁移局限性**: - Arduino的`digitalWrite()`等封装函数在ArduPilot中无直接对应(后者直接操作STM32寄存器)。 --- ### **4. 替代方案:折中学习路线** 若零基础且时间有限,可**分步过渡**: 1. **短期接触Arduino**(2-4周): - 目标:理解基础嵌入式概念(GPIO、串口通信)。 - 项目:用Arduino读取MPU6050数据并通过串口输出。 2. **快速转向STM32+RTOS**: - 使用STM32F4 Discovery开发板,尝试移植FreeRTOS并实现多任务。 --- ### **总结建议** - **核心方向**: - **重点投入STM32+RTOS**(占70%精力),**补充控制理论与通信协议**(占30%)。 - **避免误区**: - 不要停留在Arduino的“简单易用”层面,ArduPilot开发需直面底层复杂性。 通过此路径,可系统性掌握ArduPilot所需的硬件控制、实时系统、算法实现能力,而非仅停留在工具使用层面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值