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.
 
 
 

139 lines
4.9 KiB

#include "sys_mgr.hpp"
#include <stdlib.h>
#include <string.h>
#include "project_configs.h"
#include "sdk/os/zos.hpp"
using namespace iflytop;
#define TAG "SysMgr"
extern "C" {
/***********************************************************************************************************************
* STM32_CODE_ERROR *
***********************************************************************************************************************/
void SysMgr_on_Error_Handler() {
ZLOGE(TAG, "Error_Handler\r\n");
while (1) {
}
}
void SysMgr_on_assert_failed(uint8_t* file, uint32_t line) {
ZLOGE(TAG, "ASSERT: %s [%s:%d]\r\n", file, line);
while (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\r\n", pcTaskName);
__disable_irq();
while (1) {
}
}
void vApplicationMallocFailedHook(void) {
ZLOGE(TAG, "MallocFailedHook\r\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; }
int32_t SysMgr::getTaskNum() { return m_ntask; }
void SysMgr::dumpSysInfo() {
zos_log("---------------Heap Info--------------\r\n");
zos_log("MinimumEverFreeHeapSize: %d\r\n", osGetMinimumEverFreeHeapSize());
zos_log("FreeHeapSize : %d\r\n", osGetFreeHeapSize());
zos_log("TotalHeapSize : %d\r\n", osGetTotalHeapSize());
zos_log("");
zos_log("---------------Task Info--------------\r\n");
static char buf[40 * SDK_MAX_TASK]; // 40一个任务,最多支持10个任务
vTaskList(buf);
zos_log("Name State Priority Stack Num\r\n");
zlog_raw(buf);
zos_log("- TaskInfoEnd -\r\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, unsigned long* remainsize) { *remainsize = uxTaskGetStackHighWaterMark(id); }
void SysMgr::osTaskPriority(osThreadId id, unsigned long* 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;
case eInvalid:
*state = '?';
break;
default:
*state = '?';
break;
}
}