NuttX の "task_create"、"マルチコア"と来たら、次はやはり本家 POSIX のスレッド "pthread" でしょう。ということで、今回は "pthread" で LED を制御してみました。





相変わらず画像は使いまわしで失礼します…^^;

pthread はご存じの方が多いと思いますが、Arduino IDE から使う人はあまりいないのではないでしょうか?ということで、今回もスケッチでご紹介します!



#include &ltpthread.h>

#define MAXLOOP 60
static int gMainLoop = 0;

struct led_settings {
int durationH;
int durationL;
};

inline void led_process(int led_num, int durationH, int durationL, String funcname) {

int pin_num = 0;
switch (pin_num) {
case 0: pin_num = LED0; break;
case 1: pin_num = LED1; break;
case 2: pin_num = LED2; break;
case 3: pin_num = LED3; break;
}

Serial.println("========================================");
Serial.println("Task name : " + funcname);
Serial.println("LED" + String(led_num) + " blink interval");
Serial.println("High duration: " + String(durationH) + " msec");
Serial.println("Low duration: " + String(durationL) + " msec");
Serial.println("========================================\n");

while (gMainLoop < MAXLOOP) {
digitalWrite(pin_num, HIGH);
usleep(durationH * 1000); // msec to usec
digitalWrite(pin_num, LOW);
usleep(durationL * 1000); // msec to usec
/* You cannot use "delay(msec)" because it is *
* a busywait that will not yield the process */
}

Serial.println("Exit: " + funcname);
return;
}

// pthread
static void led0_thread(void *arg) {
struct led_settings *param = (struct led_settings*)arg;
led_process(0, param->durationH, param->durationL, __FUNCTION__);
return;
}

static void led1_thread(void *arg) {
struct led_settings *param = (struct led_settings*)arg;
led_process(1, param->durationH, param->durationL, __FUNCTION__);
return;
}

static void led2_thread(void *arg) {
struct led_settings *param = (struct led_settings*)arg;
led_process(2, param->durationH, param->durationL, __FUNCTION__);
return;
}

static void led3_thread(void *arg) {
struct led_settings *param = (struct led_settings*)arg;
led_process(3, param->durationH, param->durationL, __FUNCTION__);
return;
}


void setup() {

Serial.begin(115200);

pinMode(LED0, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);

pthread_t led0, led1, led2, led3;
struct led_settings param0, param1, param2, param3;

param0.durationH = 100;
param0.durationL = 200;
pthread_create(&ampled0, NULL, led0_thread, (void*)&ampparam0);

param1.durationH = 200;
param1.durationL = 200;
pthread_create(&ampled1, NULL, led1_thread, (void*)&ampparam1);

param2.durationH = 500;
param2.durationL = 100;
pthread_create(&ampled2, NULL, led2_thread, (void*)&ampparam2);

param3.durationH = 100;
param3.durationL = 500;
pthread_create(&ampled3, NULL, led3_thread, (void*)&ampparam3);

}

void loop() {
++gMainLoop;
Serial.println("MainLoop: " + String(gMainLoop));
sleep(1);

if (gMainLoop >= MAXLOOP) {
sleep(1); // wait for the end of all threads
Serial.println("End of all threads");
while (1);
}
}



pthread そのものの使い方は知っている人も多いと思うので解説は省きます。Arduino IDE からも使えますよ~ということを言いたかっただけなので。
(^^)/~