44 */
55
66#include <zephyr/kernel.h>
7+ #include <zephyr/logging/log.h>
8+
9+ #ifndef _ASMLANGUAGE
10+ #include <xc.h>
11+ #ifdef __cplusplus
12+ extern "C" {
13+ #endif
14+
15+ LOG_MODULE_REGISTER (dspic , 4 );
716
817volatile uint32_t reason , address ;
918
10- #define EXCEPTION_HANDLER __attribute__((interrupt, no_auto_psv, keep))
19+ #define EXCEPTION_HANDLER __attribute__((interrupt, no_auto_psv, weak))
20+ #define BUS_ERROR_MASK 0xF
21+ #define MATH_ERROR_MASK 0x1F
22+ #define GENERAL_TRAP_MASK 0x8000000Fu
1123
12- void EXCEPTION_HANDLER _ReservedTrap7 (void );
1324void __attribute__((weak )) TRAPS_halt_on_error (void );
1425void EXCEPTION_HANDLER _BusErrorTrap (void );
1526void EXCEPTION_HANDLER _AddressErrorTrap (void );
@@ -20,62 +31,93 @@ void EXCEPTION_HANDLER _GeneralTrap(void);
2031void EXCEPTION_HANDLER _ReservedTrap0 (void );
2132void EXCEPTION_HANDLER _ReservedTrap7 (void );
2233
34+ void EXCEPTION_HANDLER _ReservedTrap0 (void )
35+ {
36+ }
37+ void EXCEPTION_HANDLER _ReservedTrap7 (void )
38+ {
39+ }
40+
2341void __attribute__((weak )) TRAPS_halt_on_error (void )
2442{
43+ /* stay here forever */
44+ while (1 ) {
45+ }
2546}
2647
2748/** Bus error.**/
2849void EXCEPTION_HANDLER _BusErrorTrap (void )
2950{
30- __asm__("nop" );
31- __asm__("retfie" );
51+ /* Identify bus error via INTCON3, fetch trap address from
52+ * PCTRAP, and reset error flags
53+ */
54+ reason = INTCON3 & BUS_ERROR_MASK ;
55+ address = PCTRAP ;
56+ LOG_ERR ("ERROR !!! Exception reason = %d, address = 0x%x\n" , reason , address );
57+ INTCON3 &= ~(BUS_ERROR_MASK );
58+ PCTRAP = 0 ;
59+ TRAPS_halt_on_error ();
3260}
3361
3462/** Address error.**/
3563void EXCEPTION_HANDLER _AddressErrorTrap (void )
3664{
37- __asm__("nop" );
38- __asm__("retfie" );
65+ /* fetch trap address from PCTRAP
66+ * and reset error flags
67+ */
68+ address = PCTRAP ;
69+ LOG_ERR ("ERROR !!! Exception reason = %s, address = 0x%x\n" , "Address Error" , address );
70+ INTCON1bits .ADDRERR = 0 ;
71+ PCTRAP = 0 ;
72+ TRAPS_halt_on_error ();
3973}
4074
4175/** Illegal instruction.**/
4276void EXCEPTION_HANDLER _IllegalInstructionTrap (void )
4377{
44- __asm__("nop" );
45- __asm__("retfie" );
78+ address = PCTRAP ;
79+ LOG_ERR ("ERROR !!! Exception reason = %s, address = 0x%x\n" , "Illegal Instruction" ,
80+ address );
81+ INTCON1bits .BADOPERR = 0 ;
82+ PCTRAP = 0 ;
83+ TRAPS_halt_on_error ();
4684}
4785
4886/** Math error.**/
4987void EXCEPTION_HANDLER _MathErrorTrap (void )
5088{
51- __asm__("nop" );
52- __asm__("retfie" );
89+ /* Identify math error via INTCON4, fetch trap address from
90+ * PCTRAP, and reset error flags
91+ */
92+ reason = INTCON4 & MATH_ERROR_MASK ;
93+ address = PCTRAP ;
94+ LOG_ERR ("ERROR !!! Exception reason = %d, address = 0x%x\n" , reason , address );
95+ INTCON4 &= ~(MATH_ERROR_MASK );
96+ PCTRAP = 0 ;
97+ TRAPS_halt_on_error ();
5398}
5499
55100/** Stack error.**/
56101void EXCEPTION_HANDLER _StackErrorTrap (void )
57102{
58- __asm__("nop" );
59- __asm__("retfie" );
103+ INTCON1bits .STKERR = 0 ;
104+ PCTRAP = 0 ;
105+ TRAPS_halt_on_error ();
60106}
61107
62108/** Generic error.**/
63109void EXCEPTION_HANDLER _GeneralTrap (void )
64110{
65- __asm__("nop" );
66- __asm__("retfie" );
111+ reason = INTCON5 & GENERAL_TRAP_MASK ;
112+ address = PCTRAP ;
113+ LOG_ERR ("ERROR !!! Exception reason = %d, address = 0x%x\n" , reason , address );
114+ INTCON5 &= ~(GENERAL_TRAP_MASK );
115+ PCTRAP = 0 ;
116+ TRAPS_halt_on_error ();
67117}
68118
69- /** Reserved Trap0.**/
70- void EXCEPTION_HANDLER _ReservedTrap0 (void )
71- {
72- __asm__("nop" );
73- __asm__("retfie" );
119+ #ifdef __cplusplus
74120}
121+ #endif
75122
76- /** Reserved Trap7.**/
77- void EXCEPTION_HANDLER _ReservedTrap7 (void )
78- {
79- __asm__("nop" );
80- __asm__("retfie" );
81- }
123+ #endif /* _ASMLANGUAGE */
0 commit comments