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.

230 lines
7.9 KiB

3 months ago
  1. #include "sys_mgr.hpp"
  2. #include <stdlib.h>
  3. using namespace iflytop;
  4. #define TAG "SysMgr"
  5. extern "C" {
  6. /***********************************************************************************************************************
  7. * STM32_CODE_ERROR *
  8. ***********************************************************************************************************************/
  9. void SysMgr_on_Error_Handler() {
  10. ZLOGE(TAG, "Error_Handler\n");
  11. while (1) {
  12. }
  13. }
  14. void SysMgr_on_assert_failed(uint8_t* file, uint32_t line) {
  15. ZLOGE(TAG, "ASSERT: %s [%s:%d]\n", file, line);
  16. while (1) {
  17. }
  18. }
  19. extern uint8_t _end; /* Symbol defined in the linker script */
  20. extern uint8_t _estack; /* Symbol defined in the linker script */
  21. extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */
  22. extern uint8_t* __sbrk_heap_end;
  23. static size_t get_free_heap_size() {
  24. const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size;
  25. const uint8_t* max_heap = (uint8_t*)stack_limit;
  26. uint8_t* prev_heap_end;
  27. return max_heap - __sbrk_heap_end;
  28. // if (__sbrk_heap_end + incr > max_heap) {
  29. // errno = ENOMEM;
  30. // return (void*)-1;
  31. // }
  32. }
  33. /***********************************************************************************************************************
  34. * STM32_ERROR_IRQ *
  35. ***********************************************************************************************************************/
  36. // void SysMgr_on_NMI_Handler(void) { ZLOGI(TAG, "on NMI_Handler"); }
  37. // void SysMgr_on_HardFault_Handler(void) { ZLOGI(TAG, "on HardFault_Handler"); }
  38. // void SysMgr_on_MemManage_Handler(void) { ZLOGI(TAG, "on MemManage_Handler"); }
  39. // void SysMgr_on_BusFault_Handler(void) { ZLOGI(TAG, "on BusFault_Handler"); }
  40. // void SysMgr_on_UsageFault_Handler(void) { ZLOGI(TAG, "on UsageFault_Handler"); }
  41. void NMI_Handler(void) {
  42. printf("E:%s\n", __FUNCTION__);
  43. NVIC_SystemReset();
  44. }
  45. void HardFault_Handler(void) {
  46. printf("E:%s\n", __FUNCTION__);
  47. NVIC_SystemReset();
  48. }
  49. void MemManage_Handler(void) {
  50. printf("E:%s\n", __FUNCTION__);
  51. NVIC_SystemReset();
  52. }
  53. void BusFault_Handler(void) {
  54. printf("E:%s\n", __FUNCTION__);
  55. NVIC_SystemReset();
  56. }
  57. void UsageFault_Handler(void) {
  58. printf("E:%s\n", __FUNCTION__);
  59. NVIC_SystemReset();
  60. }
  61. void DebugMon_Handler(void) {}
  62. static void PVD_Init(void) {
  63. PWR_PVDTypeDef PvdStruct;
  64. HAL_PWR_EnablePVD();
  65. PvdStruct.PVDLevel = PWR_PVDLEVEL_6; /* set PVD thr to 3.1v */
  66. PvdStruct.Mode = PWR_PVD_MODE_IT_RISING;
  67. HAL_PWR_ConfigPVD(&PvdStruct);
  68. /* enable lost power irq */
  69. HAL_NVIC_SetPriority(PVD_IRQn, 0, 0); /* */
  70. HAL_NVIC_EnableIRQ(PVD_IRQn); /* */
  71. }
  72. void PVD_IRQHandler(void) {
  73. if (__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO)) /* 1为VDD小于PVD阈值,掉电情况 */
  74. {
  75. /* 掉电前的紧急处理 */
  76. printf("low power detect......\n");
  77. for (size_t i = 0; i < 1000; i++) {
  78. // wait for lost power
  79. printf("low power detect......\n");
  80. }
  81. NVIC_SystemReset();
  82. }
  83. }
  84. /***********************************************************************************************************************
  85. * FREERTOS_ERROR *
  86. ***********************************************************************************************************************/
  87. void vApplicationStackOverflowHook(xTaskHandle xTask, signed char* pcTaskName) {
  88. ZLOGE(TAG, "StackOverflowHook: %s\n", pcTaskName);
  89. __disable_irq();
  90. while (1) {
  91. }
  92. }
  93. void vApplicationMallocFailedHook(void) {
  94. ZLOGE(TAG, "MallocFailedHook\n");
  95. __disable_irq();
  96. while (1) {
  97. }
  98. }
  99. }
  100. SysMgr* SysMgr::ins() {
  101. static SysMgr s_ins;
  102. return &s_ins;
  103. }
  104. // void SysMgr::regTaskId(osThreadId id) {
  105. // m_task[m_ntask].Id = id;
  106. // m_ntask++;
  107. // }
  108. size_t SysMgr::osGetSysRunTime() { return HAL_GetTick(); }
  109. UBaseType_t uxTaskGetSystemState(TaskStatus_t* const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t* const pulTotalRunTime);
  110. void SysMgr::checkRst(void) {
  111. if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) { // NRST 引脚复位
  112. printf("RESET_REASON: PIN reset \n");
  113. m_reset_reason = kreset_reason_pinrst;
  114. } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET) { // 上电掉电复位
  115. printf("RESET_REASON: POR/PDR reset \n");
  116. m_reset_reason = kreset_reason_porrst;
  117. } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET) { // 软件复位
  118. printf("RESET_REASON: Software reset \n");
  119. m_reset_reason = kreset_reason_sftrst;
  120. } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) { // 独立看门狗复位
  121. printf("RESET_REASON: Independent watchdog reset \n");
  122. m_reset_reason = kreset_reason_iwdgrst;
  123. } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET) { // 窗口看门狗复位
  124. printf("RESET_REASON: Window watchdog reset \n");
  125. m_reset_reason = kreset_reason_wwdgrst;
  126. } else if (__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST) != RESET) { // 低功耗复位
  127. printf("RESET_REASON: (Low-power reset \n");
  128. m_reset_reason = kreset_reason_lpwrrst;
  129. } else {
  130. printf("RESET_REASON: Unkown reset \n");
  131. m_reset_reason = kreset_reason_unkown;
  132. }
  133. __HAL_RCC_CLEAR_RESET_FLAGS(); // 清除复位标志
  134. }
  135. void SysMgr::initedFinished() { //
  136. static TaskStatus_t pxTaskStatusArray[SDK_MAX_TASK + 1];
  137. UBaseType_t uxArraySize = SDK_MAX_TASK + 1;
  138. uint32_t pulTotalRunTime;
  139. m_ntask = uxTaskGetSystemState(pxTaskStatusArray, uxArraySize, &pulTotalRunTime);
  140. for (int i = 0; i < m_ntask; i++) {
  141. m_task[i].Id = pxTaskStatusArray[i].xHandle;
  142. }
  143. ZASSERT_INFO(m_ntask < SDK_MAX_TASK, "task num is too large, please increase SDK_MAX_TASK");
  144. PVD_Init();
  145. checkRst();
  146. }
  147. size_t SysMgr::osGetMinimumEverFreeHeapSize() { return ::xPortGetMinimumEverFreeHeapSize(); }
  148. size_t SysMgr::osGetFreeHeapSize() { return ::xPortGetFreeHeapSize(); }
  149. size_t SysMgr::osGetTotalHeapSize() { return configTOTAL_HEAP_SIZE; }
  150. size_t SysMgr::osGetFreeSysHeapSize() { return get_free_heap_size(); }
  151. int32_t SysMgr::getTaskNum() { return m_ntask; }
  152. void SysMgr::dumpSysInfo() {
  153. zlog("---------------Heap Info--------------\n");
  154. zlog("MinimumEverFreeHeapSize : %d\n", osGetMinimumEverFreeHeapSize());
  155. zlog("RTOS FreeHeapSize : %d\n", osGetFreeHeapSize());
  156. zlog("RTOS TotalHeapSize : %d\n", osGetTotalHeapSize());
  157. zlog("Sys FreeHeap : %d\n", get_free_heap_size());
  158. zlog("");
  159. zlog("---------------Task Info--------------\n");
  160. static char buf[40 * SDK_MAX_TASK]; // 40一个任务,最多支持10个任务
  161. vTaskList(buf);
  162. zlog("Name State Priority Stack Num\n");
  163. zlog_raw(buf);
  164. zlog("- TaskInfoEnd -\n");
  165. }
  166. uint32_t SysMgr::osTaskStackRemainingSize(osThreadId id) { return uxTaskGetStackHighWaterMark(id); }
  167. const char* SysMgr::osTaskName(osThreadId id) { return pcTaskGetName(id); }
  168. osThreadId SysMgr::osGetId(int offset) {
  169. if (offset < m_ntask) {
  170. return m_task[offset].Id;
  171. }
  172. return NULL;
  173. }
  174. void SysMgr::osTaskName(osThreadId id, char* name, int bufsize) {
  175. strncpy(name, pcTaskGetName(id), bufsize);
  176. name[bufsize - 1] = 0;
  177. }
  178. void SysMgr::osTaskStackRemainingSize(osThreadId id, uint16_t* remainsize) { *remainsize = uxTaskGetStackHighWaterMark(id); }
  179. void SysMgr::osTaskPriority(osThreadId id, uint16_t* priority) { *priority = uxTaskPriorityGet(id); }
  180. void SysMgr::osTaskGetState(osThreadId id, char* state) {
  181. eTaskState task_state = eTaskGetState(id);
  182. switch (task_state) {
  183. case eRunning:
  184. *state = 'X';
  185. break;
  186. case eReady:
  187. *state = 'R';
  188. break;
  189. case eBlocked:
  190. *state = 'B';
  191. break;
  192. case eSuspended:
  193. *state = 'S';
  194. break;
  195. case eDeleted:
  196. *state = 'D';
  197. break;
  198. default:
  199. *state = '?';
  200. break;
  201. }
  202. }