arm: move trace dump to crash handler
This commit is contained in:
		| @@ -3,6 +3,7 @@ | |||||||
| #include "gpio.h" | #include "gpio.h" | ||||||
| #include "itoa.h" | #include "itoa.h" | ||||||
| #include "sleep.h" | #include "sleep.h" | ||||||
|  | #include "trace.h" | ||||||
| #include "uart.h" | #include "uart.h" | ||||||
|  |  | ||||||
| extern "C" uint32_t _initial_stack_pointer, _text_begin, _text_end; | extern "C" uint32_t _initial_stack_pointer, _text_begin, _text_end; | ||||||
| @@ -80,6 +81,8 @@ void CrashHandler(Armv6mRegs* regs) { | |||||||
|     UartWriteCrash("- Stack trace:\r\n"); |     UartWriteCrash("- Stack trace:\r\n"); | ||||||
|     StackTrace(reinterpret_cast<uint32_t*>(regs->sp)); |     StackTrace(reinterpret_cast<uint32_t*>(regs->sp)); | ||||||
|  |  | ||||||
|  |     tracing::dump(); | ||||||
|  |  | ||||||
|     while (1) { |     while (1) { | ||||||
|         gpio0->data = 0x55; |         gpio0->data = 0x55; | ||||||
|         sleep(100); |         sleep(100); | ||||||
|   | |||||||
| @@ -18,10 +18,7 @@ void Uart0Isr() { | |||||||
|     HandleUartIsr(); |     HandleUartIsr(); | ||||||
| } | } | ||||||
|  |  | ||||||
| void Timer0Isr() { | void Timer0Isr() { __builtin_trap(); } | ||||||
|     tracing::dump(); |  | ||||||
|     __builtin_trap(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void SetupUart() { | void SetupUart() { | ||||||
|     InitUarts(); |     InitUarts(); | ||||||
|   | |||||||
| @@ -7,14 +7,19 @@ | |||||||
| #include "timer.h" | #include "timer.h" | ||||||
| #include "uart.h" | #include "uart.h" | ||||||
|  |  | ||||||
|  | #ifndef SBRK_STATS | ||||||
|  | #define SBRK_STATS 0 | ||||||
|  | #endif | ||||||
|  |  | ||||||
| extern unsigned char _heap_begin, _heap_end; | extern unsigned char _heap_begin, _heap_end; | ||||||
|  |  | ||||||
| namespace { | namespace { | ||||||
|  | [[maybe_unused]] | ||||||
| void LogStats(unsigned char* heap) { | void LogStats(unsigned char* heap) { | ||||||
|     char number[] = "00000000\r\n"; |     char number[] = "00000000\r\n"; | ||||||
|     UartWriteBlocking("Program break now at 0x"); |     UartWriteCrash("Program break now at 0x"); | ||||||
|     itoa(reinterpret_cast<int>(heap), number); |     itoa(reinterpret_cast<int>(heap), number); | ||||||
|     UartWriteBlocking(number); |     UartWriteCrash(number); | ||||||
| } | } | ||||||
| }  // namespace | }  // namespace | ||||||
|  |  | ||||||
| @@ -22,11 +27,13 @@ extern "C" void* _sbrk(int increment) { | |||||||
|     static unsigned char* heap = &_heap_begin; |     static unsigned char* heap = &_heap_begin; | ||||||
|     unsigned char* prev_heap = heap; |     unsigned char* prev_heap = heap; | ||||||
|     if (heap + increment >= &_heap_end) { |     if (heap + increment >= &_heap_end) { | ||||||
|         UartWriteBlocking("Heap overflow!\r\n"); |         UartWriteCrash("Heap overflow!\r\n"); | ||||||
|         return reinterpret_cast<void*>(-1); |         return reinterpret_cast<void*>(-1); | ||||||
|     } |     } | ||||||
|     heap += increment; |     heap += increment; | ||||||
|  | #if SBRK_STATS | ||||||
|     LogStats(heap); |     LogStats(heap); | ||||||
|  | #endif | ||||||
|     return prev_heap; |     return prev_heap; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user