ardupilot 系统时间见解

1. 无法使用usleep函数

usleep() 是 Unix 和 Linux 平台下的一个函数, 使用usleep函数会报错,即使引用了头文件<unistd.h>

undefined reference to `usleep'

ArduPilot 的任务调度是通过定时器定时调度一系列任务来实现的,它本身并没有直接设置休眠时间的具体方法

2. 使用任务调度延迟

一种常见的方法是使用相关的硬件模块,例如实时时钟(RTC)来控制设备的休眠和唤醒。
通过设置 RTC 的定时功能,在指定的时间间隔后唤醒设备。
另外,具体的实现方式还可能涉及到对设备代码的修改和调试。这需要一定的编程知识和对 ArduPilot 系统的了解。
可以使用以下两个函数获得usleep的效果,都是通过调度器来实现的

// 参数是uint16类型,最大为65535
hal.scheduler->delay(100);  //休眠100毫秒
hal.scheduler->delay_microseconds(1000) // 休眠1微秒

注意:

  1. 过度使用短时间的延迟可能会影响系统的实时性能,特别是在对时间敏感的任务中。
  2. 确保延迟的时间符合您的实际需求,避免不必要的等待。

ArduPilot 中的这种任务调度机制有助于确保系统的实时性和稳定性,使得不同的任务能够在合适的时间间隔内得到执行,同时避免某个任务占用过多时间而影响其他任务的执行。
如果某个函数执行时延迟超过2S, 程序就会中断,导致与地面站的连接断开

3.获取系统时间戳

pixhawk一般是没有RTC模块的,也无网络,获取实时时间并不可靠
但是pixhawk上电后会有个启动时间,可以通过计算时间差来获取相对时间
在ArduPilot中,micros()函数返回Arduino板开始运行当前程序时的微秒数。该数字在大约70分钟后溢出,即回到零。

uint32_t now = AP_HAL::micros(); // 单位微秒
uint32_t now = AP_HAL::millis(); //毫秒

在16MHz Arduino板(例如Duemilanove和Nano)上,此函数的分辨率为4微秒(即返回值总是4的倍数)。在8MHz Arduino板(例如LilyPad)上,此函数的分辨率为8微秒。
在进行时间比较或计算时,也需要考虑溢出的情况,可以使用无符号长整型进行减法运算,然后判断结果是否小于期望的时间间隔。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值