APM 学习 6 --- ArduPilot 线程

ArduPilot的线程处理取决于主板,包括定时器回调、HAL特定线程、驱动程序特定线程等。定时器回调以1kHz频率执行,HAL线程如UART、计时器和IO线程在支持线程的平台上运行。驱动程序线程处理异步任务,如Linux端口的ToneAlarm。区分ArduPilot和平台驱动程序,以便在不同硬件上运行。平台特定线程如PX4的idle、init等任务。AP_Scheduler系统用于在主无人机线程中分配任务,确保任务执行的高效和安全。
摘要由CSDN通过智能技术生成

ArduPilot 学习之路 - 6,线程

英文原文地址:https://ardupilot.org/dev/docs/learning-ardupilot-threading.html

理解 ArduPilot 线程

        线程时 ArduPilot 运行的核心概念,setup() / loop() 结构来源于 Arduino,使得 ArduPilot 系统看起来更像是单线程系统,但事实并非如此。

        ArduPilot 中的线程处理方法取决于其所运行的主板。有些主板(例如APM1和APM2)不支持线程,因此可以使用简单的计时器和回调。某些主板(PX4和Linux)支持具有实时优先级的丰富Posix线程模型,ArduPilot广泛使用了这些模型。

ArduPilot 线程主要涉及到如下关键概念:

  • The timer callbacks                  定时器回调
  • HAL specific threads                HAL特定线程
  • driver specific threads              驱动程序特定线程
  • ardupilot drivers versus platform driversardupilot            驱动程序与平台驱动程序
  • platform specific threads and tasks                                 平台特定的线程和任务
  • the AP_Scheduler system                                               AP_调度系统
  • semaphores                                                                     信号量
  • lockless data structures                                                   无锁数据结构

1,定时器回调(The timer callbacks)

       每个平台在 AP_HAL 中都提供一个1kHz计时器。 ArduPilot 中的任何代码都可以注册一个计时器功能,然后以1kHz的频率调用该功能。所有已注册的计时器功能均被依次调用。这种机制很原始,但是它具备很强的移植性,而且非常有用。您可以通过调用 hal.scheduler-> register_timer_process()来注册计时器回调,如下所示:

      该示例来自MS5611气压计驱动程序。 AP_HAL_MEMBERPROC()宏提供了一种将C ++成员函数封装为回调参数的方法。

      当一段代码希望某件事发生在低于1kHz的频率时,它应该保持其自己的 “ last_ Called” 变量,并在没有足够时间的情况下立即返回。您可以使用 hal.scheduler-> millis()和 hal.scheduler-> micros()函数来获取自启动以来的时间,该时间以毫秒和微秒为单位。

      现在,您应该去修改一个现有的示例(或创建一个新的示例)并添加一个计时器回调。使计时器递增一个计数器,然后在loop()函数中每秒打印一次计数器的值。修改函数,使其每25毫秒递增一次计数器。

2,HAL特定线程

   在支持实线程的平台上,该平台的 AP_HAL 将创建多个线程以支持基本操作。例如在Pixhawk上创建以下特定于HAL的线程:

  • UART线程,用于读写UART(和
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值