SPRESENSE で pthread でLEDを制御してみた! [SPRESENSE]
NuttX の "task_create"、"マルチコア"と来たら、次はやはり本家 POSIX のスレッド "pthread" でしょう。ということで、今回は "pthread" で LED を制御してみました。
相変わらず画像は使いまわしで失礼します…^^;
pthread はご存じの方が多いと思いますが、Arduino IDE から使う人はあまりいないのではないでしょうか?ということで、今回もスケッチでご紹介します!
pthread そのものの使い方は知っている人も多いと思うので解説は省きます。Arduino IDE からも使えますよ~ということを言いたかっただけなので。
(^^)/~
相変わらず画像は使いまわしで失礼します…^^;
pthread はご存じの方が多いと思いますが、Arduino IDE から使う人はあまりいないのではないでしょうか?ということで、今回もスケッチでご紹介します!
#include <pthread.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(&led0, NULL, led0_thread, (void*)&param0); param1.durationH = 200; param1.durationL = 200; pthread_create(&led1, NULL, led1_thread, (void*)&param1); param2.durationH = 500; param2.durationL = 100; pthread_create(&led2, NULL, led2_thread, (void*)&param2); param3.durationH = 100; param3.durationL = 500; pthread_create(&led3, NULL, led3_thread, (void*)&param3); } 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 からも使えますよ~ということを言いたかっただけなので。
(^^)/~
コメント 0