From ad29f4fee01af58b69d5e0d3b379600c6beba119 Mon Sep 17 00:00:00 2001 From: inmarket Date: Tue, 6 Dec 2016 13:47:33 +1000 Subject: Support for Keil compiler RAW32 CPU specific task switching for Cortex M0,1,3,4,7 --- src/gos/gos_x_threads_cortexm347.h | 50 +++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 19 deletions(-) (limited to 'src/gos/gos_x_threads_cortexm347.h') diff --git a/src/gos/gos_x_threads_cortexm347.h b/src/gos/gos_x_threads_cortexm347.h index 0392e674..522fe9b8 100644 --- a/src/gos/gos_x_threads_cortexm347.h +++ b/src/gos/gos_x_threads_cortexm347.h @@ -46,27 +46,39 @@ #elif GFX_COMPILER == GFX_COMPILER_KEIL || GFX_COMPILER == GFX_COMPILER_ARMCC - static /*__arm*/ void _gfxTaskSwitch(thread *oldt, thread *newt) { -/* push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - str sp, %[oldtcxt] - ldr sp, %[newtcxt] + static __asm void _gfxTaskSwitch(thread *oldt, thread *newt) { + // Save the old context + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + str sp, [r0,#__cpp(offsetof(thread,cxt))] // oldt->cxt + + // Load the new context + ldr sp, [r1,#__cpp(offsetof(thread,cxt))] // newt->cxt pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} - : [newtcxt] "=m" (newt->cxt) - : [oldtcxt] "m" (oldt->cxt) - : "memory"); -*/ } + } - static /* __arm */ void _gfxStartThread(thread *oldt, thread *newt) { - newt->cxt = (char *)newt + newt->size; -/* push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - str sp, %[oldtcxt] - ldr sp, %[newtcxt] - : [newtcxt] "=m" (newt->cxt) - : [oldtcxt] "m" (oldt->cxt) - : "memory"); -*/ - // Run the users function - gfxThreadExit(current->fn(current->param)); + static __asm void _gfxStartThread(thread *oldt, thread *newt) { + // Calculate where to generate the new context + // newt->cxt = (char *)newt + newt->size; + ldr r2,[r1,#__cpp(offsetof(thread,size))] + add r2,r2,r1 + str r2,[r1,#__cpp(offsetof(thread,cxt))] + + // Save the old context + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + str sp, [r0,#__cpp(offsetof(thread,cxt))] // oldt->cxt + + // Load the new (imcomplete) context + ldr sp, [r1,#__cpp(offsetof(thread,cxt))] // newt->cxt + + // Run the users function - we save some code because gfxThreadExit() never returns + // gfxThreadExit(current->fn(current->param)); + LDR r2,__cpp(&_gfxCurrentThread) + LDR r2,[r2,#0] + LDR r0,[r2,#__cpp(offsetof(thread,param))] + LDR r1,[r2,#__cpp(offsetof(thread,fn))] + BLX r1 + MOV r4,r0 + BL gfxThreadExit } #else -- cgit v1.2.3