我是靠谱客的博主 愉快星星,最近开发中收集的这篇文章主要介绍APM 学习 6 --- ArduPilot 线程理解 ArduPilot 线程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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(和USB)
  • 计时器线程,支持上述

最后

以上就是愉快星星为你收集整理的APM 学习 6 --- ArduPilot 线程理解 ArduPilot 线程的全部内容,希望文章能够帮你解决APM 学习 6 --- ArduPilot 线程理解 ArduPilot 线程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部