SSブログ

SPRESENSE で pthread でLEDを制御してみた! [SPRESENSE]

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


DSC_0001_BURST20191019170915259.JPG


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

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 からも使えますよ~ということを言いたかっただけなので。
(^^)/~






nice!(30)  コメント(0) 
共通テーマ:趣味・カルチャー

nice! 30

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。