#[cfg(all(feature = "arch-32bit", feature = "arch-64bit"))]
compile_error!("Cannot enable both arch-32bit and arch-64bit");
#[cfg(not(any(feature = "arch-32bit", feature = "arch-64bit")))]
compile_error!("Must enable either arch-32bit or arch-64bit");
#[cfg(all(feature = "tick-32bit", feature = "tick-64bit"))]
compile_error!("Cannot enable multiple tick width features");
#[cfg(not(any(feature = "tick-32bit", feature = "tick-64bit")))]
compile_error!("Must enable one of: tick-32bit, tick-64bit");
#[cfg(feature = "arch-32bit")]
pub type BaseType_t = i32;
#[cfg(all(feature = "arch-64bit", not(feature = "arch-32bit")))]
pub type BaseType_t = i64;
#[cfg(not(any(feature = "arch-32bit", feature = "arch-64bit")))]
pub type BaseType_t = i32;
#[cfg(feature = "arch-32bit")]
pub type UBaseType_t = u32;
#[cfg(all(feature = "arch-64bit", not(feature = "arch-32bit")))]
pub type UBaseType_t = u64;
#[cfg(not(any(feature = "arch-32bit", feature = "arch-64bit")))]
pub type UBaseType_t = u32;
#[cfg(feature = "arch-32bit")]
pub type StackType_t = u32;
#[cfg(all(feature = "arch-64bit", not(feature = "arch-32bit")))]
pub type StackType_t = u64;
#[cfg(not(any(feature = "arch-32bit", feature = "arch-64bit")))]
pub type StackType_t = u32;
#[cfg(feature = "tick-32bit")]
pub type TickType_t = u32;
#[cfg(feature = "tick-32bit")]
pub const portMAX_DELAY: TickType_t = 0xFFFF_FFFF;
#[cfg(all(feature = "tick-64bit", not(feature = "tick-32bit")))]
pub type TickType_t = u64;
#[cfg(all(feature = "tick-64bit", not(feature = "tick-32bit")))]
pub const portMAX_DELAY: TickType_t = 0xFFFF_FFFF_FFFF_FFFF;
#[cfg(not(any(feature = "tick-32bit", feature = "tick-64bit")))]
pub type TickType_t = u32;
#[cfg(not(any(feature = "tick-32bit", feature = "tick-64bit")))]
pub const portMAX_DELAY: TickType_t = 0xFFFF_FFFF;
pub const TICK_TYPE_WIDTH_32_BITS: u8 = 1;
pub const TICK_TYPE_WIDTH_64_BITS: u8 = 2;
#[cfg(feature = "tick-32bit")]
pub const configTICK_TYPE_WIDTH_IN_BITS: u8 = TICK_TYPE_WIDTH_32_BITS;
#[cfg(all(feature = "tick-64bit", not(feature = "tick-32bit")))]
pub const configTICK_TYPE_WIDTH_IN_BITS: u8 = TICK_TYPE_WIDTH_64_BITS;
#[cfg(not(any(feature = "tick-32bit", feature = "tick-64bit")))]
pub const configTICK_TYPE_WIDTH_IN_BITS: u8 = TICK_TYPE_WIDTH_32_BITS;
pub const pdFALSE: BaseType_t = 0;
pub const pdTRUE: BaseType_t = 1;
pub const pdPASS: BaseType_t = pdTRUE;
pub const pdFAIL: BaseType_t = pdFALSE;
pub const errQUEUE_EMPTY: BaseType_t = 0;
pub const errQUEUE_FULL: BaseType_t = 0;
pub const errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY: BaseType_t = -1;
pub const errQUEUE_BLOCKED: BaseType_t = -4;
pub const errQUEUE_YIELD: BaseType_t = -5;
#[cfg(feature = "tick-32bit")]
pub const pdINTEGRITY_CHECK_VALUE: TickType_t = 0x5A5A_5A5A;
#[cfg(all(feature = "tick-64bit", not(feature = "tick-32bit")))]
pub const pdINTEGRITY_CHECK_VALUE: TickType_t = 0x5A5A_5A5A_5A5A_5A5A;
#[cfg(not(any(feature = "tick-32bit", feature = "tick-64bit")))]
pub const pdINTEGRITY_CHECK_VALUE: TickType_t = 0x5A5A_5A5A;
pub type TaskFunction_t = extern "C" fn(*mut core::ffi::c_void);
#[inline(always)]
pub const fn pdMS_TO_TICKS(xTimeInMs: TickType_t) -> TickType_t {
let ticks = (xTimeInMs as u64).wrapping_mul(crate::config::configTICK_RATE_HZ as u64) / 1000u64;
ticks as TickType_t
}
#[inline(always)]
pub const fn milliseconds_to_ticks_checked(xTimeInMs: u64) -> Option<TickType_t> {
let ticks = (xTimeInMs as u128 * crate::config::configTICK_RATE_HZ as u128) / 1000u128;
if ticks > portMAX_DELAY as u128 {
None
} else {
Some(ticks as TickType_t)
}
}
#[inline(always)]
pub const fn pdTICKS_TO_MS(xTimeInTicks: TickType_t) -> TickType_t {
let milliseconds =
(xTimeInTicks as u64).wrapping_mul(1000u64) / crate::config::configTICK_RATE_HZ as u64;
milliseconds as TickType_t
}
pub type TaskHandle_t = *mut core::ffi::c_void;
pub type TimerHandle_t = *mut core::ffi::c_void;
pub type EventGroupHandle_t = *mut core::ffi::c_void;
pub type StreamBufferHandle_t = *mut core::ffi::c_void;
pub type MessageBufferHandle_t = StreamBufferHandle_t;
#[cfg(feature = "tickless-idle")]
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum eSleepModeStatus {
eAbortSleep = 0,
eStandardSleep = 1,
#[cfg(feature = "task-suspend")]
eNoTasksWaitingTimeout = 2,
}
pub const NULL_HANDLE: *mut core::ffi::c_void = core::ptr::null_mut();
#[repr(C)]
#[derive(Clone)]
pub struct TaskStatus_t {
pub xHandle: TaskHandle_t,
pub pcTaskName: *const u8,
pub xTaskNumber: UBaseType_t,
pub eCurrentState: u8, pub uxCurrentPriority: UBaseType_t,
pub uxBasePriority: UBaseType_t,
pub ulRunTimeCounter: u32,
pub pxStackBase: *mut StackType_t,
pub usStackHighWaterMark: u16,
}
impl TaskStatus_t {
pub const fn new() -> Self {
TaskStatus_t {
xHandle: core::ptr::null_mut(),
pcTaskName: core::ptr::null(),
xTaskNumber: 0,
eCurrentState: 0,
uxCurrentPriority: 0,
uxBasePriority: 0,
ulRunTimeCounter: 0,
pxStackBase: core::ptr::null_mut(),
usStackHighWaterMark: 0,
}
}
}
#[cfg(test)]
mod conversion_tests {
use super::*;
#[test]
fn wide_millisecond_conversion_does_not_narrow_before_scaling() {
assert_eq!(milliseconds_to_ticks_checked(1_000), Some(1_000));
assert_eq!(
milliseconds_to_ticks_checked(portMAX_DELAY as u64),
Some(portMAX_DELAY)
);
}
#[test]
fn checked_conversion_rejects_unrepresentable_durations() {
#[cfg(not(feature = "tick-64bit"))]
assert_eq!(milliseconds_to_ticks_checked(u64::MAX), None);
assert_eq!(pdMS_TO_TICKS(portMAX_DELAY), portMAX_DELAY);
}
}