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

12 months ago
  1. #include "sys_mgr.hpp"
  2. #include <stdlib.h>
  3. #include "zbasic.h"
  4. using namespace iflytop;
  5. #define TAG "SysMgr"
  6. extern "C" {
  7. /***********************************************************************************************************************
  8. * STM32_CODE_ERROR *
  9. ***********************************************************************************************************************/
  10. void SysMgr_on_Error_Handler() {
  11. ZLOGE(TAG, "Error_Handler\n");
  12. while (1) {
  13. }
  14. }
  15. void SysMgr_on_assert_failed(uint8_t* file, uint32_t line) {
  16. ZLOGE(TAG, "ASSERT: %s [%s:%d]\n", file, line);
  17. while (1) {
  18. }
  19. }
  20. extern uint8_t _end; /* Symbol defined in the linker script */
  21. extern uint8_t _estack; /* Symbol defined in the linker script */
  22. extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */
  23. extern uint8_t* __sbrk_heap_end;
  24. static size_t get_free_heap_size() {
  25. const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size;
  26. const uint8_t* max_heap = (uint8_t*)stack_limit;
  27. uint8_t* prev_heap_end;
  28. return max_heap - __sbrk_heap_end;
  29. // if (__sbrk_heap_end + incr > max_heap) {
  30. // errno = ENOMEM;
  31. // return (void*)-1;
  32. // }
  33. }
  34. /***********************************************************************************************************************
  35. * STM32_ERROR_IRQ *
  36. ***********************************************************************************************************************/
  37. void SysMgr_on_NMI_Handler(void) { ZLOGI(TAG, "on NMI_Handler"); }
  38. void SysMgr_on_HardFault_Handler(void) { ZLOGI(TAG, "on HardFault_Handler"); }
  39. void SysMgr_on_MemManage_Handler(void) { ZLOGI(TAG, "on MemManage_Handler"); }
  40. void SysMgr_on_BusFault_Handler(void) { ZLOGI(TAG, "on BusFault_Handler"); }
  41. void SysMgr_on_UsageFault_Handler(void) { ZLOGI(TAG, "on UsageFault_Handler"); }
  42. /***********************************************************************************************************************
  43. * FREERTOS_ERROR *
  44. ***********************************************************************************************************************/
  45. void vApplicationStackOverflowHook(xTaskHandle xTask, signed char* pcTaskName) {
  46. ZLOGE(TAG, "StackOverflowHook: %s\n", pcTaskName);
  47. __disable_irq();
  48. while (1) {
  49. }
  50. }
  51. void vApplicationMallocFailedHook(void) {
  52. ZLOGE(TAG, "MallocFailedHook\n");
  53. __disable_irq();
  54. while (1) {
  55. }
  56. }
  57. }
  58. SysMgr* SysMgr::ins() {
  59. static SysMgr s_ins;
  60. return &s_ins;
  61. }
  62. // void SysMgr::regTaskId(osThreadId id) {
  63. // m_task[m_ntask].Id = id;
  64. // m_ntask++;
  65. // }
  66. size_t SysMgr::osGetSysRunTime() { return HAL_GetTick(); }
  67. UBaseType_t uxTaskGetSystemState(TaskStatus_t* const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t* const pulTotalRunTime);
  68. void SysMgr::initedFinished() { //
  69. static TaskStatus_t pxTaskStatusArray[SDK_MAX_TASK + 1];
  70. UBaseType_t uxArraySize = SDK_MAX_TASK + 1;
  71. uint32_t pulTotalRunTime;
  72. m_ntask = uxTaskGetSystemState(pxTaskStatusArray, uxArraySize, &pulTotalRunTime);
  73. for (int i = 0; i < m_ntask; i++) {
  74. m_task[i].Id = pxTaskStatusArray[i].xHandle;
  75. }
  76. ZASSERT_INFO(m_ntask < SDK_MAX_TASK, "task num is too large, please increase SDK_MAX_TASK");
  77. }
  78. size_t SysMgr::osGetMinimumEverFreeHeapSize() { return ::xPortGetMinimumEverFreeHeapSize(); }
  79. size_t SysMgr::osGetFreeHeapSize() { return ::xPortGetFreeHeapSize(); }
  80. size_t SysMgr::osGetTotalHeapSize() { return configTOTAL_HEAP_SIZE; }
  81. size_t SysMgr::osGetFreeSysHeapSize() { return get_free_heap_size(); }
  82. int32_t SysMgr::getTaskNum() { return m_ntask; }
  83. void SysMgr::dumpSysInfo() {
  84. zlog("---------------Heap Info--------------\n");
  85. zlog("MinimumEverFreeHeapSize : %d\n", osGetMinimumEverFreeHeapSize());
  86. zlog("RTOS FreeHeapSize : %d\n", osGetFreeHeapSize());
  87. zlog("RTOS TotalHeapSize : %d\n", osGetTotalHeapSize());
  88. zlog("Sys FreeHeap : %d\n", get_free_heap_size());
  89. zlog("");
  90. zlog("---------------Task Info--------------\n");
  91. static char buf[40 * SDK_MAX_TASK]; // 40一个任务,最多支持10个任务
  92. vTaskList(buf);
  93. zlog("Name State Priority Stack Num\n");
  94. zlog_raw(buf);
  95. zlog("- TaskInfoEnd -\n");
  96. }
  97. uint32_t SysMgr::osTaskStackRemainingSize(osThreadId id) { return uxTaskGetStackHighWaterMark(id); }
  98. const char* SysMgr::osTaskName(osThreadId id) { return pcTaskGetName(id); }
  99. osThreadId SysMgr::osGetId(int offset) {
  100. if (offset < m_ntask) {
  101. return m_task[offset].Id;
  102. }
  103. return NULL;
  104. }
  105. void SysMgr::osTaskName(osThreadId id, char* name, int bufsize) {
  106. strncpy(name, pcTaskGetName(id), bufsize);
  107. name[bufsize - 1] = 0;
  108. }
  109. void SysMgr::osTaskStackRemainingSize(osThreadId id, uint16_t* remainsize) { *remainsize = uxTaskGetStackHighWaterMark(id); }
  110. void SysMgr::osTaskPriority(osThreadId id, uint16_t* priority) { *priority = uxTaskPriorityGet(id); }
  111. void SysMgr::osTaskGetState(osThreadId id, char* state) {
  112. eTaskState task_state = eTaskGetState(id);
  113. switch (task_state) {
  114. case eRunning:
  115. *state = 'X';
  116. break;
  117. case eReady:
  118. *state = 'R';
  119. break;
  120. case eBlocked:
  121. *state = 'B';
  122. break;
  123. case eSuspended:
  124. *state = 'S';
  125. break;
  126. case eDeleted:
  127. *state = 'D';
  128. break;
  129. default:
  130. *state = '?';
  131. break;
  132. }
  133. }