在 Arduino 上面使用 AtomThreads 系统 - 简书

951 阅读1分钟

在 Arduino 上面直接写多任务的应用显然有些不完美,且开发也复杂。
我在 watering 这个项目上使用了 SimpleTimer 作为多任务处理的基础,
在设置的过程中,SimpleTimer 并没有有效的工作。

使用操作系统将很好的解决多任务调度的。

在一个凑巧的机会下,我找到了 AtomThreads ,它是一个小巧的系统,支持 8 位单片机。

于是就封装 AtomThreads-ArduinoAtomThreads 可以直接在 Arduino 里面直接使用。

#include <AtomThreads.h>
#define IDLE_STACK_SIZE_BYTES 128
#define MAIN_STACK_SIZE_BYTES 204
#define DEFAULT_THREAD_PRIO 16
static ATOM_TCB main_tcb;
static uint8_t main_thread_stack[MAIN_STACK_SIZE_BYTES];
static uint8_t idle_thread_stack[IDLE_STACK_SIZE_BYTES];
uint8_t status;

void setup(){
    SP = (int)&idle_thread_stack[(IDLE_STACK_SIZE_BYTES/2) - 1];
    status = atomOSInit(&idle_thread_stack[0], IDLE_STACK_SIZE_BYTES, FALSE);
    if (status == ATOM_OK) {
        avrInitSystemTickTimer();
        status = atomThreadCreate(&main_tcb,
                     DEFAULT_THREAD_PRIO, main_thread_func, 0,
                     &main_thread_stack[0],
                     MAIN_STACK_SIZE_BYTES,
                     FALSE);
        if (status == ATOM_OK) {
            atomOSStart();
        }
    }
}

static void main_thread_func (uint32_t) {
    // initialize digital pin LED_BUILTIN as an output.
    pinMode(LED_BUILTIN, OUTPUT);
    while (1) {
        loop();
    }
}

// Loop and print the time every second.
void loop() {
    digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
    atomTimerDelay(SYSTEM_TICKS_PER_SEC);                       // wait for a second
    digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
    atomTimerDelay(SYSTEM_TICKS_PER_SEC); 
}

watering 中,通过使用 atomThreadCreate 创建不同的进程去处理不同的任务,通过 atomTimerRegisteratomTimerCancel 来控制自动背光灯。整个项目的可靠性和实时性比之前增强了许多,详见 github.com/Lupino/wate…