概述
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 线程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复