88 lines
2.0 KiB
C++
88 lines
2.0 KiB
C++
#ifndef FREERTOS_CPP_HEAP_STATS_HPP
|
|
#define FREERTOS_CPP_HEAP_STATS_HPP
|
|
|
|
#include <stddef.h>
|
|
|
|
extern "C"
|
|
{
|
|
#include "FreeRTOS.h"
|
|
}
|
|
|
|
namespace freertos
|
|
{
|
|
|
|
struct HeapStats final
|
|
{
|
|
size_t available_bytes;
|
|
size_t largest_free_block;
|
|
size_t smallest_free_block;
|
|
size_t free_blocks;
|
|
size_t minimum_ever_free_bytes;
|
|
size_t successful_allocations;
|
|
size_t successful_frees;
|
|
|
|
static HeapStats read() noexcept
|
|
{
|
|
HeapStats_t raw {};
|
|
vPortGetHeapStats( &raw );
|
|
return HeapStats {
|
|
raw.xAvailableHeapSpaceInBytes,
|
|
raw.xSizeOfLargestFreeBlockInBytes,
|
|
raw.xSizeOfSmallestFreeBlockInBytes,
|
|
raw.xNumberOfFreeBlocks,
|
|
raw.xMinimumEverFreeBytesRemaining,
|
|
raw.xNumberOfSuccessfulAllocations,
|
|
raw.xNumberOfSuccessfulFrees };
|
|
}
|
|
|
|
bool has_multiple_free_blocks() const noexcept
|
|
{
|
|
return free_blocks > 1U;
|
|
}
|
|
|
|
bool total_exceeds_largest() const noexcept
|
|
{
|
|
return available_bytes > largest_free_block;
|
|
}
|
|
};
|
|
|
|
class HeapWatermark final
|
|
{
|
|
public:
|
|
explicit constexpr HeapWatermark( HeapStats baseline ) noexcept
|
|
: baseline_bytes_ { baseline.available_bytes }
|
|
{
|
|
}
|
|
|
|
constexpr size_t baseline_bytes() const noexcept
|
|
{
|
|
return baseline_bytes_;
|
|
}
|
|
|
|
constexpr size_t current_bytes_used( HeapStats sample ) const noexcept
|
|
{
|
|
return baseline_bytes_ >= sample.available_bytes
|
|
? baseline_bytes_ - sample.available_bytes
|
|
: 0U;
|
|
}
|
|
|
|
constexpr size_t peak_bytes_used( HeapStats sample ) const noexcept
|
|
{
|
|
return baseline_bytes_ >= sample.minimum_ever_free_bytes
|
|
? baseline_bytes_ - sample.minimum_ever_free_bytes
|
|
: 0U;
|
|
}
|
|
|
|
constexpr bool recovered( HeapStats sample ) const noexcept
|
|
{
|
|
return sample.available_bytes == baseline_bytes_;
|
|
}
|
|
|
|
private:
|
|
size_t baseline_bytes_;
|
|
};
|
|
|
|
} // namespace freertos
|
|
|
|
#endif
|