Renesas Community
Renesas Community
  • User
    Join or sign in
  • Site
  • Search Community
  • User
  • Renesas Engineering Community
  • FAQ
  • HELP
  • More
  • Cancel
がじぇっとるねさすコミュニティ
がじぇっとるねさすコミュニティ
GR-PEACH GR-PEACHでマルチタスクなArduinoスケッチ with TOPPERS
  • Forums
  • Files
  • がじぇっとるねさす ゆーざー会 - Wiki
  • Tags
  • More
  • Cancel
  • New

 

 GR-SAKURA

 GR-KURUMI

 GR-COTTON

 GR-CITRUS

 GR-PEACH

 GR-KAEDE

 GR-ADZUKI

 GR-LYCHEE

 GR-ROSE

 GR-MANGO(*)

 SNShield

 Web Compiler

 IDE for GR

 TOPPERS関連

 女子美コラボ

 その他

 ※プロデューサミーティング中

 作り方使い方資料

 イベント関連

 作品記事

 体験記事

 その他

 

 ライブラリ

 ツール

 その他・過去ファイル

  • Replies 2 replies
  • Subscribers 438 subscribers
  • Views 7002 views
  • Users 0 members are here
  • マルチタスク
  • GR-PEACH
Options
  • Share
  • More
  • Cancel
Related Tags
  • AUDIO CAMERA Shield
  • CAMERA
  • define
  • FreeRTOS
  • GR-PEACH
  • GR-PEACH RZ/A1 Linux
  • lcd
  • mbed
  • MTU2
  • NTSC
  • OpenCV
  • RZA1H
  • SoftwareStandbyMode
  • TOPPERS
  • UART
  • Webカメラ
  • マルチタスク
  • 位相計数モード
Related

GR-PEACHでマルチタスクなArduinoスケッチ with TOPPERS

Okamiya Yuuki
Okamiya Yuuki over 6 years ago

がじぇるね岡宮です。

マルチタスクなArduino、ステキですね。以下のようなスケッチです。loopが複数あり、並列に動かすような感じです。初めて動かしたとき、若干衝撃的でした。

void setup(){

}

void loop(){

}

void loop1(){

}

void loop2(){

}

まず、オープンソースのリアルタイムOSとしてTOPPERSがありまして、GR-PEACHで動かすことができます。

以下は、EclipseベースのTrueSTUDIOで開発する例が紹介されています。

http://qiita.com/exshonda/items/3742799cbc648e0505f7

 

さらにWebコンパイラにもTOPPERS環境を用意しました。

ちなみにGR-PEACHではじめてWebコンパイラを使われる場合はこちらを参照してください。

「はじめてのGR-PEACH (Webコンパイラ編)」

(2016年7月2日のTOPPERSワークショップ向けに公開しました! 松原先生ありがとうございました!)

 

はじめてプロジェクトを作ると、以下のプロジェクトが展開されます。

従来のようにgr_sketch.cppのようなソースがルートフォルダにないのですが、exampleの中に入っています。

以下のgithubリポジトリから作成したもので、基本的に構成を変えないという方針の下、Webコンパイラに乗っけています。

https://github.com/ncesnagoya/asp-gr_peach_gcc-mbed

 

デフォルトの状態でビルドすると、以下のblinkyサンプルがビルドされます。

ビルド実行を行って、GR-PEACHに書き込むと、LEDがチカチカします。プログラムはblinky.cppに記載されおり、これはArduinoスケッチにはなっていません。

 

次に本題のArduinoでマルチタスクスケッチをしてみます。

ルートフォルダにあるbuild_targetにビルド実行をするフォルダが記載されています。デフォルトでは./example/blinkyになっています。

このため、blinkyサンプルをビルド実行するようになっています。

このbuild_targetの記載を./examples/multitask_arduinoにします。

ビルド実行をします。。。。。。ビルドに3分くらいかかりますが、これは初回だけですので根気よく待ちましょう。

。

待ったわりにはLチカしかしないのですが、examplesの中のソースファイルmultitask_arduino.cppを開いてみましょう。

loop()の他にloop1(), loop2()があります。不思議な光景ですね。

以下のように書き換えて(コピペでいいです)、ビルド実行し、GR-PEACHに書き込んでみましょう。

void loop()
{
while(digitalRead(PIN_SW) == 0){
digitalWrite(PIN_LED_USER, 1);
delay(INTERVAL);
digitalWrite(PIN_LED_USER, 0);
delay(INTERVAL);
}
}

void loop1(){
digitalWrite(PIN_LED_GREEN, 1);
delay(INTERVAL_GREEN);
digitalWrite(PIN_LED_GREEN, 0);
delay(INTERVAL_GREEN);
}

void loop2(){
digitalWrite(PIN_LED_BLUE, 1);
delay(INTERVAL_BLUE);
digitalWrite(PIN_LED_BLUE, 0);
delay(INTERVAL_BLUE);
}

loop()ではwhileでずっとユーザスイッチを監視して赤LED(ユーザーLED)を点滅。

loop1()は緑LEDを点滅。

loop2()は青LEDを点滅。

GR-PEACHのユーザスイッチを押すと、赤LEDが点滅しつつも緑LEDも青LEDも点滅します。

不思議というか、なんだか面白いですね。

このマルチタスクプログラムの説明は以下に記載されています。 

https://github.com/ncesnagoya/asp-gr_peach_gcc-mbed/wiki/Running-example-programs

 

以下は温湿度センサーHDC1000のシリアル出力も含めた全部のスケッチ例です。

HDC1000のSCL/SDAをWireのピン、RDYをピン2につなげる必要があります。

#include <kernel.h>
#include <t_syslog.h>
#include <t_stdlib.h>
#include "syssvc/serial.h"
#include "syssvc/syslog.h"
#include "kernel_cfg.h"

#include "arduino_app.h"
#include "arduino_main.h"

/* GR-PEACH Sketch Template V1.00 */
#include <Arduino.h>
#include <Wire.h>

#define HDC1000_ADDRESS 0x40
#define HDC1000_RDY_PIN 2

#define HDC1000_TEMPERATURE_POINTER 0x00
#define HDC1000_HUMIDITY_POINTER 0x01
#define HDC1000_CONFIGURATION_POINTER 0x02
#define HDC1000_SERIAL_ID1_POINTER 0xfb
#define HDC1000_SERIAL_ID2_POINTER 0xfc
#define HDC1000_SERIAL_ID3_POINTER 0xfd
#define HDC1000_MANUFACTURER_ID_POINTER 0xfe

#define HDC1000_CONFIGURE_MSB 0x10 /* Get both temperature and humidity */
#define HDC1000_CONFIGURE_LSB 0x00 /* 14 bit resolution */

void getTemperatureAndHumidity(float *temperature, float *humidity) {
unsigned int tData, hData;

Wire.beginTransmission(HDC1000_ADDRESS);
Wire.write(HDC1000_TEMPERATURE_POINTER);
Wire.endTransmission();
while (digitalRead(HDC1000_RDY_PIN) == HIGH);
Wire.requestFrom(HDC1000_ADDRESS, 4);
while (Wire.available() < 4);

tData = Wire.read() << 8;
tData |= Wire.read();

hData = Wire.read() << 8;
hData |= Wire.read();

*temperature = tData / 65536.0 * 165.0 - 40.0;
*humidity = hData / 65536.0 * 100.0;
}

#define INTERVAL 100
#define INTERVAL_RED 100
#define INTERVAL_BLUE 150
#define INTERVAL_GREEN 200

void setup()
{
pinMode(PIN_LED_RED , OUTPUT);
pinMode(PIN_LED_GREEN , OUTPUT);
pinMode(PIN_LED_BLUE , OUTPUT);
pinMode(PIN_LED_USER , OUTPUT);
pinMode(PIN_SW , INPUT);
pinMode(HDC1000_RDY_PIN, INPUT);

Serial.begin(9600);
//Put the HDC1000 IC into the correct operating mode
Wire.beginTransmission(HDC1000_ADDRESS);
Wire.write(HDC1000_CONFIGURATION_POINTER);
Wire.write(HDC1000_CONFIGURE_MSB);
Wire.write(HDC1000_CONFIGURE_LSB);
Wire.endTransmission();
}

void loop1()
{
while(digitalRead(PIN_SW) == 0){
digitalWrite(PIN_LED_USER, 1);
delay(INTERVAL);
digitalWrite(PIN_LED_USER, 0);
delay(INTERVAL);
}
}

void loop(){
float temperature, humidity;

getTemperatureAndHumidity(&temperature, &humidity);
Serial.print("Temperature = ");
Serial.print(temperature);
Serial.print(" degree, Humidity = ");
Serial.print(humidity);
Serial.println("%");
Serial.flush();

delay(1000);
}

void loop2(){
digitalWrite(PIN_LED_BLUE, 1);
delay(INTERVAL_BLUE);
digitalWrite(PIN_LED_BLUE, 0);
delay(INTERVAL_BLUE);
}

/*
* Cyclic Handler
*
* This handler is called every 10 [ms] as specified in
* multitask_arduino.cfg.
*/
void cyclic_handler(intptr_t exinf) {
irot_rdq(LOOP_PRI); /* change the running loop. */
}

  • Reply
  • Cancel
  • Cancel
  • @chobichan
    @chobichan over 6 years ago

    え!、KURUMIやSAKURA用に、RTOSじゃないけれどマルチタスクを過去に発表しているのに。

    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
  • hrn
    hrn 3 months ago

    どうも。

    かなり古い話を確認して大変申し訳ございません。

    GR-PeachとGR-Lycheeを始めようと思って色々揃えているところですが、マルチタスクに関して確認させていただきたいことがあります。

    IDE for GR (ver 1.14)にてloop1()、loop2()などを使ってマルチタスクでプログラムをしたいのですが、可能でしょうか?どのライブラリをどのようにincludeする必要がありますか?

    手元にあるPeachにloop1をテストしたところ、全く応じていません。

    ご教示いただけると幸いです。

    • Cancel
    • Up 0 Down
    • Reply
    • Cancel
サイト使用条件
プライバシーポリシー
お問い合わせ
© 2010-2023 Renesas Electronics Corporation. All rights reserved.