在 Arduino 上面直接写多任务的应用显然有些不完美,且开发也复杂。
我在 watering 这个项目上使用了 SimpleTimer 作为多任务处理的基础,
在设置的过程中,SimpleTimer
并没有有效的工作。
使用操作系统将很好的解决多任务调度的。
在一个凑巧的机会下,我找到了 AtomThreads ,它是一个小巧的系统,支持 8 位单片机。
于是就封装 AtomThreads-Arduino 让 AtomThreads
可以直接在 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
创建不同的进程去处理不同的任务,通过 atomTimerRegister
和 atomTimerCancel
来控制自动背光灯。整个项目的可靠性和实时性比之前增强了许多,详见 https://github.com/Lupino/watering/blob/master/watering.ino
网友评论