Skip to content

Commit 5293c86

Browse files
committed
Add heap free size interface
1 parent bc9302e commit 5293c86

File tree

8 files changed

+56
-4
lines changed

8 files changed

+56
-4
lines changed

freertos-cargo-build/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
license = "MIT"
77
name = "freertos-build"
88
readme = "README.md"
9-
version = "0.4.3"
9+
version = "0.4.4"
1010

1111
[lib]
1212

freertos-cargo-build/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ fn setup_all_define(cc: &mut cc::Build) {
376376
sync_define(cc, "INCLUDE_vTaskDelete");
377377
sync_define(cc, "INCLUDE_vTaskDelayUntil");
378378
sync_define(cc, "INCLUDE_uxTaskGetStackHighWaterMark");
379+
sync_define(cc, "INCLUDE_HeapFreeSize");
379380
cc.define("INCLUDE_vTaskDelay", "1");
380381
}
381382

freertos-rust/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ The freertos-build crate can be used to build and link FreeRTOS from source insi
1010
links = "freertos"
1111
name = "freertos-next"
1212
readme = "README.md"
13-
version = "0.7.4"
13+
version = "0.7.5"
1414

1515

1616
[lib]
@@ -34,6 +34,7 @@ The freertos-build crate can be used to build and link FreeRTOS from source insi
3434
critical_section_impl = ["critical-section/restore-state-u32"]
3535
delay_until = []
3636
delete_task = []
37+
heap_free_size = ["allocator"]
3738
hooks = []
3839
interrupt = []
3940
stack_high_water = []

freertos-rust/build.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ fn main() {
2727
("delete_task", "INCLUDE_vTaskDelete"),
2828
("delay_until", "INCLUDE_vTaskDelayUntil"),
2929
("stack_high_water", "INCLUDE_uxTaskGetStackHighWaterMark"),
30+
("heap_free_size", "INCLUDE_HeapFreeSize"),
3031
]);
3132

3233
for (ft, def) in feature_define_map.iter() {

freertos-rust/src/allocator.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,21 @@ Use with:
1111

1212
pub struct FreeRtosAllocator;
1313

14+
#[cfg(feature = "heap_free_size")]
15+
impl FreeRtosAllocator {
16+
pub fn get_free_size(&self) -> usize {
17+
unsafe { freertos_rs_get_free_heap_size() }
18+
}
19+
20+
pub fn get_min_free_size(&self) -> usize {
21+
unsafe { freertos_rs_get_minimum_free_heap_size() }
22+
}
23+
24+
pub fn reset_min_free_size(&self) {
25+
unsafe { freertos_rs_reset_minimum_free_heap_size() }
26+
}
27+
}
28+
1429
unsafe impl GlobalAlloc for FreeRtosAllocator {
1530
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
1631
let res = unsafe { freertos_rs_pvPortMalloc(layout.size() as u32) };

freertos-rust/src/freertos/shim.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,3 +478,17 @@ EventBits_t freertos_rs_event_group_sync(EventGroupHandle_t event_group, const E
478478
const EventBits_t bits_to_wait_for, TickType_t ticks_to_wait) {
479479
return xEventGroupSync(event_group, bits_to_set, bits_to_wait_for, ticks_to_wait);
480480
}
481+
482+
#if (INCLUDE_HeapFreeSize == 1)
483+
size_t freertos_rs_get_free_heap_size() {
484+
return xPortGetFreeHeapSize();
485+
}
486+
487+
size_t freertos_rs_get_minimum_free_heap_size() {
488+
return xPortGetMinimumEverFreeHeapSize();
489+
}
490+
491+
void freertos_rs_reset_minimum_free_heap_size() {
492+
xPortResetHeapMinimumEverFreeHeapSize();
493+
}
494+
#endif

freertos-rust/src/shim.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,4 +198,8 @@ unsafe extern "C" {
198198
bits_to_wait_for: FreeRtosEventBitsType,
199199
ticks_to_wait: FreeRtosTickType,
200200
) -> FreeRtosEventBitsType;
201+
202+
pub fn freertos_rs_get_free_heap_size() -> usize;
203+
pub fn freertos_rs_get_minimum_free_heap_size() -> usize;
204+
pub fn freertos_rs_reset_minimum_free_heap_size();
201205
}

freertos-rust/src/task.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -303,12 +303,20 @@ impl Task {
303303
}
304304
}
305305

306+
/// Get the minimum amount of stack that was ever left on this task in words.
306307
#[cfg(feature = "stack_high_water")]
307-
/// Get the minimum amount of stack that was ever left on this task.
308+
#[inline]
308309
pub fn get_stack_high_water_mark(&self) -> u32 {
309310
unsafe { freertos_rs_get_stack_high_water_mark(self.task_handle) as u32 }
310311
}
311312

313+
/// Get the minimum amount of stack that was ever left on this task in bytes.
314+
#[cfg(feature = "stack_high_water")]
315+
#[inline]
316+
pub fn get_stack_high_water_mark_bytes(&self) -> u32 {
317+
self.get_stack_high_water_mark() * 4
318+
}
319+
312320
pub fn get_id(&self) -> Result<FreeRtosBaseType, FreeRtosError> {
313321
let task_id = unsafe { freertos_rs_uxTaskGetTaskNumber(self.task_handle) };
314322
if task_id == 0 {
@@ -347,11 +355,19 @@ impl CurrentTask {
347355
unsafe { freertos_rs_task_notify_take(if clear { 1 } else { 0 }, wait_for.to_ticks()) }
348356
}
349357

350-
#[cfg(feature = "stack_high_water")]
351358
/// Get the minimum amount of stack that was ever left on the current task.
359+
#[cfg(feature = "stack_high_water")]
360+
#[inline]
352361
pub fn get_stack_high_water_mark() -> u32 {
353362
unsafe { freertos_rs_get_stack_high_water_mark(0 as FreeRtosTaskHandle) as u32 }
354363
}
364+
365+
/// Get the minimum amount of stack that was ever left on this task in bytes.
366+
#[cfg(feature = "stack_high_water")]
367+
#[inline]
368+
pub fn get_stack_high_water_mark_bytes() -> u32 {
369+
Self::get_stack_high_water_mark() * 4
370+
}
355371
}
356372

357373
#[derive(Debug)]

0 commit comments

Comments
 (0)