===================================================================== TOPPERS RTE/RTOS compatible with Arduino libraries : RCA Last Modified:2015 Nov 24 23:46:50 ===================================================================== ○ToDo ・SPI/I2Cの共有のためのセマフォの追加 ○概要 TOPPERS RTE/RTOS compatible with Arduino libraries(RCA)は,TOPPERS上で Arduino ライブラリを使用するための環境である. 多くのコードをArduino IDE付属の物をベースとしているため,ライセンスは GPLである.各コードのライセンスはコード毎のライセンスに従う. ○サポート サポートしているプロセッサは,Arduino M0/M0 Pro である. ○動作確認済みのバージョン 動作確認済みのバージョンは次の通りである. ・Arduino IDE 1.7.8 ・TOPPERS/ASPカーネル 1.9.2 Atmel Studio 7.0 (build 594) ○クイックスタート(デバッガなし) Windows環境でのデバッガなしの実行方法について説明する. ●インストール Arduino IDE のインストール ・http://www.arduino.org/ からダウンロードしてインストール. ・インストーラに従ってインストールを実施する. Arduino IDE のインストールパスの設定 ・C:\Program Files (x86)\Arduino にインストールした場合は必要ない ・インストールしてフォルダを以下のファイルに設定する ・example/do_path.bat SET ARDUINO_DIR=C:\Program Files (x86)\Arduino ・asp_1.9.1/target/arduino_m0_gcc/ ARDUINO_BASE_DIR_WIN = C:\Program Files (x86)\Arduino ●ビルド ・フォルダ ./example/basic を開く ・./do_make.bat を実行 ●実行 ・ボードのPROGRAMポートとUSBを接続する. ・Arduino IDEを起動する ・ツール -> ポート -> COMx(Arduino M0 Pro (Programmmming Port)) を選択. ・ツール -> シリアルモニタ を選択してシリアルモニタを実行する. ・シリアルモニタの右下の速度を115200bpsに変更 ・フォルダ ./example/basic を開く ・./do_run.bat を実行 ●デバッグ ・フォルダ ./example/basic を開く ・./do_debug.bat を実行 ●クリーン ・フォルダ ./example/basic を開く ・./do_clean.bat を実行 ○クイックスタート(デバッガあり) Windows環境でのデバッガありの実行方法について説明する. ●インストール Atmel Studio のインストール ・ http://www.atmel.com/ja/jp/tools/ATMELSTUDIO.aspx からダウンロードしてインストール. ・インストーラに従ってインストールを実施する. ●プロジェクトを開く 各サンプルのフォルダ以下にある, \example\basic\asp.atsln をタブルクリックするとAtmel Studioが起動する. ●ビルド メニュー -> Build -> Build Solution を実行 ●実行 メニュー -> Debug -> Start Debugging and Brake を実行 メモリに書き込まれるため,実行を開始する. ファイルメニューからrca_app.cpp を選択してブレークポイントを置くことが 可能. ○動作モデル Arduinoライブラリを実行するためのタスクとして,メインタスクとタスク1, タスク2,...(RCAタスク)を用意している.メインタスクは必ず生成され,RCA タスクは,幾つ生成するかはマクロで定義可能である.現状最大数は4個である. それぞれのタスク名は次の通りである. メインタスク : RCA_MAINTASK タスク1 : RCA_TASK1 タスク2 : RCA_TASK2 タスク3 : RCA_TASK3 タスク4 : RCA_TASK4 各タスクは,次の関数を実行する.これらの関数の本体を記述する. メインタスク : setup/loop タスク1 : task1_setup/task2_loop タスク2 : task2_setup/task2_loop タスク3 : task3_setup/task3_loop タスク4 : task4_setup/task4_loop 各setup/loopの振る舞いはArduinoと同等である. ○スケジューリング 基本的には優先度ベースのスケジュールである. 各タスクのsetup実行時(起動時)とloop実行時の優先度をそれぞれマクロで指 定可能である. オプションでラウンドロビンスケジューリングを選択可能である.ラウンドロ ビンの周期とラウンドロビンの対象とする優先度をマクロで指定可能である. ○ライブラリ 次のライブラリは動作確認済みである コアライブラリ コアライブラリは常にコンパイル&リンクされる. ・PWM ・digital入出力 ・delay ・analog入出力 ・attachInterrupt() noInterrupt() : Primaskを使用しているため問題ない ・USB Uart ・Tone その他のライブラリ 次のライブラリは使用する場合はMakefileで各マクロをtrueに定義すること. ・SPI : USE_ARDUINO_SPI ・SD : USE_ARDUINO_SD ・TFT : USE_ARDUINO_TFT ・RTC : USE_ARDUINO_RTC ・I2C : USE_ARDUINO_WIRE ・ETHERNET2 : USE_ETHERNET2 ・NAXESMOTION : USE_NAXESMOTION ・NCESCAN : USE_NCESCAN 次のライブラリは動作未確認である. ○ファイル ./lib ・RCA関連のライブラリ ./example ・RCAのサンプル ./arduino_lib ・Arduino IDE付属のライブラリ(パッチ済み) ・ディレクトリ構成はオリジナルと同等だが以下のフォルダは必要ないので削除している. ./hardware/arduino/avr ./hardware/arduino/sam ./hardware/arduino/samd/bootloaders ./tools/avr ./tools/gcc-arm-none-eabi-4.8.3-2014q1 ./tools/OpenOCD-0.9.0-arduino ./tools/CMSIS/CMSIS_RTX ./tools/CMSIS/CMSIS/Driver ./tools/CMSIS/CMSIS/DSP_Lib ./tools/CMSIS/CMSIS/Lib ./tools/CMSIS/CMSIS/RTOS ./tools/CMSIS/CMSIS/SVD ./tools/CMSIS/CMSIS/UserCodeTemplates ./tools/CMSIS/Device/ARM ./tools/CMSIS/Device/ATMEL/samd21 以外 ./libraries 以下のフォルダは必要無いので削除している ./Ethernet ./Scheduler ./SpacebrewYun ./WiFi 以下のファイルを追加している ./ESP8266 下記で公開されているコードをベースにM0に対応 https://github.com/itead/ITEADLIB_Arduino_WeeESP8266 ./NcesCan ・Seeedの2015/11/08版をベースにAPIを変更 https://github.com/Seeed-Studio/CAN_BUS_Shield ./asp_1.9.2 ・ASPカーネルのソースコード ○サンプルプログラム ./basic ・Arduinoの基本的なプログラムの詰め合わせ. ・ソースの先頭のifdefで実行するプログラムを選択する. ./multi_task ・マルチタスクのサンプル. ./NAxesMotion ・9軸モーションシールドのサンプル. ./NCESCan ・NCES CAN シールドのサンプル. ./rr_scheduling ・ラウンドロビンスケジューリングのサンプル. ./TFTBitmapLogo ・Arduino TFT LCD Screen へのビットマップ表示サンプル. ./WebServerDHCP ・Arduino イーサネットシールド2を用いたサンプル. ○コンフィギュレーション項目 ●rca_app.h 以下の項目を rca_app.h に設定可能である. メインタスク以外のRCAタスク数の指定 : 現状5個までサポート RCA_NUM_TASK : 0~5 優先度 : 定義しないと初期値を使用 RCA_MAINTASK_SETUP_PRI RCA_MAINTASK_LOOP_PRI RCA_TASK1_SETUP_PRI RCA_TASK1_LOOP_PRI ... スタック : 定義しないと初期値を使用 RCA_MAINTASK_STACK_SIZE RCA_TASK1_STACK_SIZE ... スケジューリング : RCA_RR_SCEDULE : ビット指定した優先度(0は無視)をラウンドロビンスケジューリングする RCA_RR_SCEDULE_CYCLE : ラウンドロビンスケジューリングの周期 ●Makefile 以下の項目を指定可能である. ARDUINO_SERIAL シリアル(Serial)の扱いを設定以下のいずれかに定義 NOUSE_SERIAL : Serialは使用しない.syslog/logtaskを使用した出力が可能. USE_SERIAL : Serialを使用する.logtaskは使用しない.syslogは低レベル 出力となる. ○Arduinoライブラリへのパッチ : 対象 IDE 1.7.8 ●バグ ./hardware/arduino/samd/cores/arduino/USB/samd21_device.c : 152行目 メモリリーク for (i = 0; i < sizeof(usb_endpoint_table)/4; i++) { (*(uint32_t *)((uint32_t *)(&usb_endpoint_table[0])+i)) = 0; } arduino/samd/variants/arduino_zero/variant.h : 68行目 定義ミス #define portOutputRegister(port) ( &(port->OUT.reg) ) #define portInputRegister(port) ( &(port->IN.reg) ) libraries\TFT\src\utility\いくつかのファイル ARDUINO_ARCH_SAM -> ARDUINO_ARCH_SAD glcdfont.c:1:#ifndef ARDUINO_ARCH_SAMD Adafruit_ST7735.cpp:334:#if defined(ARDUINO_ARCH_SAMD) Adafruit_ST7735.h:138: #if defined(ARDUINO_ARCH_SAMD) libraries\NAxesMotion\NAxisMotion.h : 139行目 M0の時はアドレスを変更する.さらにシールドのADRESSのジャンパを外す #if defined(ARDUINO_ARCH_SAMD) void initSensor(unsigned int address = 0x29); #else /* !defined(ARDUINO_ARCH_SAMD) */ void initSensor(unsigned int address = 0x28); #endif /* defined(ARDUINO_ARCH_SAMD) */ ●TOPPERS対応 /hardware/tools/CMSIS/CMSIS/Include/core_cm0plus.h : 646行目 割込み禁止・許可をAPIを呼び出すように変更 __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) { // NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); extern void rca_ena_int(uint32_t intno); rca_ena_int(IRQn); } /** \brief Disable External Interrupt The function disables a device-specific interrupt in the NVIC interrupt controller. \param [in] IRQn External interrupt number. Value cannot be negative. */ __STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) { // NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); extern void rca_dis_int(uint32_t intno); rca_dis_int(IRQn); } ●機能追加 Serial3の追加 SERCOM2を使用 ピン 5 : RX 4 : TX http://ehbtj.com/electronics/arduino-m0-hacks ○本パッケージの名称 Aruduinoのガイドライン(https://www.arduino.cc/en/Main/FAQ)では, Arduino Xxxxxx : NG Xxxxxx for Arduino : OK とあり,Arduinoとの関係が分かる書き方なら問題ないとのこと. TOPPERS RTE/RTOS Compatible with Arduino libraries : RCA 以上.