@@ -57,30 +57,70 @@ typedef struct task_info
57
57
StackType_t * pxEndOfStack ;
58
58
} task_info_t ;
59
59
60
- static void IRAM_ATTR panic_stack (StackType_t * start_stk , StackType_t * end_stk )
60
+ static void panic_data32 (uint32_t data , int hex )
61
+ {
62
+ char buf [12 ];
63
+ size_t off = 0 ;
64
+
65
+ if (!data )
66
+ buf [off ++ ] = '0' ;
67
+ else {
68
+ while (data ) {
69
+ char tmp = data % hex ;
70
+
71
+ if (tmp >= 10 )
72
+ tmp = tmp - 10 + 'a' ;
73
+ else
74
+ tmp = tmp + '0' ;
75
+
76
+ data = data / hex ;
77
+
78
+ buf [off ++ ] = tmp ;
79
+ }
80
+ }
81
+
82
+ if (hex == 16 ) {
83
+ while (off < 8 )
84
+ buf [off ++ ] = '0' ;
85
+ }
86
+
87
+ while (off )
88
+ ets_putc (buf [-- off ]);
89
+ }
90
+
91
+ static void panic_str (const char * s )
92
+ {
93
+ while (* s )
94
+ ets_putc (* s ++ );
95
+ }
96
+
97
+ static void panic_stack (StackType_t * start_stk , StackType_t * end_stk )
61
98
{
62
99
uint32_t * start = (uint32_t * )start_stk , * end = (uint32_t * )end_stk ;
63
100
size_t i , j ;
64
101
size_t size = end - start + 1 ;
65
102
66
- ets_printf ( "%10s" , " " );
103
+ panic_str ( " " );
67
104
for (i = 0 ; i < STACK_VOL_NUM ; i ++ ) {
68
- ets_printf ("%-8x " , i * sizeof (StackType_t ));
105
+ panic_data32 (i * sizeof (StackType_t ), 16 );
106
+ panic_str (" " );
69
107
}
70
- ets_printf ("\n \n" );
108
+ panic_str ("\r\n\r \n" );
71
109
72
110
for (i = 0 ; i < size ; i += STACK_VOL_NUM ) {
73
111
size_t len = size > i ? size - i : STACK_VOL_NUM - (i - size );
74
112
75
113
if (len > STACK_VOL_NUM )
76
114
len = STACK_VOL_NUM ;
77
115
78
- ets_printf ("%-10x" , & start [i ]);
116
+ panic_data32 ((uint32_t )& start [i ], 16 );
117
+ panic_str (" " );
79
118
80
119
for (j = 0 ; j < len ; j ++ ) {
81
- ets_printf ("%08x " ,start [i + j ]);
120
+ panic_data32 ((uint32_t )start [i + j ], 16 );
121
+ panic_str (" " );
82
122
}
83
- ets_printf ( " \n" );
123
+ panic_str ( "\r \n" );
84
124
}
85
125
}
86
126
@@ -91,54 +131,59 @@ static void IRAM_ATTR panic_stack(StackType_t *start_stk, StackType_t *end_stk)
91
131
*
92
132
* @return none
93
133
*/
94
- void IRAM_ATTR panicHandler (void * frame )
134
+ void panic_info (void * frame )
95
135
{
96
- // for panic the function that disable cache
97
- Cache_Read_Enable_New ();
98
-
99
136
task_info_t * task ;
100
137
int * regs = (int * )frame ;
101
138
int x , y ;
102
139
const char * sdesc [] = {
103
- "PC" , "PS" , "A0" , "A1" ,
104
- "A2" , "A3" , "A4" , "A5" ,
105
- "A6" , "A7" , "A8" , "A9" ,
106
- "A10" , " A11" , " A12" , " A13" ,
107
- "A14" , " A15" , " SAR" , "EXCCAUSE"
140
+ " PC" , " PS" , " A0" , " A1" ,
141
+ " A2" , " A3" , " A4" , " A5" ,
142
+ " A6" , " A7" , " A8" , " A9" ,
143
+ " A10" , " A11" , " A12" , " A13" ,
144
+ " A14" , " A15" , " SAR" , "EXCCAUSE"
108
145
};
109
146
110
147
extern int _Pri_3_NMICount ;
111
148
112
- /* NMI can interrupt exception. */
113
- ETS_INTR_LOCK ();
114
-
115
- ets_printf ("\r\n\r\n" );
149
+ panic_str ("\r\n\r\n" );
116
150
117
151
if (_Pri_3_NMICount == -1 ) {
118
- ets_printf ("Soft watch dog triggle:\r\n\r\n" );
152
+ panic_str ("Soft watch dog triggle:\r\n\r\n" );
119
153
show_critical_info ();
120
154
} else if (xPortInIsrContext ())
121
- ets_printf ("Core 0 was running in ISR context:\r\n\r\n" );
155
+ panic_str ("Core 0 was running in ISR context:\r\n\r\n" );
122
156
123
157
if ((task = (task_info_t * )xTaskGetCurrentTaskHandle ())) {
124
158
StackType_t * pdata = task -> pxStack ;
125
159
StackType_t * end = task -> pxEndOfStack + 4 ;
126
160
127
- ets_printf ("Task stack [%s] stack from [%p] to [%p], total [%d] size\r\n\r\n" ,
128
- task -> pcTaskName , pdata , end , end - pdata + 4 );
161
+ // "Task stack [%s] stack from [%p] to [%p], total [%d] size\r\n\r\n"
162
+ panic_str ("Task stack [" );
163
+ panic_str (task -> pcTaskName );
164
+ panic_str ("] stack from [" );
165
+ panic_data32 ((uint32_t )pdata , 16 );
166
+ panic_str ("] to [" );
167
+ panic_data32 ((uint32_t )end , 16 );
168
+ panic_str ("], total [" );
169
+ panic_data32 ((uint32_t )(end - pdata + 4 ), 10 );
170
+ panic_str ("] size\r\n\r\n" );
129
171
130
172
panic_stack (pdata , end );
131
173
132
- ets_printf ("\r\n\r\n" );
174
+ panic_str ("\r\n\r\n" );
133
175
} else {
134
- ets_printf ("No task\r\n\r\n" );
176
+ panic_str ("No task\r\n\r\n" );
135
177
}
136
178
137
179
for (x = 0 ; x < 20 ; x += 4 ) {
138
180
for (y = 0 ; y < 4 ; y ++ ) {
139
- ets_printf ("%8s: 0x%08x " , sdesc [x + y ], regs [x + y + 1 ]);
181
+ panic_str (sdesc [x + y ]);
182
+ panic_str (": 0x" );
183
+ panic_data32 ((uint32_t )regs [x + y + 1 ], 16 );
184
+ panic_str (" " );
140
185
}
141
- ets_printf ("\r\n" );
186
+ panic_str ("\r\n" );
142
187
}
143
188
144
189
/*
@@ -150,6 +195,22 @@ void IRAM_ATTR panicHandler(void *frame)
150
195
while (1 );
151
196
}
152
197
198
+ void IRAM_ATTR panicHandler (void * frame )
199
+ {
200
+ int cnt = 10 ;
201
+
202
+ /* NMI can interrupt exception. */
203
+ vPortEnterCritical ();
204
+ while (cnt -- ) {
205
+ REG_WRITE (INT_ENA_WDEV , 0 );
206
+ }
207
+
208
+ // for panic the function that disable cache
209
+ Cache_Read_Enable_New ();
210
+
211
+ panic_info (frame );
212
+ }
213
+
153
214
void _esp_error_check_failed (esp_err_t rc , const char * file , int line , const char * function , const char * expression )
154
215
{
155
216
printf ("ESP_ERROR_CHECK failed: esp_err_t 0x%x at %p\n" , rc , __builtin_return_address (0 ));
0 commit comments