check.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. void __furi_print_name() {
  10. if(FURI_IS_ISR()) {
  11. furi_hal_console_puts("[ISR] ");
  12. } else {
  13. const char* name = pcTaskGetName(xTaskGetCurrentTaskHandle());
  14. if(name == NULL) {
  15. furi_hal_console_puts("[main] ");
  16. } else {
  17. furi_hal_console_puts("[");
  18. furi_hal_console_puts(name);
  19. furi_hal_console_puts("] ");
  20. }
  21. }
  22. }
  23. static FURI_NORETURN void __furi_halt() {
  24. asm volatile(
  25. #ifdef FURI_DEBUG
  26. "bkpt 0x00 \n"
  27. #endif
  28. "loop%=: \n"
  29. "wfi \n"
  30. "b loop%= \n"
  31. :
  32. :
  33. : "memory");
  34. __builtin_unreachable();
  35. }
  36. FURI_NORETURN void furi_crash(const char* message) {
  37. __disable_irq();
  38. if(message == NULL) {
  39. message = "Fatal Error";
  40. }
  41. furi_hal_console_puts("\r\n\033[0;31m[CRASH]");
  42. __furi_print_name();
  43. furi_hal_console_puts(message);
  44. #ifdef FURI_DEBUG
  45. furi_hal_console_puts("\r\nSystem halted. Connect debugger for more info\r\n");
  46. furi_hal_console_puts("\033[0m\r\n");
  47. __furi_halt();
  48. #else
  49. furi_hal_rtc_set_fault_data((uint32_t)message);
  50. furi_hal_console_puts("\r\nRebooting system.\r\n");
  51. furi_hal_console_puts("\033[0m\r\n");
  52. furi_hal_power_reset();
  53. #endif
  54. __builtin_unreachable();
  55. }
  56. FURI_NORETURN void furi_halt(const char* message) {
  57. __disable_irq();
  58. if(message == NULL) {
  59. message = "System halt requested.";
  60. }
  61. furi_hal_console_puts("\r\n\033[0;31m[HALT]");
  62. __furi_print_name();
  63. furi_hal_console_puts(message);
  64. furi_hal_console_puts("\r\nSystem halted. Bye-bye!\r\n");
  65. furi_hal_console_puts("\033[0m\r\n");
  66. __furi_halt();
  67. }