]> Zhao Yanbai Git Server - acecode.git/commitdiff
...
authorAceVest <zhaoyanbai@126.com>
Mon, 18 Jun 2018 07:11:54 +0000 (15:11 +0800)
committerAceVest <zhaoyanbai@126.com>
Mon, 18 Jun 2018 07:11:54 +0000 (15:11 +0800)
arduino/hardware/ace/avr/cores/avr/AceAvr.h
arduino/hardware/ace/avr/cores/avr/Arduino.h
arduino/hardware/ace/avr/cores/avr/kernel.cpp
arduino/hardware/ace/avr/cores/avr/kernel.h
arduino/hardware/ace/avr/cores/avr/main.cpp
arduino/hardware/ace/avr/cores/avr/timer.cpp

index 38fb06240bf6909ac440a12a4c12091fdf72b3ac..c2a676d844bf8e418140628315b69fa6ede168e6 100644 (file)
@@ -59,3 +59,5 @@ volatile uint8_t* get_digital_pin_port_output_register(uint8_t pin);
 
 void set_digital_pin_mode(uint8_t pin, uint8_t mode);
 void digital_write(uint8_t pin, uint8_t val);
+void yield(void);
+
index f90c621714e7801139ace30b67d33ab238fe0d40..fa3dd6228129056daf7c87cf71599920074f1154 100644 (file)
@@ -8,6 +8,4 @@
  */
 
 #pragma once
-
 #include <AceAvr.h>
-
index aa5cf9a89b53d8f1c784459e7736ce66ac5650eb..31875da46402d81864bfef5b6cec7504e94e7365 100644 (file)
 
 void delay(unsigned long ms);
 
+const uint8_t task_cnt = MAX_TASK_CNT + 1;
+const uint8_t idle_task_priority = task_cnt - 1;
 struct task *current_task = 0;
-const uint8_t max_task_cnt = 8;
-struct task tasks[max_task_cnt];
-uint8_t idle_task_stack[TASK_STACK_SIZE];
+struct task tasks[task_cnt];
 uint32_t ticks = 0;
-void task_scheduler();
+int8_t kernel_initialized = 0;
 
-#define IDLE_TASK (tasks+max_task_cnt-1)
+#define IDLE_TASK (tasks+task_cnt-1)
 #define LED_TASK (tasks+0);
 #define DEBUG_TASK (tasks+1);
 
+void task_scheduler();
+
 uint8_t debug_task_stack[TASK_STACK_SIZE];
 void debug_task() {
     while(1) task_delay(1000);
     uint8_t pin = 12;
     set_digital_pin_mode(pin, OUTPUT);
-
     while(1) {
         digital_write(pin, HIGH);
         task_delay(20);
@@ -40,7 +41,6 @@ uint8_t led_task_stack[TASK_STACK_SIZE];
 void led_task() {
     uint8_t pin = 13;
     set_digital_pin_mode(pin, OUTPUT);
-
     while(1) {
         digital_write(pin, HIGH);
         task_delay(10);
@@ -52,9 +52,11 @@ void led_task() {
 
 // idle_task 在没有进程READY的情况下都会调度运行
 // 所以task_delay不能在此进程生效
+uint8_t idle_task_stack[TASK_STACK_SIZE];
+uint32_t idle_cnt = 0;
 void idle_task() {
     sei();
-    static uint32_t idle_cnt = 0;
+    kernel_initialized = 1;
     uint8_t pin = 12;
     set_digital_pin_mode(pin, OUTPUT);
     uint8_t state = LOW;
@@ -66,6 +68,7 @@ void idle_task() {
     }
 }
 
+
 void task_delay(uint16_t ticks)
 {
     cli();
@@ -77,7 +80,11 @@ void task_delay(uint16_t ticks)
 
 void create_task(void (*handler)(), uint8_t *stack, uint8_t priority)
 {
-    if(priority >= max_task_cnt) {
+    if(priority == idle_task_priority && handler != idle_task) {
+        return;
+    }
+
+    if(priority > task_cnt) {
         return;
     }
 
@@ -210,30 +217,9 @@ void task_switch(struct task *prev, struct task *next) {
     );
 }
 
-void init_tasks() {
-    cli();
-    for(uint8_t i=0; i<max_task_cnt; i++) {
-        struct task *t = tasks+i;
-        t->pid          = i;
-        t->handler      = 0;
-        t->stack        = 0;
-        t->state        = TASK_STATE_EMPTY;
-        t->delay_ticks  = 0;
-    }
-
-    create_task(led_task, led_task_stack, 0);
-    create_task(debug_task, debug_task_stack, 1);
-    create_task(idle_task, idle_task_stack, max_task_cnt-1);
-    current_task = IDLE_TASK;
-    IDLE_TASK->stack = idle_task_stack+TASK_STACK_SIZE - 3;
-
-    SP = (uint16_t)(IDLE_TASK->stack);
-    asm("ret;");
-}
-
 void task_scheduler() {
     struct task *next = IDLE_TASK;
-    for(uint8_t i=0; i<max_task_cnt; i++) {
+    for(uint8_t i=0; i<task_cnt; i++) {
         struct task *t = tasks+i;
         if(TASK_STATE_READY == t->state) {
             next = t;
@@ -244,13 +230,21 @@ void task_scheduler() {
     task_switch(current_task, next);
 }
 
+void yield(void)
+{
+    if(kernel_initialized == 0) {
+        return ;
+    }
+
+    task_scheduler();
+}
 
 extern "C" void TIMER1_COMPA_vect() __attribute__ ((signal,used, externally_visible));
 void TIMER1_COMPA_vect()
 {
     ticks++;
 
-    for(uint8_t i=0; i<max_task_cnt; i++) {
+    for(uint8_t i=0; i<task_cnt; i++) {
         struct task *t = tasks+i;
         if(TASK_STATE_SLEEP != t->state) {
             continue;
@@ -282,3 +276,26 @@ void init_timer1() {
     // enable timer compare interrupt
     TIMSK1 |= (1 << OCIE1A);
 }
+
+void init_tasks() {
+    cli();
+    for(uint8_t i=0; i<task_cnt; i++) {
+        struct task *t = tasks+i;
+        t->pid          = i;
+        t->handler      = 0;
+        t->stack        = 0;
+        t->state        = TASK_STATE_EMPTY;
+        t->delay_ticks  = 0;
+    }
+
+    create_task(led_task, led_task_stack, 0);
+    create_task(debug_task, debug_task_stack, 1);
+    create_task(idle_task, idle_task_stack, idle_task_priority);
+    current_task = IDLE_TASK;
+    IDLE_TASK->stack = idle_task_stack+TASK_STACK_SIZE - 3;
+
+    SP = (uint16_t)(IDLE_TASK->stack);
+    asm("ret;");
+}
+
+
index 63606e422270367bd09744f4a9b28c7c6fb21583..6cf0863ee3073e8cb5fb52f34d94a493e92ae68b 100644 (file)
 #pragma once
 #include <stdint.h>
 
+#define MAX_TASK_CNT    8
 #define TASK_STACK_SIZE 64
 
+#if MAX_TASK_CNT > 32
+#error "too much tasks"
+#endif
+
 enum task_state {
     TASK_STATE_EMPTY  = 0,
     TASK_STATE_READY  = 1,
@@ -30,3 +35,4 @@ void init_tasks();
 void create_task(void (*handler)(), char *stack, uint8_t priority);
 void task_switch(struct task *prev, struct task *next);
 void task_delay(uint16_t ticks);
+//void yield(void);
index 8e4ee2a30e3383dec53d0ce12c97993b15ecb6e4..3881bbd16e881bea8f03be130f216baf0e76a81a 100644 (file)
@@ -6,7 +6,7 @@
  * Description: none
  * ------------------------------------------------------------------------
  */
-#include <Arduino.h>
+#include <AceAvr.h>
 
 void init_timer0();
 void init_timer1();
index ea3dde6b8397369a6c3f55a734209568e6607a26..ac02f3aae6116ec16ccac657bb0a49a0075fbd62 100644 (file)
@@ -7,19 +7,10 @@
  * ------------------------------------------------------------------------
  */
 
-#include<Arduino.h>
+#include<AceAvr.h>
 
 
 volatile unsigned long timer0_overflow_count = 0;
-#if 0
-static void __empty() {
-    // Empty
-}
-
-void yield(void) __attribute__ ((weak, alias("__empty")));
-#else
-void yield(void) { }
-#endif
 
 unsigned long micros() {
     unsigned long m;