For Cortex-M3,Cortex-M0, Multitask scheduler library. Arduino due compatible

Dependents:   scheduler-demo-cq-lpc11u35 scheduler-demo scheduler-demo-cq-lpc11u35 mbed-scli-test

Files at this revision

API Documentation at this revision

Comitter:
mimi3
Date:
Sun Aug 25 10:25:11 2013 +0000
Parent:
0:c68459544a17
Child:
2:281cc11b9ae8
Child:
3:6fba65b703b6
Commit message:
For LPC1114FN28.; Scheduler library

Changed in this revision

.hgignore Show annotated file Show diff for this revision Revisions of this file
Scheduler.cpp Show annotated file Show diff for this revision Revisions of this file
Scheduler.h Show annotated file Show diff for this revision Revisions of this file
--- a/.hgignore	Sun Aug 25 16:48:21 2013 +0900
+++ b/.hgignore	Sun Aug 25 10:25:11 2013 +0000
@@ -0,0 +1,7 @@
+syntax: regexp
+\.hgignore
+\.msub
+\.meta
+\.svn
+\.git
+\.ctags
--- a/Scheduler.cpp	Sun Aug 25 16:48:21 2013 +0900
+++ b/Scheduler.cpp	Sun Aug 25 10:25:11 2013 +0000
@@ -1,6 +1,7 @@
 /*
- * Copyright (C) 2012 audin
+ * Copyright (C) 2012-2013 audin
  * This program is licensed under the Apache License, Version 2.0.
+ * 2013/08: Modify for mbed for LPC1114FN28
  * Modified 2012/10: For working on Cortex-M0 and M3.
  *                   Defined static tcb option for the cpu that has quite a less SRAM < 8kbyte.  
  *
@@ -24,6 +25,7 @@
  */
 
 #include <stdint.h>
+#include "mbed.h"
 #include "Scheduler.h"
 
 #define _ARM_CM0_			1		/* 1: Cortex-M0 or M3,  0: Cortex-M3		*/
@@ -77,7 +79,44 @@
 	cur = next;
 	return next;
 }
+#ifdef __CC_ARM 
+__asm static void coopTaskStart(void) {
+	import coopSchedule
+#if _ARM_CM0_
+	/* for Cortex-m0 */
+		mov   r0, r5;
+		blx   r4;
+		movs   r0, #1;
+		bl    coopSchedule;
+	/****	ldmia r0, {r4-r12, lr};	*/
+		adds r0, r0, #16;
+		ldmia r0!, {r4-r7};		/* get r7->r11, r6->r10, r5->r9, r4->r8		*/
+		mov r11, r7;
+		mov r10, r6;
+		mov r9,  r5;
+		mov r8 , r4;
 
+		ldmia r0!, {r4-r5};		/* get r5->lr, r4->r12						*/
+		mov lr,  r5;
+		mov r12, r4;
+
+		subs r0, r0, #40;			/* set offset for r4, 40 = 10reg * 4byte	*/
+		ldmia  r0!, {r4-r7};		/* get r7,r6,r5,r4							*/
+	/**** end ldmia converted by Cortex-M0 instructions	*/
+		msr   msp, r12;			/* use main stack							*/
+		bx    lr;
+#else
+	/* for Cortex-m3 or ARM code cpu */
+		mov   r0, r5;						/* r5 = new task func */
+		blx   r4;							/* r4 = helper func   */
+		movs   r0, #1;						
+		bl    coopSchedule;
+		ldmia r0, {r4-r12, lr};
+		mov   sp, r12;
+		bx    lr;
+#endif
+}
+#else
 static void __attribute__((naked)) __attribute__((noinline)) coopTaskStart(void) {
 #if _ARM_CM0_
 	/* for Cortex-m0 */
@@ -117,7 +156,61 @@
 	);
 #endif
 }
+#endif
 
+#ifdef __CC_ARM
+__asm static void coopDoYield(CoopTask* curTask) {
+#if _ARM_CM0_
+	/* for Cortex-m0 */
+			mrs   r12, msp;
+		/**** stmia r0, {r4-r12, lr}; */
+			stmia r0!, {r4-r7};		/* first store r4-r7 data				*/
+
+			mov r4, r8;
+			mov r5, r9;
+			mov r6, r10;
+			mov r7, r11;
+			stmia r0!, {r4-r7};		/* store r8-r11							*/
+
+			mov r4, r12;
+			mov r5, lr;
+			stmia r0!, {r4,r5};		/* store r12, lr						*/
+		/**** end stmia converted by cortex-m0 instructions	*/
+
+			movs   r0, #0;
+			bl    coopSchedule;
+
+		/**** ldmia r0, {r4-r12, lr};	*/
+			adds r0, r0, #16;			/* set offset for r8					*/
+			ldmia r0!, {r4-r7};		/* get r7->r11, r6->r10, r5->r9, r4->r8 */
+			mov r11, r7;
+			mov r10, r6;
+			mov r9,  r5;
+			mov r8 , r4;
+
+			ldmia r0!, {r4-r5};		/* get r5->lr, r4->r12					*/
+			mov lr,  r5;
+			mov r12, r4;
+
+			subs r0, r0, #40;			/* set offset for r4, 40 = 10reg * 4byte  */
+			ldmia  r0!, {r4-r7};
+		/**** end ldmia converted by Cortex-M0 instructions	*/
+
+			msr   msp, r12;
+			bx    lr;
+#else
+	/* for Cortex-m3 or ARM code cpu */
+			mov   r12, sp;
+			stmia r0, {r4-r12, lr};
+			movs   r0, #0;
+			bl    coopSchedule;
+			ldmia r0, {r4-r12, lr};
+			mov   sp, r12;
+			bx    lr;
+#endif
+}
+
+#else
 static void __attribute__((naked)) __attribute__((noinline)) coopDoYield(CoopTask* curTask) {
 #if _ARM_CM0_
 	/* for Cortex-m0 */
@@ -173,7 +266,7 @@
 #endif
 
 }
-
+#endif
 static int coopInit(void) {
 	CoopTask* task;
 #if _USE_MALLOC_
@@ -243,11 +336,21 @@
 	coopDoYield(cur);
 }
 
+#ifdef MBED_H
+void taskWait(uint32_t ms) {
+    uint32_t start = us_ticker_read();
+    while ((us_ticker_read() - start) < (uint32_t)(ms*1000)){
+		yield();
+    }
+}
+#else
 void wait(uint32_t ms) {
 	uint32_t start = millis();
-	while (millis() - start < ms)
+	while (millis() - start < ms){
 		yield();
+	}
 }
+#endif
 
 #ifdef __cplusplus
 }; // extern "C"
--- a/Scheduler.h	Sun Aug 25 16:48:21 2013 +0900
+++ b/Scheduler.h	Sun Aug 25 10:25:11 2013 +0000
@@ -1,6 +1,7 @@
 /*
- * Copyright (C) 2012 audin
+ * Copyright (C) 2012-2013 audin
  * This program is licensed under the Apache License, Version 2.0.
+ * 2013/08: Modify for mbed for LPC1114FN28
  * Modified 2012/11: v02:
  *		Added external definition of stack size and task number. 
  * Modified 2012/10: v01:
@@ -68,8 +69,11 @@
 	void scheduler_init( void );
 	void scheduler_startLoop( SchedulerTask task );
 	void scheduler_start( SchedulerTask task );
-	
+#ifdef MBED_H
+	void taskWait(uint32_t ms);
+#else
 	void wait(uint32_t ms);
+#endif
 	void yield();
 #ifdef __cplusplus
 }
@@ -84,7 +88,11 @@
 	static void start(SchedulerTask task, uint32_t stackSize = MIN_STACK_SIZE);
 	static void start(SchedulerParametricTask task, void *data, uint32_t stackSize = MIN_STACK_SIZE);
 
+#ifdef MBED_H
+	static void taskWait(uint32_t ms);
+#else
 	static void wait(uint32_t ms) { ::wait(ms); };
+#endif
 	static void yield() { ::yield(); };
 };