From 06de6f193132a61dbb5e9b8f9a37e56929f7643b Mon Sep 17 00:00:00 2001 From: inmarket Date: Fri, 23 Dec 2016 08:56:16 +1000 Subject: [PATCH] Updates to Keil RAW32 CPU specific scheduler. Tested working on CortexM7 and CortexM7 with FP. --- src/gos/gos_x_threads_cortexm01.h | 10 +++++++++- src/gos/gos_x_threads_cortexm347.h | 10 +++++++++- src/gos/gos_x_threads_cortexm47fp.h | 10 +++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/gos/gos_x_threads_cortexm01.h b/src/gos/gos_x_threads_cortexm01.h index af6363c3..659d7af7 100644 --- a/src/gos/gos_x_threads_cortexm01.h +++ b/src/gos/gos_x_threads_cortexm01.h @@ -59,8 +59,12 @@ } #elif GFX_COMPILER == GFX_COMPILER_KEIL || GFX_COMPILER == GFX_COMPILER_ARMCC + #define GFX_THREADS_DONE + #define _gfxThreadsInit() static __asm void _gfxTaskSwitch(thread *oldt, thread *newt) { + PRESERVE8 + // Save the old context push {r4, r5, r6, r7, lr} mov r4, r8 @@ -81,6 +85,8 @@ } static __asm void _gfxStartThread(thread *oldt, thread *newt) { + PRESERVE8 + // Calculate where to generate the new context // newt->cxt = (char *)newt + newt->size; ldr r2,[r1,#__cpp(offsetof(thread,size))] @@ -101,13 +107,15 @@ // Run the users function - we save some code because gfxThreadExit() never returns // gfxThreadExit(_gfxCurrentThread->fn(_gfxCurrentThread->param)); - ldr r2,__cpp(&_gfxCurrentThread) + 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 __cpp(gfxThreadExit) + + ALIGN } #else diff --git a/src/gos/gos_x_threads_cortexm347.h b/src/gos/gos_x_threads_cortexm347.h index 2d7e0584..5248508e 100644 --- a/src/gos/gos_x_threads_cortexm347.h +++ b/src/gos/gos_x_threads_cortexm347.h @@ -45,8 +45,12 @@ } #elif GFX_COMPILER == GFX_COMPILER_KEIL || GFX_COMPILER == GFX_COMPILER_ARMCC + #define GFX_THREADS_DONE + #define _gfxThreadsInit() static __asm void _gfxTaskSwitch(thread *oldt, thread *newt) { + PRESERVE8 + // Save the old context push {r4, r5, r6, r7, r8, r9, r10, r11, lr} str sp, [r0,#__cpp(offsetof(thread,cxt))] // oldt->cxt @@ -57,6 +61,8 @@ } static __asm void _gfxStartThread(thread *oldt, thread *newt) { + PRESERVE8 + // Calculate where to generate the new context // newt->cxt = (char *)newt + newt->size; ldr r2,[r1,#__cpp(offsetof(thread,size))] @@ -72,13 +78,15 @@ // Run the users function - we save some code because gfxThreadExit() never returns // gfxThreadExit(_gfxCurrentThread->fn(_gfxCurrentThread->param)); - ldr r2,__cpp(&_gfxCurrentThread) + 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 __cpp(gfxThreadExit) + + ALIGN } #else diff --git a/src/gos/gos_x_threads_cortexm47fp.h b/src/gos/gos_x_threads_cortexm47fp.h index 62812c2e..8134a05d 100644 --- a/src/gos/gos_x_threads_cortexm47fp.h +++ b/src/gos/gos_x_threads_cortexm47fp.h @@ -47,8 +47,12 @@ } #elif GFX_COMPILER == GFX_COMPILER_KEIL || GFX_COMPILER == GFX_COMPILER_ARMCC + #define GFX_THREADS_DONE + #define _gfxThreadsInit() static __asm void _gfxTaskSwitch(thread *oldt, thread *newt) { + PRESERVE8 + // Save the old context push {r4, r5, r6, r7, r8, r9, r10, r11, lr} vpush {s16-s31} @@ -61,6 +65,8 @@ } static __asm void _gfxStartThread(thread *oldt, thread *newt) { + PRESERVE8 + // Calculate where to generate the new context // newt->cxt = (char *)newt + newt->size; ldr r2,[r1,#__cpp(offsetof(thread,size))] @@ -77,13 +83,15 @@ // Run the users function - we save some code because gfxThreadExit() never returns // gfxThreadExit(_gfxCurrentThread->fn(_gfxCurrentThread->param)); - ldr r2,__cpp(&_gfxCurrentThread) + 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 __cpp(gfxThreadExit) + + ALIGN } #else