mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-08 00:48:30 -04:00
0ad53e53eb
This allows us to move a lot of delay handling from vehicle classes into HAL Scheduler. The most notable improvement is that it moves the detection of recursion into the Scheduler, out of each separate vehicle.
98 lines
2.9 KiB
C++
98 lines
2.9 KiB
C++
#pragma once
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <AP_Common/AP_Common.h>
|
|
|
|
#include "AP_HAL_Boards.h"
|
|
#include "AP_HAL_Namespace.h"
|
|
|
|
|
|
class AP_HAL::Scheduler {
|
|
public:
|
|
Scheduler() {}
|
|
virtual void init() = 0;
|
|
virtual void delay(uint16_t ms) = 0;
|
|
|
|
/*
|
|
delay for the given number of microseconds. This needs to be as
|
|
accurate as possible - preferably within 100 microseconds.
|
|
*/
|
|
virtual void delay_microseconds(uint16_t us) = 0;
|
|
|
|
/*
|
|
delay for the given number of microseconds. On supported
|
|
platforms this boosts the priority of the main thread for a
|
|
short time when the time completes. The aim is to ensure the
|
|
main thread runs at a higher priority than drivers for the start
|
|
of each loop
|
|
*/
|
|
virtual void delay_microseconds_boost(uint16_t us) { delay_microseconds(us); }
|
|
|
|
/*
|
|
end the priority boost from delay_microseconds_boost()
|
|
*/
|
|
virtual void boost_end(void) {}
|
|
|
|
// register a function to be called by the scheduler if it needs
|
|
// to sleep for more than min_time_ms
|
|
virtual void register_delay_callback(AP_HAL::Proc,
|
|
uint16_t min_time_ms);
|
|
// returns true if the Scheduler has called the delay callback
|
|
// function. If you are on the main thread that means your call
|
|
// stack has the scheduler on it somewhere.
|
|
virtual bool in_delay_callback() const { return _in_delay_callback; }
|
|
|
|
// register a high priority timer task
|
|
virtual void register_timer_process(AP_HAL::MemberProc) = 0;
|
|
|
|
// register a low priority IO task
|
|
virtual void register_io_process(AP_HAL::MemberProc) = 0;
|
|
|
|
// suspend and resume both timer and IO processes
|
|
virtual void suspend_timer_procs() = 0;
|
|
virtual void resume_timer_procs() = 0;
|
|
|
|
virtual void register_timer_failsafe(AP_HAL::Proc,
|
|
uint32_t period_us) = 0;
|
|
|
|
virtual void system_initialized() = 0;
|
|
|
|
virtual void reboot(bool hold_in_bootloader) = 0;
|
|
|
|
/**
|
|
optional function to stop clock at a given time, used by log replay
|
|
*/
|
|
virtual void stop_clock(uint64_t time_usec) {}
|
|
|
|
virtual bool in_main_thread() const = 0;
|
|
|
|
virtual void create_uavcan_thread() {};
|
|
|
|
/*
|
|
disable interrupts and return a context that can be used to
|
|
restore the interrupt state. This can be used to protect
|
|
critical regions
|
|
|
|
Warning: may not be implemented on all HALs
|
|
*/
|
|
virtual void *disable_interrupts_save(void) { return nullptr; }
|
|
|
|
/*
|
|
restore interrupt state from disable_interrupts_save()
|
|
*/
|
|
virtual void restore_interrupts(void *) {}
|
|
|
|
protected:
|
|
|
|
// called by subclasses when they need to delay for some time
|
|
virtual void call_delay_cb();
|
|
uint16_t _min_delay_cb_ms;
|
|
|
|
private:
|
|
|
|
AP_HAL::Proc _delay_cb;
|
|
bool _in_delay_callback : 1;
|
|
|
|
};
|