diff --git a/freertos-rust/src/freertos/shim.c b/freertos-rust/src/freertos/shim.c index c921e6d..b86c84e 100644 --- a/freertos-rust/src/freertos/shim.c +++ b/freertos-rust/src/freertos/shim.c @@ -231,6 +231,16 @@ void freertos_rs_suspend_task(TaskHandle_t task) { vTaskSuspend(task); } +void freertos_rs_resume_task(TaskHandle_t task) { + vTaskResume(task); +} + +void freertos_rs_resume_task_from_isr(TaskHandle_t task, BaseType_t* xHigherPriorityTaskWoken) { + if (xTaskResumeFromISR(task) != pdFALSE) { + *xHigherPriorityTaskWoken = pdTRUE; + } +} + UBaseType_t freertos_rs_get_stack_high_water_mark(TaskHandle_t task) { #if (INCLUDE_uxTaskGetStackHighWaterMark == 1) return uxTaskGetStackHighWaterMark(task); diff --git a/freertos-rust/src/shim.rs b/freertos-rust/src/shim.rs index 813ba7f..fb335fa 100644 --- a/freertos-rust/src/shim.rs +++ b/freertos-rust/src/shim.rs @@ -114,6 +114,11 @@ extern "C" { ) -> FreeRtosUBaseType; pub fn freertos_rs_delete_task(task: FreeRtosTaskHandle); pub fn freertos_rs_suspend_task(task: FreeRtosTaskHandle); + pub fn freertos_rs_resume_task(task: FreeRtosTaskHandle); + pub fn freertos_rs_resume_task_from_isr( + task: FreeRtosTaskHandle, + xHigherPriorityTaskWoken: FreeRtosBaseTypeMutPtr, + ); pub fn freertos_rs_vTaskSuspendAll(); pub fn freertos_rs_xTaskResumeAll() -> FreeRtosBaseType; diff --git a/freertos-rust/src/task.rs b/freertos-rust/src/task.rs index e83156b..5d54a29 100644 --- a/freertos-rust/src/task.rs +++ b/freertos-rust/src/task.rs @@ -133,6 +133,20 @@ impl Task { } } + /// Resume a suspended task. + pub fn resume(&self) { + unsafe { + freertos_rs_resume_task(self.task_handle); + } + } + + /// Resume a suspended task from an interrupt. + pub fn resume_from_isr(&self, context: &mut InterruptContext) { + unsafe { + freertos_rs_resume_task_from_isr(self.task_handle, context.get_task_field_mut()); + } + } + unsafe fn spawn_inner<'a>( f: Box, name: &str,