Во-первых, в RTOS нет контекста процесса.Во FreeRTOS есть задачи (которые аналогичны потокам в Linux) и основной контекст, который снова теряется при запуске Scheduler .Память стека, занятая каждой задачей, настраивается клиентом при создании задачи.
Однако после запуска системы вы можете запросить, достигает ли стек максимального значения, используя следующий API.
uxTaskGetStackHighWaterMardk(TaskHandle_t task)
Пожалуйста, обратитесь https://www.freertos.org/uxTaskGetStackHighWaterMark.html
Помните, что INCLUDE_uxTaskGetStackHighWaterMark
должно быть определено для 1
, чтобы использовать эту функцию.
Для кучи памяти я предполагаю, что вы 'использовать одну из стратегий выделения кучи FreeRTOS (heap_1, heap_2 и т. д.).В этом случае, если вы глобально переопределили свой malloc/free/new/new[]/delete/delete[]
для использования FreeRTOS pvPortMalloc
, есть способ зарегистрировать функцию перехвата, которая вызывается, когда система исчерпывает кучу.
См. https://www.freertos.org/a00016.html
В то же время можно получить статус времени выполнения из планировщика с помощью следующего API.
void vTaskGetRunTimeStats( char *pcWriteBuffer );
Конечно, это приведет к приостановке / приостановкепланировщик часто, так что не будет реальным решением для вашего производственного кода, но все равно будет хорошим средством отладки.
См. https://www.freertos.org/rtos-run-time-stats.html.