|
@@ -4,10 +4,10 @@
|
|
|
* @brief Task Structure
|
|
|
*/
|
|
|
typedef struct task {
|
|
|
- void (*pFunc) (void);
|
|
|
- uint32_t delay;
|
|
|
- uint32_t period;
|
|
|
- int run;
|
|
|
+ void (*pFunc) (void);
|
|
|
+ uint32_t delay;
|
|
|
+ uint32_t period;
|
|
|
+ int run;
|
|
|
} task_t;
|
|
|
|
|
|
|
|
@@ -41,45 +41,46 @@ void RTOS_Init(void) {
|
|
|
* @param taskPeriod task start period
|
|
|
*/
|
|
|
void RTOS_SetTask (void (*taskFunc)(void), uint32_t taskDelay, uint32_t taskPeriod) {
|
|
|
- int i;
|
|
|
+ int i;
|
|
|
|
|
|
- if (!taskFunc) {
|
|
|
+ if (!taskFunc) {
|
|
|
return;
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
|
|
|
- for(i = 0; i < arrayTail; i++) {
|
|
|
-
|
|
|
- if (TaskArray[i].pFunc == taskFunc) {
|
|
|
- __disable_irq();
|
|
|
-
|
|
|
- TaskArray[i].delay = taskDelay;
|
|
|
- TaskArray[i].period = taskPeriod;
|
|
|
- TaskArray[i].run = 0;
|
|
|
-
|
|
|
- __enable_irq();
|
|
|
-
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if (arrayTail < MAX_TASKS) {
|
|
|
-
|
|
|
+ for(i = 0; i < arrayTail; i++) {
|
|
|
+
|
|
|
+ if (TaskArray[i].pFunc == taskFunc) {
|
|
|
__disable_irq();
|
|
|
|
|
|
- TaskArray[arrayTail].pFunc = taskFunc;
|
|
|
- TaskArray[arrayTail].delay = taskDelay;
|
|
|
- TaskArray[arrayTail].period = taskPeriod;
|
|
|
- TaskArray[arrayTail].run = 0;
|
|
|
+ TaskArray[i].delay = taskDelay;
|
|
|
+ TaskArray[i].period = taskPeriod;
|
|
|
+ TaskArray[i].run = 0;
|
|
|
|
|
|
-
|
|
|
- arrayTail++;
|
|
|
__enable_irq();
|
|
|
- } else {
|
|
|
-
|
|
|
- while (1);
|
|
|
- }
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (arrayTail < MAX_TASKS) {
|
|
|
+
|
|
|
+ __disable_irq();
|
|
|
+
|
|
|
+ TaskArray[arrayTail].pFunc = taskFunc;
|
|
|
+ TaskArray[arrayTail].delay = taskDelay;
|
|
|
+ TaskArray[arrayTail].period = taskPeriod;
|
|
|
+ TaskArray[arrayTail].run = 0;
|
|
|
+
|
|
|
+
|
|
|
+ arrayTail++;
|
|
|
+ __enable_irq();
|
|
|
+ } else {
|
|
|
+
|
|
|
+ display_String("Sheduler Error: No left space for new Tasks!\0", 3);
|
|
|
+ while(1);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
@@ -88,61 +89,61 @@ void RTOS_SetTask (void (*taskFunc)(void), uint32_t taskDelay, uint32_t taskPeri
|
|
|
* @param taskFunc function pointer
|
|
|
*/
|
|
|
void RTOS_DeleteTask (void (*taskFunc)(void)) {
|
|
|
- int i;
|
|
|
-
|
|
|
-
|
|
|
- for (i=0; i<arrayTail; i++) {
|
|
|
-
|
|
|
- if (TaskArray[i].pFunc == taskFunc) {
|
|
|
- __disable_irq();
|
|
|
-
|
|
|
- if (i != (arrayTail - 1)) {
|
|
|
-
|
|
|
- TaskArray[i] = TaskArray[arrayTail - 1];
|
|
|
- }
|
|
|
-
|
|
|
- arrayTail--;
|
|
|
- __enable_irq();
|
|
|
- return;
|
|
|
+ int i;
|
|
|
+
|
|
|
+
|
|
|
+ for (i=0; i<arrayTail; i++) {
|
|
|
+
|
|
|
+ if (TaskArray[i].pFunc == taskFunc) {
|
|
|
+ __disable_irq();
|
|
|
+
|
|
|
+ if (i != (arrayTail - 1)) {
|
|
|
+
|
|
|
+ TaskArray[i] = TaskArray[arrayTail - 1];
|
|
|
}
|
|
|
- }
|
|
|
+
|
|
|
+ arrayTail--;
|
|
|
+ __enable_irq();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
|
* @brief RTOS dispatcher, called in main
|
|
|
*/
|
|
|
void RTOS_DispatchTask(void) {
|
|
|
- int i;
|
|
|
- void (*function) (void);
|
|
|
-
|
|
|
- for (i=0; i<arrayTail; i++) {
|
|
|
-
|
|
|
- if (TaskArray[i].run != 0) {
|
|
|
-
|
|
|
- function = TaskArray[i].pFunc;
|
|
|
- if (TaskArray[i].period == 0) {
|
|
|
-
|
|
|
- RTOS_DeleteTask(TaskArray[i].pFunc);
|
|
|
- } else {
|
|
|
-
|
|
|
- TaskArray[i].run = 0;
|
|
|
-
|
|
|
- if (!TaskArray[i].delay) {
|
|
|
-
|
|
|
- TaskArray[i].delay = TaskArray[i].period-1;
|
|
|
-
|
|
|
- }
|
|
|
+ int i;
|
|
|
+ void (*function) (void);
|
|
|
+
|
|
|
+ for (i=0; i<arrayTail; i++) {
|
|
|
+
|
|
|
+ if (TaskArray[i].run != 0) {
|
|
|
+
|
|
|
+ function = TaskArray[i].pFunc;
|
|
|
+ if (TaskArray[i].period == 0) {
|
|
|
+
|
|
|
+ RTOS_DeleteTask(TaskArray[i].pFunc);
|
|
|
+ } else {
|
|
|
+
|
|
|
+ TaskArray[i].run = 0;
|
|
|
+
|
|
|
+ if (!TaskArray[i].delay) {
|
|
|
+
|
|
|
+ TaskArray[i].delay = TaskArray[i].period-1;
|
|
|
+
|
|
|
}
|
|
|
-
|
|
|
- (*function)();
|
|
|
}
|
|
|
- }
|
|
|
+
|
|
|
+ (*function)();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
|
* @brief Inserts a delay time.
|
|
|
*
|
|
|
- * @param msek specifies the delay time length, in milliseconds.
|
|
|
+ * @param msek specifies the delay time length, in milliseconds.
|
|
|
*/
|
|
|
void tdelay_ms(uint32_t msek) {
|
|
|
|
|
@@ -154,7 +155,7 @@ void tdelay_ms(uint32_t msek) {
|
|
|
RTOS_DispatchTask();
|
|
|
}
|
|
|
|
|
|
- __WFI();
|
|
|
+ __WFI();
|
|
|
} while (TDelay != 0);
|
|
|
|
|
|
}
|