Skip to content

Commit e49e6f2

Browse files
authored
Support event groups (#81)
1 parent e26cd70 commit e49e6f2

File tree

5 files changed

+108
-0
lines changed

5 files changed

+108
-0
lines changed

freertos-rust/src/base.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ pub type FreeRtosChar = u8;
2323
pub type FreeRtosBaseType = i32;
2424
pub type FreeRtosUBaseType = u32;
2525
pub type FreeRtosTickType = u32;
26+
pub type FreeRtosEventBitsType = u32;
2627
pub type FreeRtosBaseTypeMutPtr = *mut FreeRtosBaseType;
2728

2829
pub type FreeRtosTaskHandle = *const c_void;
2930
pub type FreeRtosQueueHandle = *const c_void;
3031
pub type FreeRtosSemaphoreHandle = *const c_void;
32+
pub type FreeRtosEventGroupHandle = *const c_void;
3133
pub type FreeRtosTaskFunction = *const c_void;
3234
pub type FreeRtosTimerHandle = *const c_void;
3335
pub type FreeRtosTimerCallback = *const c_void;

freertos-rust/src/event_group.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
use crate::base::*;
2+
use crate::isr::*;
3+
use crate::shim::*;
4+
use crate::units::*;
5+
6+
/// An event group
7+
pub struct EventGroup {
8+
event_group: FreeRtosEventGroupHandle,
9+
}
10+
11+
unsafe impl Send for EventGroup {}
12+
unsafe impl Sync for EventGroup {}
13+
14+
impl EventGroup {
15+
/// Create a new event group
16+
pub fn new() -> Result<EventGroup, FreeRtosError> {
17+
unsafe {
18+
let s = freertos_rs_event_group_create();
19+
if s == 0 as *const _ {
20+
return Err(FreeRtosError::OutOfMemory);
21+
}
22+
Ok(EventGroup { event_group: s })
23+
}
24+
}
25+
26+
/// # Safety
27+
///
28+
/// `handle` must be a valid FreeRTOS event group handle.
29+
#[inline]
30+
pub unsafe fn from_raw_handle(handle: FreeRtosEventGroupHandle) -> Self {
31+
Self { event_group: handle }
32+
}
33+
#[inline]
34+
pub fn raw_handle(&self) -> FreeRtosEventGroupHandle {
35+
self.event_group
36+
}
37+
38+
pub fn set_bits(&self, bits_to_set: FreeRtosEventBitsType) -> FreeRtosEventBitsType {
39+
unsafe { freertos_rs_event_group_set_bits(self.event_group, bits_to_set) }
40+
}
41+
42+
pub fn get_bits(&self) -> FreeRtosEventBitsType {
43+
unsafe { freertos_rs_event_group_get_bits(self.event_group) }
44+
}
45+
46+
pub fn clear_bits(&self, bits_to_clear: FreeRtosEventBitsType) -> FreeRtosEventBitsType {
47+
unsafe { freertos_rs_event_group_clear_bits(self.event_group, bits_to_clear) }
48+
}
49+
50+
pub fn wait_bits<D: DurationTicks>(&self, bits_to_wait_for: FreeRtosEventBitsType, clear_on_exit: FreeRtosBaseType, wait_for_all_bits: FreeRtosBaseType, duration: D) -> FreeRtosEventBitsType {
51+
unsafe { freertos_rs_event_group_wait_bits(self.event_group, bits_to_wait_for, clear_on_exit, wait_for_all_bits, duration.to_ticks()) }
52+
}
53+
54+
pub fn sync<D: DurationTicks>(&self, bits_to_set: FreeRtosEventBitsType, bits_to_wait_for: FreeRtosEventBitsType, duration: D) -> FreeRtosEventBitsType {
55+
unsafe { freertos_rs_event_group_sync(self.event_group, bits_to_set, bits_to_wait_for, duration.to_ticks()) }
56+
}
57+
}
58+
59+
impl Drop for EventGroup {
60+
fn drop(&mut self) {
61+
unsafe {
62+
freertos_rs_event_group_delete(self.event_group);
63+
}
64+
}
65+
}

freertos-rust/src/freertos/shim.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ STM32 example:
1010
#include "timers.h"
1111
#include "queue.h"
1212
#include "semphr.h"
13+
#include "event_groups.h"
1314

1415
// Just for testing
1516
void freertos_rs_invoke_configASSERT() {
@@ -432,3 +433,31 @@ void freertos_rs_enter_critical() {
432433
void freertos_rs_exit_critical() {
433434
taskEXIT_CRITICAL();
434435
}
436+
437+
EventGroupHandle_t freertos_rs_event_group_create() {
438+
return xEventGroupCreate();
439+
}
440+
441+
void freertos_rs_event_group_delete(EventGroupHandle_t event_group) {
442+
vEventGroupDelete(event_group);
443+
}
444+
445+
EventBits_t freertos_rs_event_group_set_bits(EventGroupHandle_t event_group, const EventBits_t bits_to_set) {
446+
return xEventGroupSetBits(event_group, bits_to_set);
447+
}
448+
449+
EventBits_t freertos_rs_event_group_get_bits(EventGroupHandle_t event_group) {
450+
return xEventGroupGetBits(event_group);
451+
}
452+
453+
EventBits_t freertos_rs_event_group_clear_bits(EventGroupHandle_t event_group, const EventBits_t bits_to_clear) {
454+
return xEventGroupClearBits(event_group, bits_to_clear);
455+
}
456+
457+
EventBits_t freertos_rs_event_group_wait_bits(const EventGroupHandle_t event_group, const EventBits_t bits_to_wait_for, const BaseType_t clear_on_exit, const BaseType_t wait_for_all_bits, TickType_t ticks_to_wait) {
458+
return xEventGroupWaitBits(event_group, bits_to_wait_for, clear_on_exit, wait_for_all_bits, ticks_to_wait);
459+
}
460+
461+
EventBits_t freertos_rs_event_group_sync(EventGroupHandle_t event_group, const EventBits_t bits_to_set, const EventBits_t bits_to_wait_for, TickType_t ticks_to_wait) {
462+
return xEventGroupSync(event_group, bits_to_set, bits_to_wait_for, ticks_to_wait);
463+
}

freertos-rust/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ mod mutex;
8383
mod queue;
8484
#[cfg(feature = "sync")]
8585
mod semaphore;
86+
#[cfg(feature = "sync")]
87+
mod event_group;
8688
#[cfg(any(feature = "time", feature = "sync"))]
8789
mod task;
8890
#[cfg(feature = "time")]
@@ -116,6 +118,8 @@ pub use crate::mutex::*;
116118
pub use crate::queue::*;
117119
#[cfg(feature = "sync")]
118120
pub use crate::semaphore::*;
121+
#[cfg(feature = "sync")]
122+
pub use crate::event_group::*;
119123
#[cfg(any(feature = "time", feature = "sync"))]
120124
pub use crate::task::*;
121125
#[cfg(feature = "time")]

freertos-rust/src/shim.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,12 @@ extern "C" {
168168

169169
pub fn freertos_rs_enter_critical();
170170
pub fn freertos_rs_exit_critical();
171+
172+
pub fn freertos_rs_event_group_create() -> FreeRtosEventGroupHandle;
173+
pub fn freertos_rs_event_group_delete(event_group: FreeRtosEventGroupHandle);
174+
pub fn freertos_rs_event_group_set_bits(event_group: FreeRtosEventGroupHandle, bits_to_set: FreeRtosEventBitsType) -> FreeRtosEventBitsType;
175+
pub fn freertos_rs_event_group_get_bits(event_group: FreeRtosEventGroupHandle) -> FreeRtosEventBitsType;
176+
pub fn freertos_rs_event_group_clear_bits(event_group: FreeRtosEventGroupHandle, bits_to_clear: FreeRtosEventBitsType) -> FreeRtosEventBitsType;
177+
pub fn freertos_rs_event_group_wait_bits(event_group: FreeRtosEventGroupHandle, bits_to_wait_for: FreeRtosEventBitsType, clear_on_exit: FreeRtosBaseType, wait_for_all_bits: FreeRtosBaseType, ticks_to_wait: FreeRtosTickType) -> FreeRtosEventBitsType;
178+
pub fn freertos_rs_event_group_sync(event_group: FreeRtosEventGroupHandle, bits_to_set: FreeRtosEventBitsType, bits_to_wait_for: FreeRtosEventBitsType, ticks_to_wait: FreeRtosTickType) -> FreeRtosEventBitsType;
171179
}

0 commit comments

Comments
 (0)