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

12 months ago
11 months ago
12 months ago
12 months ago
11 months ago
12 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. }