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
Revision 1:8967b575bb46, committed 2013-08-25
- 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
--- 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(); };
};