check.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "check.h"
  2. #include "common_defines.h"
  3. #include <furi_hal_console.h>
  4. #include <furi_hal_power.h>
  5. #include <furi_hal_rtc.h>
  6. #include <stdio.h>
  7. #include <FreeRTOS.h>
  8. #include <task.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. extern size_t xPortGetTotalHeapSize(void);
  12. extern size_t xPortGetFreeHeapSize(void);
  13. extern size_t xPortGetMinimumEverFreeHeapSize(void);
  14. static void __furi_put_uint32_as_text(uint32_t data) {
  15. char tmp_str[] = "-2147483648";
  16. itoa(data, tmp_str, 10);
  17. furi_hal_console_puts(tmp_str);
  18. }
  19. static void __furi_print_stack_info() {
  20. furi_hal_console_puts("\r\n\tstack watermark: ");
  21. __furi_put_uint32_as_text(uxTaskGetStackHighWaterMark(NULL) * 4);
  22. }
  23. static void __furi_print_heap_info() {
  24. furi_hal_console_puts("\r\n\t heap total: ");
  25. __furi_put_uint32_as_text(xPortGetTotalHeapSize());
  26. furi_hal_console_puts("\r\n\t heap free: ");
  27. __furi_put_uint32_as_text(xPortGetFreeHeapSize());
  28. furi_hal_console_puts("\r\n\t heap watermark: ");
  29. __furi_put_uint32_as_text(xPortGetMinimumEverFreeHeapSize());
  30. }
  31. static void __furi_print_name(bool isr) {
  32. if(isr) {
  33. furi_hal_console_puts("[ISR ");
  34. __furi_put_uint32_as_text(__get_IPSR());
  35. furi_hal_console_puts("] ");
  36. } else {
  37. const char* name = pcTaskGetName(NULL);
  38. if(name == NULL) {
  39. furi_hal_console_puts("[main] ");
  40. } else {
  41. furi_hal_console_puts("[");
  42. furi_hal_console_puts(name);
  43. furi_hal_console_puts("] ");
  44. }
  45. }
  46. }
  47. static FURI_NORETURN void __furi_halt() {
  48. asm volatile(
  49. #ifdef FURI_DEBUG
  50. "bkpt 0x00 \n"
  51. #endif
  52. "loop%=: \n"
  53. "wfi \n"
  54. "b loop%= \n"
  55. :
  56. :
  57. : "memory");
  58. __builtin_unreachable();
  59. }
  60. FURI_NORETURN void furi_crash(const char* message) {
  61. bool isr = FURI_IS_ISR();
  62. __disable_irq();
  63. if(message == NULL) {
  64. message = "Fatal Error";
  65. }
  66. furi_hal_console_puts("\r\n\033[0;31m[CRASH]");
  67. __furi_print_name(isr);
  68. furi_hal_console_puts(message);
  69. if(!isr) {
  70. __furi_print_stack_info();
  71. }
  72. __furi_print_heap_info();
  73. #ifdef FURI_DEBUG
  74. furi_hal_console_puts("\r\nSystem halted. Connect debugger for more info\r\n");
  75. furi_hal_console_puts("\033[0m\r\n");
  76. __furi_halt();
  77. #else
  78. furi_hal_rtc_set_fault_data((uint32_t)message);
  79. furi_hal_console_puts("\r\nRebooting system.\r\n");
  80. furi_hal_console_puts("\033[0m\r\n");
  81. furi_hal_power_reset();
  82. #endif
  83. __builtin_unreachable();
  84. }
  85. FURI_NORETURN void furi_halt(const char* message) {
  86. bool isr = FURI_IS_ISR();
  87. __disable_irq();
  88. if(message == NULL) {
  89. message = "System halt requested.";
  90. }
  91. furi_hal_console_puts("\r\n\033[0;31m[HALT]");
  92. __furi_print_name(isr);
  93. furi_hal_console_puts(message);
  94. furi_hal_console_puts("\r\nSystem halted. Bye-bye!\r\n");
  95. furi_hal_console_puts("\033[0m\r\n");
  96. __furi_halt();
  97. }