31
31
#include "pendsv.h"
32
32
#include "irq.h"
33
33
34
- // This variable is used to save the exception object between a ctrl-C and the
35
- // PENDSV call that actually raises the exception. It must be non-static
36
- // otherwise gcc-5 optimises it away. It can point to the heap but is not
37
- // traced by GC. This is okay because we only ever set it to
38
- // mp_kbd_exception which is in the root-pointer set.
39
- void * pendsv_object ;
40
-
41
34
#if defined(PENDSV_DISPATCH_NUM_SLOTS )
42
35
uint32_t pendsv_dispatch_active ;
43
36
pendsv_dispatch_t pendsv_dispatch_table [PENDSV_DISPATCH_NUM_SLOTS ];
@@ -51,24 +44,6 @@ void pendsv_init(void) {
51
44
NVIC_SetPriority (PendSV_IRQn , IRQ_PRI_PENDSV );
52
45
}
53
46
54
- // Call this function to raise a pending exception during an interrupt.
55
- // It will first try to raise the exception "softly" by setting the
56
- // mp_pending_exception variable and hoping that the VM will notice it.
57
- // If this function is called a second time (ie with the mp_pending_exception
58
- // variable already set) then it will force the exception by using the hardware
59
- // PENDSV feature. This will wait until all interrupts are finished then raise
60
- // the given exception object using nlr_jump in the context of the top-level
61
- // thread.
62
- void pendsv_kbd_intr (void ) {
63
- if (MP_STATE_MAIN_THREAD (mp_pending_exception ) == MP_OBJ_NULL ) {
64
- mp_sched_keyboard_interrupt ();
65
- } else {
66
- MP_STATE_MAIN_THREAD (mp_pending_exception ) = MP_OBJ_NULL ;
67
- pendsv_object = & MP_STATE_VM (mp_kbd_exception );
68
- SCB -> ICSR = SCB_ICSR_PENDSVSET_Msk ;
69
- }
70
- }
71
-
72
47
#if defined(PENDSV_DISPATCH_NUM_SLOTS )
73
48
void pendsv_schedule_dispatch (size_t slot , pendsv_dispatch_t f ) {
74
49
pendsv_dispatch_table [slot ] = f ;
@@ -90,10 +65,7 @@ void pendsv_dispatch_handler(void) {
90
65
__attribute__((naked )) void PendSV_Handler (void ) {
91
66
// Handle a PendSV interrupt
92
67
//
93
- // For the case of an asynchronous exception, re-jig the
94
- // stack so that when we return from this interrupt handler
95
- // it returns instead to nlr_jump with argument pendsv_object
96
- // note that stack has a different layout if DEBUG is enabled
68
+ // Calls any pending functions in pendsv_dispatch_table.
97
69
//
98
70
// For the case of a thread switch, swap stacks.
99
71
//
@@ -132,27 +104,6 @@ __attribute__((naked)) void PendSV_Handler(void) {
132
104
".no_dispatch:\n"
133
105
#endif
134
106
135
- // Check if there is an active object to throw via nlr_jump
136
- "ldr r1, pendsv_object_ptr\n"
137
- "ldr r0, [r1]\n"
138
- "cmp r0, #0\n"
139
- "beq .no_obj\n"
140
- #if defined(PENDSV_DEBUG )
141
- "str r0, [sp, #8]\n" // store to r0 on stack
142
- #else
143
- "str r0, [sp, #0]\n" // store to r0 on stack
144
- #endif
145
- "mov r0, #0\n"
146
- "str r0, [r1]\n" // clear pendsv_object
147
- "ldr r0, nlr_jump_ptr\n"
148
- #if defined(PENDSV_DEBUG )
149
- "str r0, [sp, #32]\n" // store to pc on stack
150
- #else
151
- "str r0, [sp, #24]\n" // store to pc on stack
152
- #endif
153
- "bx lr\n" // return from interrupt; will return to nlr_jump
154
- ".no_obj:\n" // pendsv_object==NULL
155
-
156
107
#if MICROPY_PY_THREAD
157
108
// Do a thread context switch
158
109
"push {r4-r11, lr}\n"
@@ -178,7 +129,5 @@ __attribute__((naked)) void PendSV_Handler(void) {
178
129
#if defined(PENDSV_DISPATCH_NUM_SLOTS )
179
130
"pendsv_dispatch_active_ptr: .word pendsv_dispatch_active\n"
180
131
#endif
181
- "pendsv_object_ptr: .word pendsv_object\n"
182
- "nlr_jump_ptr: .word nlr_jump\n"
183
132
);
184
133
}
0 commit comments