Skip to content

Commit

Permalink
ports/all: Revert changes to pendsv.c.
Browse files Browse the repository at this point in the history
  • Loading branch information
iabdalkader committed Jan 20, 2024
1 parent 9fceba6 commit caa6cf3
Show file tree
Hide file tree
Showing 9 changed files with 58 additions and 351 deletions.
93 changes: 2 additions & 91 deletions ports/mimxrt/pendsv.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,42 +25,27 @@
*/

#include <stdlib.h>

#include "py/runtime.h"
#include "pendsv.h"
#include "irq.h"

void *pendsv_object;

#if defined(PENDSV_DISPATCH_NUM_SLOTS)
uint32_t pendsv_dispatch_active;
pendsv_dispatch_t pendsv_dispatch_table[PENDSV_DISPATCH_NUM_SLOTS];
#endif

void pendsv_init(void) {
pendsv_object = NULL;
#if defined(PENDSV_DISPATCH_NUM_SLOTS)
pendsv_dispatch_active = false;
#endif
// set PendSV interrupt at lowest priority
NVIC_SetPriority(PendSV_IRQn, IRQ_PRI_PENDSV);
}

// This will always force the exception by using the hardware PENDSV
void pendsv_nlr_jump(void *o) {
MP_STATE_MAIN_THREAD(mp_pending_exception) = MP_OBJ_NULL;
pendsv_dispatch_active = false;
pendsv_object = o;
SCB->ICSR = SCB_ICSR_PENDSVSET_Msk;
}

#if defined(PENDSV_DISPATCH_NUM_SLOTS)
void pendsv_schedule_dispatch(size_t slot, pendsv_dispatch_t f) {
pendsv_dispatch_table[slot] = f;
pendsv_dispatch_active = true;
SCB->ICSR = SCB_ICSR_PENDSVSET_Msk;
}

void pendsv_dispatch_handler(void) {
void PendSV_Handler(void) {
for (size_t i = 0; i < PENDSV_DISPATCH_NUM_SLOTS; ++i) {
if (pendsv_dispatch_table[i] != NULL) {
pendsv_dispatch_t f = pendsv_dispatch_table[i];
Expand All @@ -70,77 +55,3 @@ void pendsv_dispatch_handler(void) {
}
}
#endif

__attribute__((naked)) void PendSV_Handler(void) {
// Handle a PendSV interrupt
//
// For the case of an asynchronous exception, re-jig the
// stack so that when we return from this interrupt handler
// it returns instead to nlr_jump with argument pendsv_object
//
// on entry to this (naked) function, stack has the following layout:
// sp[6]: pc=r15
// sp[5]: lr=r14
// sp[4]: r12
// sp[3]: r3
// sp[2]: r2
// sp[1]: r1
// sp[0]: r0

__asm volatile (
#if defined(PENDSV_DISPATCH_NUM_SLOTS)
// Check if there are any pending calls to dispatch to
"ldr r1, pendsv_dispatch_active_ptr\n"
"ldr r0, [r1]\n"
"cmp r0, #0\n"
"beq .no_dispatch\n"
"mov r2, #0\n"
"str r2, [r1]\n" // clear pendsv_dispatch_active
"b pendsv_dispatch_handler\n" // jump to the handler
".no_dispatch:\n"
#endif

// Check if there is an active object to throw via nlr_jump
"ldr r1, pendsv_object_ptr\n"
"ldr r0, [r1]\n"
"cmp r0, #0\n"
"beq .no_obj\n"
"mov r2, #0x01000000 \n" // Modify stacked XPSR to make sure
"str r2, [sp, #28] \n" // possible LDM/STM progress is cleared.
"str r0, [sp, #0]\n" // store to r0 on stack
"mov r0, #0\n"
"str r0, [r1]\n" // clear pendsv_object
"ldr r0, nlr_jump_ptr\n"
"str r0, [sp, #24]\n" // store to pc on stack
"bx lr\n" // return from interrupt; will return to nlr_jump
".no_obj:\n" // pendsv_object==NULL

#if MICROPY_PY_THREAD
// Do a thread context switch
"push {r4-r11, lr}\n"
"vpush {s16-s31}\n"
"mrs r5, primask\n" // save PRIMASK in r5
"cpsid i\n" // disable interrupts while we change stacks
"mov r0, sp\n" // pass sp to save
"mov r4, lr\n" // save lr because we are making a call
"bl pyb_thread_next\n" // get next thread to execute
"mov lr, r4\n" // restore lr
"mov sp, r0\n" // switch stacks
"msr primask, r5\n" // reenable interrupts
"vpop {s16-s31}\n"
"pop {r4-r11, lr}\n"
"bx lr\n" // return from interrupt; will return to new thread
#else
// Spurious pendsv, just return
"bx lr\n"
#endif

// Data
".align 2\n"
#if defined(PENDSV_DISPATCH_NUM_SLOTS)
"pendsv_dispatch_active_ptr: .word pendsv_dispatch_active\n"
#endif
"pendsv_object_ptr: .word pendsv_object\n"
"nlr_jump_ptr: .word nlr_jump\n"
);
}
1 change: 0 additions & 1 deletion ports/nrf/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,6 @@ SRC_NRFX += $(addprefix lib/nrfx/drivers/src/,\
)

SRC_C += \
pendsv.c \
mphalport.c \
help.c \
gccollect.c \
Expand Down
3 changes: 3 additions & 0 deletions ports/nrf/mphalport.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,4 +77,7 @@ mp_uint_t mp_hal_ticks_ms(void);
#define mp_hal_delay_us_fast(p)
#define mp_hal_ticks_cpu() (0)

#define NVIC_PRIORITYGROUP_4 ((uint32_t)0x00000003)
#define IRQ_PRI_PENDSV NVIC_EncodePriority(NVIC_PRIORITYGROUP_4, 15, 0)

#endif
142 changes: 0 additions & 142 deletions ports/nrf/pendsv.c

This file was deleted.

6 changes: 3 additions & 3 deletions ports/nrf/pendsv.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef MICROPY_INCLUDED_STM32_PENDSV_H
#define MICROPY_INCLUDED_STM32_PENDSV_H
#ifndef MICROPY_INCLUDED_NRF_PENDSV_H
#define MICROPY_INCLUDED_NRF_PENDSV_H

enum {
MICROPY_BOARD_PENDSV_ENTRIES
Expand All @@ -39,4 +39,4 @@ void pendsv_init(void);
void pendsv_nlr_jump(void *val);
void pendsv_schedule_dispatch(size_t slot, pendsv_dispatch_t f);

#endif // MICROPY_INCLUDED_STM32_PENDSV_H
#endif // MICROPY_INCLUDED_NRF_PENDSV_H
1 change: 0 additions & 1 deletion ports/rp2/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,6 @@ set(MICROPY_SOURCE_PORT
mphalport.c
mpnetworkport.c
mpthreadport.c
pendsv.c
rp2_flash.c
rp2_pio.c
rp2_dma.c
Expand Down
3 changes: 3 additions & 0 deletions ports/rp2/mphalport.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@
#define MICROPY_PY_PENDSV_ENTER pendsv_suspend()
#define MICROPY_PY_PENDSV_EXIT pendsv_resume()

#define NVIC_PRIORITYGROUP_0 ((uint32_t)0x00000000)
#define IRQ_PRI_PENDSV NVIC_EncodePriority(NVIC_PRIORITYGROUP_0, 15, 0)

extern int mp_interrupt_char;
extern ringbuf_t stdin_ringbuf;

Expand Down
Loading

0 comments on commit caa6cf3

Please sign in to comment.