You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

153 lines
5.5 KiB

#include "sys_mgr.hpp"
#include <stdlib.h>
using namespace iflytop;
#define TAG "SysMgr"
extern "C" {
/***********************************************************************************************************************
* STM32_CODE_ERROR *
***********************************************************************************************************************/
void SysMgr_on_Error_Handler() {
ZLOGE(TAG, "Error_Handler\n");
while (1) {
}
}
void SysMgr_on_assert_failed(uint8_t* file, uint32_t line) {
ZLOGE(TAG, "ASSERT: %s [%s:%d]\n", file, line);
while (1) {
}
}
extern uint8_t _end; /* Symbol defined in the linker script */
extern uint8_t _estack; /* Symbol defined in the linker script */
extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */
extern uint8_t* __sbrk_heap_end;
static size_t get_free_heap_size() {
const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size;
const uint8_t* max_heap = (uint8_t*)stack_limit;
uint8_t* prev_heap_end;
return max_heap - __sbrk_heap_end;
// if (__sbrk_heap_end + incr > max_heap) {
// errno = ENOMEM;
// return (void*)-1;
// }
}
/***********************************************************************************************************************
* STM32_ERROR_IRQ *
***********************************************************************************************************************/
void SysMgr_on_NMI_Handler(void) { ZLOGI(TAG, "on NMI_Handler"); }
void SysMgr_on_HardFault_Handler(void) { ZLOGI(TAG, "on HardFault_Handler"); }
void SysMgr_on_MemManage_Handler(void) { ZLOGI(TAG, "on MemManage_Handler"); }
void SysMgr_on_BusFault_Handler(void) { ZLOGI(TAG, "on BusFault_Handler"); }
void SysMgr_on_UsageFault_Handler(void) { ZLOGI(TAG, "on UsageFault_Handler"); }
/***********************************************************************************************************************
* FREERTOS_ERROR *
***********************************************************************************************************************/
void vApplicationStackOverflowHook(xTaskHandle xTask, signed char* pcTaskName) {
ZLOGE(TAG, "StackOverflowHook: %s\n", pcTaskName);
__disable_irq();
while (1) {
}
}
void vApplicationMallocFailedHook(void) {
ZLOGE(TAG, "MallocFailedHook\n");
__disable_irq();
while (1) {
}
}
}
SysMgr* SysMgr::ins() {
static SysMgr s_ins;
return &s_ins;
}
// void SysMgr::regTaskId(osThreadId id) {
// m_task[m_ntask].Id = id;
// m_ntask++;
// }
size_t SysMgr::osGetSysRunTime() { return HAL_GetTick(); }
UBaseType_t uxTaskGetSystemState(TaskStatus_t* const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t* const pulTotalRunTime);
void SysMgr::initedFinished() { //
static TaskStatus_t pxTaskStatusArray[SDK_MAX_TASK + 1];
UBaseType_t uxArraySize = SDK_MAX_TASK + 1;
uint32_t pulTotalRunTime;
m_ntask = uxTaskGetSystemState(pxTaskStatusArray, uxArraySize, &pulTotalRunTime);
for (int i = 0; i < m_ntask; i++) {
m_task[i].Id = pxTaskStatusArray[i].xHandle;
}
ZASSERT_INFO(m_ntask < SDK_MAX_TASK, "task num is too large, please increase SDK_MAX_TASK");
}
size_t SysMgr::osGetMinimumEverFreeHeapSize() { return ::xPortGetMinimumEverFreeHeapSize(); }
size_t SysMgr::osGetFreeHeapSize() { return ::xPortGetFreeHeapSize(); }
size_t SysMgr::osGetTotalHeapSize() { return configTOTAL_HEAP_SIZE; }
size_t SysMgr::osGetFreeSysHeapSize() { return get_free_heap_size(); }
int32_t SysMgr::getTaskNum() { return m_ntask; }
void SysMgr::dumpSysInfo() {
zlog("---------------Heap Info--------------\n");
zlog("MinimumEverFreeHeapSize : %d\n", osGetMinimumEverFreeHeapSize());
zlog("RTOS FreeHeapSize : %d\n", osGetFreeHeapSize());
zlog("RTOS TotalHeapSize : %d\n", osGetTotalHeapSize());
zlog("Sys FreeHeap : %d\n", get_free_heap_size());
zlog("");
zlog("---------------Task Info--------------\n");
static char buf[40 * SDK_MAX_TASK]; // 40一个任务,最多支持10个任务
vTaskList(buf);
zlog("Name State Priority Stack Num\n");
zlog_raw(buf);
zlog("- TaskInfoEnd -\n");
}
uint32_t SysMgr::osTaskStackRemainingSize(osThreadId id) { return uxTaskGetStackHighWaterMark(id); }
const char* SysMgr::osTaskName(osThreadId id) { return pcTaskGetName(id); }
osThreadId SysMgr::osGetId(int offset) {
if (offset < m_ntask) {
return m_task[offset].Id;
}
return NULL;
}
void SysMgr::osTaskName(osThreadId id, char* name, int bufsize) {
strncpy(name, pcTaskGetName(id), bufsize);
name[bufsize - 1] = 0;
}
void SysMgr::osTaskStackRemainingSize(osThreadId id, uint16_t* remainsize) { *remainsize = uxTaskGetStackHighWaterMark(id); }
void SysMgr::osTaskPriority(osThreadId id, uint16_t* priority) { *priority = uxTaskPriorityGet(id); }
void SysMgr::osTaskGetState(osThreadId id, char* state) {
eTaskState task_state = eTaskGetState(id);
switch (task_state) {
case eRunning:
*state = 'X';
break;
case eReady:
*state = 'R';
break;
case eBlocked:
*state = 'B';
break;
case eSuspended:
*state = 'S';
break;
case eDeleted:
*state = 'D';
break;
default:
*state = '?';
break;
}
}