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.

169 lines
5.4 KiB

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