ERTLテンプレート

Similar documents
ERTLテンプレート

ERTLテンプレート

EV3_APIの解説.pptx

EV3RTの概要.pptx

SpeC記述のC記述への変換 (SpecCによるソフトウェア記述の実装記述への変換)

組込み Linux の起動高速化 株式会社富士通コンピュータテクノロジーズ 亀山英司 1218ka01 Copyright 2013 FUJITSU COMPUTER TECHNOLOGIES LIMITED

MMUなしプロセッサ用Linuxの共有ライブラリ機構

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

IntroductionForGR-PEACH.pptx

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A

アジェンダ Renesas Synergy TM プラットフォーム構成 ThreadX とは ThreadX の状態遷移 ThreadX とμITRONの機能比較 まとめ ページ 2

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

04-process_thread_2.ppt

AquesTalk プログラミングガイド

MINI2440マニュアル

スライド 1

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

TFTP serverの実装

型名 RF007 ラジオコミュニケーションテスタ Radio Communication Tester ソフトウェア開発キット マニュアル アールエフネットワーク株式会社 RFnetworks Corporation RF007SDK-M001 RF007SDK-M001 参考資料 1

Taro-82ADAカ.jtd

ETCB Manual

SDC_SDIO_STM32F4 の説明 2013/09/17 SDIO インターフェースで SD カードをアクセスするプログラムのプロジェクトサンプルです FAT でファイルアクセスするために FatFs( 汎用 FAT ファイルシステム モジュール ) を使用しています VCP(USB 仮想 C

1. 使用する信号 1.1. UART 信号 UART 通信に使用する信号と接続相手との接続は以下の通りです UART 信号表 番号 CPU 機能名 CPU 信号名 基板コネクタピン番号 方向 接続相手の信号名 1 USART1_TX PA9 CN > RxD 2 USART1_R

QuartusII SOPC_Builderで利用できるGPIF-AVALONブリッジとは?

EV3RT Real- Time platform for EV3 user/ev3pf/wiki/whatsev3rt TOPPERS/HRP2カーネルをベースとしたプラット フォーム メモリ 保 護 機 能 を 提 供 CやC++で 開 発

TOPPERS活用アイデア・アプリケーション開発

Windows2000/XPインストール手順

Oracle Un お問合せ : Oracle Data Integrator 11g: データ統合設定と管理 期間 ( 標準日数 ):5 コースの概要 Oracle Data Integratorは すべてのデータ統合要件 ( 大量の高パフォーマンス バッチ ローブンの統合プロセスおよ

NFCライブラリマニュアル

TRQerS - Introduction

OS

組込みシステムにおける UMLモデルカタログの実践研究

XIMERA(Ver1


Application Note Application Note No. ESC-APN Document No.: ESC-APN adviceluna Linux デバッグ手順 (MIPS コア編 ) はじめに adviceluna Linux デバッグ手順 ( 以

Microsoft PowerPoint _ncessympotakada [互換モード]

TOPPERS 活用アイデア アプリケーション開発 コンテスト 部門 : 活用アイデア部門アプリケーション開発部門 作品のタイトル : Toppers_JSP と Scicos_lab / (Scilab でも可 ) による 組込みメカトロニクス制御シミュレーション 作成者 : 塩出武 ( シオデタ

PNopenseminar_2011_開発stack

MS5145、MS7120,USB通信の設定

SOULNOTE D-1/D-2 ドライバー / ファームウェア設定方法 2018 年 11 月 21 日 D-1/D-1N/D-2 ドライバー / ファームウェア設定方法 SOULNOTE D-1/D-1N/D-2 のドライバー / ファームウェアの設定方法です ドライバー : D-1/D-1N/

AquesTalk Win Manual

2015 TRON Symposium セッション 組込み機器のための機能安全対応 TRON Safe Kernel TRON Safe Kernel の紹介 2015/12/10 株式会社日立超 LSIシステムズ製品ソリューション設計部トロンフォーラム TRON Safe Kernel WG 幹事

内容 1. 仕様 動作確認条件 ハードウェア説明 使用端子一覧 ソフトウェア説明 動作概要 ファイル構成 オプション設定メモリ 定数一覧 変数一

第一章 LPC2478 ボードの概要...3 第二章 uclinux の初体験 SD カードのテスト USB メモリのテスト USB Devices のテスト network のテスト...6 第三章 uclinux のコンパイル...

ReTRY HUB

ESOTERIC ASIO USB DRIVER インストールマニュアル Windows 用 システム推奨条件 2 インストールで使用する言語を選択して 次へ ボタンをクリックする Intel Core 2 Duo 以上のプロセッサー搭載コンピュータ 搭載メモリ 1GB 以上 対応 OS Windo

Microsoft Word - Ladder Tool 使çfl¨ã…žã…‰ã…¥ã‡¢ã…«ã…©ã…•ã…¼ã†ªã†Š_ docx

TWE-Lite R 取扱説明書

<4D F736F F F696E74202D20834A815B836C838B835C815B835882CC95E082AB95FB F4B2E B8CDD8AB B83685D>

自己紹介 湯浅陽一 1999 年より Linux kernel 開発に参加 MIPS アーキテクチャのいくつかの CPU へ Linux kernel を移植

Raspberry Pi (Windows10 IoT Core) を使用したリーダ ライタの制御例 (UART 接続 ) 2018 年 12 月 18 日第 版 株式会社アートファイネックス

株式会社日新テクニカ USB シリアル CAN 変換器 /8/22 ホームページ : メール

1. UART について UART は Universal Asynchronous Receiver Transmitter の頭文字をとったもので 非同期シリアル通信と呼ばれます シリアル通信とは 一本の信号線でデータをやりとりするために 1bit ずつデータを送出することをいいます データを受

24th Embarcadero Developer Camp

7th CodeGear Developer Camp

PCL6115-EV 取扱説明書

AUTOSAR OS仕様とTOPPERS/ATK2の使い方

G800 Firmware update

HARTING Node.js Environment for HAIIC MICA 日本語 HARTING Node.js Environment for HAIIC MICA HARTING IT Software Development Marienwerder Str. 3, E

1. 概念 STM32F4 Discovery 基板は Mini USB を接続して デバッグやプログラムの書き込みができるようになっています 通常は CPU の 0x 番地からプログラムを実行します では なぜわざわざこのプロジェクトの雛形を使用して CPU の 0x

1. ボードの複数台制御 コンフィグ ROM から FPGA が起動できる場合を想定しています FPGA 回路には 特定のレジスタアドレスにプリセットしたデータが必要です 製品出荷時のサンプル FPGA 回路では レジスタ No.3 を 8bit 幅に設定し FPGA 外部の 4bit ディップスイ

Microsoft Word - RefApp7インストールガイド.doc

CoIDE 用 STM32F4_UART2 の説明 V /03/30 STM32F4 Discovery の非同期シリアル通信ポート UART2 の送受信を行うプログラムです Free の開発ツール CoIDE で作成したプロジェクトサンプルです プログラムの開始番地は 0x08000

OS バージョンアップ実行後のご注意 OS バージョンアップ後 更新完了通知が自動的にNECカシオモバイルコミュニケーションズ株式会社の運用するサーバへ送信されます なお NECカシオモバイルコミュニケーションズ株式会社は送信された情報を OS バージョンアップ以外の目的には利用いたしません また

リファレンスアプリケーション RefApp7

PowerPoint プレゼンテーション

今週の進捗

Windows2000/XPインストール手順

Microsoft Word - XPC4ソフトマニュアル.doc

RL78開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行(統合開発環境編)(High-performance Embedded Workshop→CS+)

PICKIT3オフライン書き込みガイドブック

Microsoft PowerPoint - RL78G1E_スタータキットデモ手順_2012_1119修正版.pptx

PowerPoint プレゼンテーション

QuartusII SOPC_Builderで利用できるGPIF-AVALONブリッジとは?

1. プログラム実行時の動作プログラムを実行すると以下のように動作します 1) NUCLEO-F401RE 上の LED LD2( 緑 ) が 200mSec 間隔で点滅します 2. プロジェクトの構成 2.1. プロジェクト F401N_BlinkLD2 の起動画面 TrueSTUDIO で作成し

POSIXスレッド

Fujitsu Standard Tool

BT-2000/2200 システムソフトウェア リリースノート(Ver.R1.5.0)

Microsoft Word - CAN Monitor の使い方.doc

Warp demo station manual

VECLOS Audio Driver インストールマニュアル Windows 用 2 次へ ボタンをクリックする 対応 OS Windows 7 (32bit 版 64bit 版 ) Windows 8( 32bit 版 64bit 版 ) Windows 8.1( 32bit 版 64bit 版

AquesTalk for WinCE プログラミングガイド

Windows パソコンに接続する 画面表示は Windows 7 を例としています 1. EM chip を取り付けた本製品の USB コネクタに USB ケーブルを接続します 2. USB ケーブルのもう一方のコネクタをパソコンの USB ポートに接続します パソコンがデータ通信カード ( 本製

不可能への挑戦株式会社日昇テクノロジー低価格 高品質が不可能? 日昇テクノロジーなら可能にする Mini2440 クイックインスト ールマニュアル 株式会社日昇テクノロジー 更新日 2013/08/13 日昇テクノロジー c

G800SE HTMLdocument update

<4D F736F F D20B6BCB5D7B2CCDED7D8CFC6ADB1D9315F43532E444F43>

GenieATM 6300-T / 6200-T シリーズ 1. 基本的な機器オペレーションのために 1-1. 機器への接続 機器への接続方法は 以下の 2 通りがあります シリアルポートを使用してログインする LAN 経由で Telnet または SSH を使用して仮想 Interface からロ

HDC-EDI Manager Ver レベルアップ詳細情報 < 製品一覧 > 製品名バージョン HDC-EDI Manager < 対応 JavaVM> Java 2 Software Development Kit, Standard Edition 1.4 Java 2

AP-RZA-1A シリアルFlashROMの書き込み方法

スライド 1

Microsoft Word - matlab-coder-code-generation-quick-start-guide-japanese-r2016a

Webアプリケーションでのlog4j利用ガイド

momentum Probe Type-R/C version 4.21 build-a04a Release Notes Release Version: momentum Probe Type-R/C version 4.21 build-a04a Release Date: 2018/06/2

 

インテル(R) Visual Fortran コンパイラ 10.0

1 Atollic TrueSTUDIO( GR-PEACH TOPPERS/ASP ASP GR-PEACH mbed ( git

スライド 1

Industrial shields brochure_JP

MS5145 USB シリアル エミュレーション モードの設定

Transcription:

EV3RT の内部構造と進んだ使い方 β 6 ー 2 2016 年 6 月 11 日名古屋大学大学院情報科学研究科高田 本田研究室博士課程 2 年李奕驍 1

発表内容 EV3RT の内部構造の解説 アーキテクチャの概要 ベースシステムの解説 ユーザアプリケーションとSDK 動作ローディング機能 Dynamic Module Loader アプリケーションモジュール アプリのローディングの流れ 進んだ使い方 2

発表内容 EV3RT の内部構造の解説 アーキテクチャの概要 ベースシステムの解説 ユーザアプリケーションとSDK 動作ローディング機能 Dynamic Module Loader アプリケーションモジュール アプリのローディングの流れ 進んだ使い方 3

EV3RT の二つの実行形式 動的ローディング形式 アプリはローダで動的に実行できるモジュールとしてビルド SDカード Bluetooth シリアルポートからロードできる USB+SD カードは対応したので シリアルポートのロードは将来廃止 スタンドアローン形式 アプリとベースシステムは一つのバイナリとしてビルド EV3ブートローダが直接にサポートする実行形式 (uimage) SDカードのルートフォルダに入れることで動作可能 アプリローダ自体もこの形式のアプリの一つである 4

EV3RT の二つの実行形式 ビルド方式は make コマンドの引数で指定 Dynamic: Standalone: make app=<folder name> Loader 用 Module make img=<folder name> U-Boot 用 uimage ビルド方式はマクロで判定できる 普通のアプリの開発者は意識しなくても良い プラットフォームを改造 拡張するときに有用 e.g. ev3api.h, app_common.cfg #if defined(build_module) #include "module_cfg.h" #else #include "kernel_cfg.h" #endif #if!defined(build_module) INCLUDE("ev3.cfg"); #endif INCLUDE("ev3api.cfg"); 5

EV3RT のアーキテクチャ 動的形式のアーキテクチャは 2 つの部分に分けられる Dynamic Loader Device Drivers Sensor Bluetooth Platform Interface Layer Motor Serial LCD Speaker μsd Task 共有 Libraries & Bindings Trike User Application Application Programming Interface HRP2 API Self-balance EV3 API for C API Bindings for C++ Newlib TOPPERS/HRP2 Kernel ベースシステム + ローダ 主に特権モード uimage としてビルド Platform Interface Layer ユーザアプリ 非特権モード専用ユーザドメイン (TDOM_APP) API で開発 6

EV3RT のアーキテクチャ スタンドアローン形式の場合のアーキテクチャ Libraries & Bindings Trike Self-balance User Application API Bindings for C++ Gyroboy Trike for EV3 Dynamic Loader HelloEV3 Application Programming Interface 任意のドメイン特権 / 非特権全機能利用可能 Device Drivers HRP2 API Platform Interface Layer EV3 API for C Newlib Sensor Motor LCD μsd Task Time DCRE 開発者が自由に改造できるため 動的形式に基づいて解説 Bluetooth Serial Speaker Synchronization ISR TOPPERS/HRP2 Kernel 7

発表内容 EV3RT の内部構造の解説 アーキテクチャの概要 ベースシステムの解説 ユーザアプリケーションとSDK 動作ローディング機能 Dynamic Module Loader アプリケーションモジュール アプリのローディングの流れ 進んだ使い方 8

ユーザアプリの実行をサポートするためのサービスを提供するシステムソフトウェア モジュール構成 HRP2 Kernel 各種ドライバ Platform I/F ミドルウェア (e.g. Loader) Dynamic Loader Device Drivers Platform Interface Layer Sensor Motor LCD μsd Task Time DCRE Bluetooth Serial Speaker Synchronization ISR TOPPERS/HRP2 Kernel 9

TOPPERS/HRP2 カーネル 静的リアルタイムオペレーティングシステム 利用可能なリソースは cfg ファイルで静的に定義 保護機能 メモリアクセスの保護 カーネルオブジェクトのアクセス保護 拡張サービスコール機能 ユーザアプリからドライバをアクセスするために必要 動的生成機能拡張 10

HRP2 カーネルの動的生成機能拡張 (DCRE) カーネルオブジェクトの動的生成をサポートするパッケージ ER_ID tskid = acre_tsk(pk_ctsk); // C 言語でタスクを生成 Object Pool パターン : 動的に生成できる最大数が静的指定 AID_TSK(32); // 最大 32 個のタスクが生成できる Dynamic Loaderとドライバを開発するために導入 ユーザアプリの開発では直接に使えない DCREはミドルウェアの開発向けの機能 細粒度の保護機能が無い 例 : カーネルドメインのタスクを生成して保護機能をbypass システムタスク ( カーネルドメイン ) しか利用できない スタンドアローン形式はシステムタスクを静的に作成して利用可能 11

重要なデバイスドライバ ミドルウェアの一覧 (1/2) カーネル機能と Low Level Driver Linux Kernel Driver Interface 互換レイヤー SoC 汎用入出力 (GPIO) ポート 高精度アラームハンドラ機能 EV3 専用のデバイスドライバ スピーカ モータ アナログ-デジタル変換 (ADC) Soft UARTポート UARTセンサ SDカードコントローラ LCDスクリーン 12

重要なデバイスドライバ ミドルウェアの一覧 (2/2) 汎用ドライバ ライブラリ 拡張機能 Stellaris USB Library BTstack FatFS TLSFメモリアロケータ Newlib ユーザドメインのボタンハンドラ機能 ユーザドメインの周期ハンドラ機能 その他 EV3RT Console 機能 システム設定機能 13

Linux Kernel Driver Interface 互換レイヤー 一部の Linux のドライバを再利用するために TOPPERS カーネル API を使って簡易の Linux Kernel Driver Interface 互換レイヤーを実装した メモリ管理 アクセス機能 カーネルロギング機能 同期機能 (spin lock mutex semaphore) 割込みハンドラ管理機能 高精度カーネルタイマ (hrtimer) 14

SoC ドライバ EDMA ecap UART 等 SoCの基本機能をサポート 他のドライバの開発を支援するためのミドルウェア StarterWare for ARM-based Sitara Processorsをベースとする EV3 の SoC メーカ (Texas Instruments) が提供した Low Level Driver サブシステムの管理 Special Registersの定義 15

汎用入出力 (GPIO) ポートのドライバ GPIOに関する操作をサポート Pin 定義とMultiplex 機能 Pin 単位の割込みハンドラ登録と Dispatch 機能 16

高精度アラームハンドラ機能のドライバ 第二世代の TOPPERS カーネル (HRP2) はタイマ管理機能はミリ秒単位しか対応していない マイクロ秒精度で動作するドライバ (Analog センサ等 ) が存在するため より高精度なアラームハンドラ機能が必要 HRP2 カーネルはタイムティックの設定をサポートする タイムティック周期 =(TIC_NUME / TIC_DENO) ミリ秒 TIC_DENO を増やすことで, より高精度のタイムティックが得られる 標準のアラームハンドラ機能を参考してタイムティック精度で動作するアラームハンドラ機能を実装した acre_hires_alm(...) // 高精度アラームハンドラの生成 sta_hires_alm(...) // 高精度アラームハンドラの動作開始 stp_hires_alm(...) // 高精度アラームハンドラの動作停止 17

高精度アラームハンドラ機能のティック周期の課題 引数の単位はマイクロ秒で 実際の動作はティック精度 アラームの起動時刻はティック単位で切り捨てる Tick: 100us, Almtim: 125us => 実際の Almtim: 100us 切り捨てられた場合は Warning Log を出力 ティック周期を全ての高精度アラームハンドラの相対起動時刻の最大公約数に設定しないと精確に動作できない 機能 サウンド再生 Analog センサ情報更新 起動周期 125 μs 200 μs しかし ティック周期が早すぎると オーバヘッドがとても大きくなって リアルタイム性に悪影響が出る 現時点は サウンド再生機能の処理精度を犠牲にして 100us に設定 18

スピーカのドライバ サウンドの再生をサポート 指定した周波数のノートと WAV ファイル (8bit モノラル ) のデータストリームを再生できる リアルタイム性を保証するために データストリームはインメモリでないといけない アプリは WAV ファイルをメモリにロードしてから再生する 音声の再生は排他的に行う 現在再生中のサウンドが停止される Linux のドライバを再利用した 19

モータのドライバ モータの制御をサポートするドライバ LinuxのPWM 制御モジュール (d_pwm) を再利用した 以下の機能を持つ 速度制御 ブレーキ制御 二つのモータの同期運転 ( ステアリング等 ) 回転制御 ( 指定した角度や時間でモータを回す ) ロータリーエンコーダ ( モータの回転角を測定 ) 20

アナログ - デジタル変換 (ADC) のドライバ AD コンバータ (SPI 経由 ) からデータを取得する Analogセンサ ( タッチセンサ等 ) のデータ I2Cセンサ (HiTechnic 製加速度センサ等 ) のデータ モータの電流 バッテリの電圧 センサのタイプ Linux のドライバを再利用した 21

Soft UART ポートのドライバ EV3 には 4 つ ( ポート 1~4) の UART ポートが搭載される ポート 1 と 2 は Native の UART でポート 3 と 4 は SoC の PRUSS( Programmable Real-Time Unit Subsystem) という機構でソフトウェアでエミュレートしたもの PRUSS は TI 社独自の開発言語 ( アセンブラ風 ) を使ってとても理解し難いが Linux 用のファームウェアが提供している Linux 用 Soft UART のファームウェアの Loader を移植して Soft UART ポートのドライバを実装した 22

UART センサのドライバ UART で通信するセンサをサポート EV3 の UART センサは具体的なタイプ ( 超音波かカラー等 ) にかかわらず LEGO 社が定義した共通のプロトコルで通信 UART センサ通信プロトコルの機能 センサとポートのクロック Baudrate 同期 センサの情報の取得 ( モードの数 データの範囲等 ) センサモードの切り替え ( カラー => カラーモード 反射光モード等 ) センサデータの更新 Linux のドライバを再利用した 23

SD カードコントローラのドライバ EV3に搭載されたmicroSDカードスロットをサポート EV3のSoCは二種類のSDカードを対応 ;SDXCは非対応 規格 サイズ Addressing Mode SD ~2GB Byte 単位 SDHC(SD High Capacity) 4GB~32GB Block(512B) 単位 Block 単位の Read/Write 操作を実装した 現時点はSDHCだけ対応 (SoCのマニュアルはSDHCベースのため) SDカード (<=2GB) は将来サポートする予定 DMA 方式で実装したので性能が良くてリアルタイム性に影響小さい 24

LCD スクリーンのドライバ EV3のLCDコントローラ (ST7586) で画面表示 複数のFramebufferを提供 互い干渉しないので開発は簡単 アプリ用 Framebuffer: ユーザアプリが直接にアクセスできるVRAM システム用 Framebuffer: システムメニュー Console 等用のVRAM 指定した頻度で画面をリフレッシュする デフォルトは 25fps DMA で処理するのでオーバヘッドは小さい VRAM への書き込みは Linux の ST7586 ドライバを参考して実装した 25

Stellaris USB Library TI 社により提供した簡単な USB スタック TI 社のSoCなら無料に使える Mass Storage Class(MSC) のサンプルも入っている MSC のサンプルを EV3RT 用に改造した RAMdisk MMC/SDカードドライバと連携 Buffer 機能を実装することで速度を向上 (e.g. 書込 300KB/s 6MB/s) Mac OS X 対応 EV3RT 用 fork: https://github.com/ev3rt-git/usblib EV3 のミニ USB ポートに接続して SD カードリーダとして使える ユーザアプリと同時に動作できない ( 排他制御 ) ejectせずに取り外すと再起動しないと接続できないことがある 26

Bluetooth のドライバ EV3 に標準の Bluetooth チップ (CC256x, v2.1 EDR) が搭載されているため 標準の Bluetooth スタックドライバが必要 BTstack というオープンソースのスタックドライバを移植 軽量で組込み向け OS なしでも動作できる 機能が豊富 Bluetooth SIG により認証済み 対応するチップが多い EV3 の CC256x もサポートする EV3RT 用 fork: https://github.com/ev3rt-git/btstack CC256x と SoC は UART で通信しているので移植はとても簡単 UART 操作関数で BTstack の HCI インタフェースを実現したら良い BTstack Bluetooth Chipset UART 27

Bluetooth のドライバ BTstack の API を使って仮想シリアルポート (Serial Port Profile) のサービスを実装した TOPPERS SIO ドライバ でも使えるようにした 接続された時に open 切れたら close 受送信データを処理す るために Run Loop が 必要 Run Loop 用の タスクを作成した Services Run Loop BTstack Serial Port Profile Bluetooth Chipset PH Bluetooth Stack RFCOMM L2CAP HCI UART

Bluetooth 通信の QoS 確保 アプリより高い優先度で動作すると 高速で通信する場合 アプリのリアルタイム性に悪影響 アプリより低い優先度で動作すると スタベーションで接続が切れてしまう可能性がある 接続を保護するために QoS タスクで動的に BT タスクの優先度を上げる 現時点のポリシー 20ミリ秒ごとに1ミリ BTタスクをアプリより高い優先度に 参考 : 倒立制御処理 5ミリ秒周期で動作 実行時間は1ミリ秒以内 課題 : より精確なKeep Aliveポリシーを使う BTタスクの普通優先度 =TMAX_TPRI アプリの最高優先度 BTタスクの高優先度 高 BT QoS タスクの優先度 29

汎用 FAT ファイルシステムモジュール FatFS 特徴 Windows 互換 FAT ファイルシステムをサポート ANSI C(C89) 準拠で移植性が優れている 下位レイヤインターフェース disk_status - デバイスの状態取得 disk_initialize - デバイスの初期化 disk_read - データの読み出し disk_write - データの書き込み disk_ioctl - その他のデバイス制御 get_fattime - 日付 時刻の取得 disk 系関数は SD カードのドライバを使って対応できる get_fattime() は現時点で未対応 30

Two-Level Segregate Fit(TLSF) メモリアロケータ リアルタイムシステム向けの動的メモリアロケータ 動的生成機能拡張と標準 C ライブラリのために導入 O(1) の計算量で malloc/free リアルタイム性高い 複数のメモリプールが対応 ベースシステム ( カーネル ) 用メモリプールとアプリ用メモリプールを別々に管理できるので HRP2 のメモリ保護機能との相性が良い Newlib のデフォルトのアロケータは一つの heap しか使えない Fragmentation は少ない ( 平均的に <15%) 排他制御はサポート 31

Newlib Support Package BTstack FatFS TLSF 等のドライバはそれぞれの API を持っている 標準 C ライブラリ (Newlib) でこれらのドライバの機能を吸収して開発者の学習コストを削減できる TLSF アロケータで動的メモリ管理のシステムコールを実現 _malloc_r/_free_r/_calloc_r/_realloc_r を実装して Newlib 本来のアロケータを override した FatFS でファイル操作機能をサポート FatFS は File Descriptor を使ってないため Newlib の File Descriptor で FatFS のデータ構造 (FIL) を管理する機能を実装した fopen/read/write 等の関数で SD カードを操作できるようになった Bluetooth 通信のための FD(SIO_BT_FILENO) を作成 通信用の特殊な FD fprintf/fscanf 等で簡単に Bluetooth 機能を使える 32

ユーザドメインのボタンハンドラ機能 ボタンハンドラは GPIO の割込みで起動するが 割込み処理の中から直接に呼び出されると保護機能が適用できない この課題ためにボタンハンドラ用のフラグとタスクを用意 ボタンの GPIO 割込みでイベントフラグをセット iset_flg(current_button_flag, 1 << BRICK_BUTTON_BACK) ユーザドメインのタスクはフラグをチェックしてハンドラを呼び出す wai_flg(btn_click_flg, ) => handlers[i](exinfs[i]) ボタンハンドラのタスク優先度 (TMIN_APP_TPRI-1) はアプリの全てのタスクよりも高いため 長い処理を行う時は要注意 33

ユーザドメインの周期ハンドラ機能 TOPPERS の標準の周期ハンドラはボタンハンドラと同様に割込み処理から呼び出されるので保護機能が使えない 周期ハンドラの定義や数はボタンハンドラとは違って固定されていないので 同じ手法で対応できない アプリの周期ハンドラ毎に TOPPERS の周期ハンドラと実行用タスクを生成して TOPPERS の周期ハンドラでタスクを起動 優先度はボタンハンドラと同じ TMIN_APP_TPRI-1 長い処理を行う時 ハンドラから act_tsk でアプリの普通のタスクを起動したほうが良い 提供する API EV3_CRE_CYC(...) // 静的 API パラメータは CRE_CYC と同じ ev3_sta_cyc(...) // ユーザドメイン周期ハンドラの動作開始 ev3_stp_cyc(...) // ユーザドメイン周期ハンドラの動作停止 34

ユーザドメインの周期ハンドラ機能 静的 API の定義からユーザドメインの周期ハンドラを動的に生成する関数が生成される EV3_CRE_CYC(EV3_CYC1,{TA_STA,0,test_ev3_cychdr,500,0}); void _initialize_ev3api_cyc() {... pk_ccyc.cycatr = TA_STA; pk_ccyc.exinf = 0; pk_ccyc.cychdr = test_ev3_cychdr; pk_ccyc.cyctim = 500; pk_ccyc.cycphs = 0; ercd = _ev3_acre_cyc(&pk_ccyc); _ev3api_id_ev3_cyc1 = ercd; } アプリの初期化タスクで呼び出される 35

EV3RT Console 機能 EV3 本体で直接にEV3を制御できる Backボタンの長押しで呼び出される タスクログはここで見られる syslog,printfの出力はパソコンがなくても確認できる Loader 機能と Power off が使える 36

システム設定機能 INI ファイルでシステムを設定できる /ev3rt/etc/rc.conf.ini INIファイルを解析するためにMinIniモジュールを導入 現時点で設定可能な項目 Bluetoothのデバイス名 BluetoothのPINコード ポート1の使い方 : センサポートかシリアルポート デフォルトのログ出力 :LCDかシリアルポート USBケーブルを接続する時 自動にアプリを終了するか 37

Platform Interface Layer 保守性を向上するために ユーザアプリからアクセスすることがあるドライバに対してある程度安定した I/F が必要 PIL はユーザアプリとベースシステム間の I/F を定義する 共有メモリ (brick_info_t) 拡張サービスコール PIL にバージョン番号がある ベースシステムは同じ PIL バージョンのアプリしかロードできない 同じ PIL 番号のベースシステムはアプリのバイナリ互換性を持つ Bug fix した場合 アプリをリコンパイル必要がない e.g. β6 β6-1 38

Platform Interface Layer 共有メモリ (brick_info_t) のインタフェース アプリから直接アクセス可能のメモリ領域のポインタの集合 ベースシステムはドライバの初期化で該当のポインタをセット SVC _fetch_brick_info() でベースシステムのbrickinfo_t を取得できる オーバヘッドは拡張サービスコールよりずっと小さい 39

Platform Interface Layer 拡張サービスコールのインタフェース ベースシステムにドライバ Stub のプロトタイプを定義 ベースシステムに拡張サービスコールを生成 ユーザアプリに拡張サービスコールを呼び出す関数を提供 ユーザアプリのコンパイルはベースシステムのソースに依存しない 40

発表内容 EV3RT の内部構造の解説 アーキテクチャの概要 ベースシステムの解説 ユーザアプリケーションとSDK 動作ローディング機能 Dynamic Module Loader アプリケーションモジュール アプリのローディングの流れ 進んだ使い方 41

EV3RT のユーザアプリケーションと SDK ユーザアプリ : Mindstorms EV3 を制御するプログラム EV3RT が提供するソフトウェア開発キットで作成できる 特定のユーザドメイン (TDOM_APP) で動作 動的ローディング用のアプリモジュールとしてビルド可能 ソフトウェア開発キット (SDK) の構成 API 静的ライブラリ サンプル (& Workspace) Libraries & Bindings Trike Self-balance User Application API Bindings for C++ Application Programming Interface Gyroboy Trike for EV3 HelloEV3 HRP2 API EV3 API for C Newlib Platform Interface Layer Version xxx Loadable Application Module 42

EV3RT のユーザアプリケーションと SDK Application Programming Interface TOPPERS/HRP2 カーネル静的 API cfgファイルに記述して カーネルオブジェクトを静的に定義 生成 保護ドメインはTDOM_APPか無所属でないといけない [Dynamic] TOPPERS/HRP2 カーネル API( サービスコール ) RTOS 機能 ( タスク管理 同期 通信 タイマ等 ) 標準 C ライブラリ (Newlib) 動的メモリ管理 ファイル操作 (Bluetooth 通信含む ) 入出力関数等 EV3RT C 言語 API モータ センサ スピーカ LCD 等 EV3RT 独自の機能 Platform Interface Layerを用いて実装 ソースコードはsdk/common/ev3apiにある 43

EV3RT のユーザアプリケーションと SDK 静的ライブラリ アプリの開発では API の他にオプションのライブラリも使える EV3RT はライブラリを簡単に開発 導入できる機能を持つ ライブラリのプロジェクトフォルダは sdk/common/lib の下に sdk/common/lib/libcpp-ev3 ET ロボコン用 C++ ライブラリ sdk/common/lib/libcpp-test サンプルライブラリ アプリの Makefile(ev3way-cpp/Makefile.inc の例 ) で導入できる... # Include libraries include $(EV3RT_SDK_LIB_DIR)/libcpp-ev3/Makefile... 44

EV3RT のユーザアプリケーションと SDK 静的ライブラリの開発 ライブラリ プロジェクト フォルダの構成 Makefile ライブラリのMakefile src/* ライブラリのソースコード include/* アプリが使えるヘッダファイル <libname>-[loadable standalone].a 静的 lib( オプション ) ライブラリの Makefile THIS_LIB_NAME := <libname> # ライブラリの名前 THIS_LIB_OBJS := c-1.o c-2.o # C 言語オブジェクト THIS_LIB_CXXOBJS := cpp-1.o cpp-2.o # C++ オブジェクト include $(EV3RT_SDK_LIB_DIR)/../Makefile.slib 静的ライブラリ (.a) が無い場合 アプリのビルドで自動生成 45

EV3RT のユーザアプリケーションと SDK ユーザアプリケーション実行時の主なタスク構成 優先度 タスク 周期 実行時間 1 システム初期化 once / 2 USB / / 3 Bluetooth( 高 ) 20ms <1ms 4 LCDリフレッシュ 40ms <1ms 6 BUSY / / 7 アプリ初期化 once / >= TMIN_APP_TPRI ユーザアプリケーション TMAX_TPRI Bluetooth( 低 ) BUSY タスクは単純な無限ループ システム初期化の途中でアプリのタスクの実行を一時停止できる 46

EV3RT のユーザアプリケーションと SDK ユーザアプリケーションの初期化タスク ( 一部省略 ) C++ Global Constructor には待ち状態になるコードを使っては行けない 47

発表内容 EV3RT の内部構造の解説 アーキテクチャの概要 ベースシステムの解説 ユーザアプリケーションとSDK 動作ローディング機能 Dynamic Module Loader アプリケーションモジュール アプリのローディングの流れ 進んだ使い方 48

動的ローディング機能 Dynamic Module Loader 静的 OS(HRP2) のために開発されたモジュールを (EV3RT のベースシステムに ) 動的に追加 削除するための機能 モジュールの保護設定とリソースはコンパイル時に決まる cfg ファイルに記入した静的 API から生成 HRP2 DCRE( 動的生成機能拡張 ) の API は使用できない モジュール毎には一つの専用のユーザドメインしか使えない 汎用 OS のプロセスに似た概念 ベースシステムはモジュール実行用のコンテナを用意 モジュールが使える最大リソース ( タスク等 ) を静的に確保 モジュールの保護機能 ( メモリアクセス権等 ) を静的に設定 ローディング :DCRE を使って モジュールの実行ファイルを指定のコンテナに展開して 動作を開始すること

動的ローディング機能 Dynamic Module Loader の概略図

動的ローディング機能 動的ローディング用アプリケーションモジュール 独立の ELF ファイルとしてビルド ベースシステムのコードに依存しない 動的シンボル解決は不要 PIL API ライブラリは静的にリンク 動的リンク機構は不要 単一のドメイン (TDOM_APP) に属するため コードとデータのメモリ保護設定は単純で text セクションと data セクションがあれば十分 cfg ファイルの内容を ELF ファイルに格納する ローダでモジュールのオブジェクトを動的に生成するために必要 Module Configuration Table のコードをコンパイル時に生成する ローダからオブジェクトの ID を取得する方法が必要 コンパイル時は unknown ローディング用メモリ領域のアドレスは固定ではない ベースシステムの設定等により変化 完全位置独立コード (-mno-pic-data-is-text-relative) で対応

動的ローディング機能 cfg ファイルを格納する Module Configuration Table Module Configuration Entry の配列 sfncd: 静的機能コード e.g. TSFN_CRE_TSK/SEM/FLG/MTX argument: 引数へのポインタ 生成情報のパケットの場合が多い retvalptr: 動的生成の関数の戻り値を格納する変数へのポインタ 静的 API CRE_TSK の例 : CRE_TSK(APP_INIT_TASK, { TA_ACT, 0, _app_init_task, TPRI_APP_INIT_TASK, STACK_SIZE, NULL });

動的ローディング機能 オブジェクト ID 生成の流れ 1. オブジェクト ID のマクロと格納するための変数を定義 2. オブジェクト ID の変数を Mod Cfg Entry の戻り値として登録 3. ローダが動的生成関数 acre_yyy() を呼び出してオブジェクト ID を Mod Cfg Entry の戻り値として設定 4. これで オブジェクト ID のマクロは実際の値になる

動的ローディング機能 ローダのロード操作の流れ 0. 動的モジュールのセクションを格納する領域を用意 1. ELF ファイルのセクションを上記の領域にコピー 2. 完全位置独立コードの relocation を行う 3. Module Cfg Table を参照して順次にオブジェクトを生成 4. 生成したオブジェクトの ID を retvalptr に格納 5. 全てのオブジェクトが生成されたら ロード完了 6. 生成に失敗するオブジェクトがあったら 各 retvalptr を参考して今まで生成した全てのオブジェクトを削除 Unload は生成したタスクを強制終了してオブジェクトを削除

発表内容 EV3RT の内部構造の解説 アーキテクチャの概要 ベースシステムの解説 ユーザアプリケーションとSDK 動作ローディング機能 Dynamic Module Loader アプリケーションモジュール アプリのローディングの流れ 進んだ使い方 55

EV3RT の進んだ使い方 スタンドアローン形式で より高度な開発ができる プラットフォームの開発 拡張 application loader mruby on ev3rt+tecs ベースシステムのカスタマイズ TOPPERS/HRP2カーネルの全機能が自由に利用できる デバイスドライバ ミドルウェアの直接アクセス 56

EV3RT の進んだ使い方 ベースシステムのカスタマイズ 動的ローディングの制限を変更する時はリビルトが必要 静的に生成されたページテーブルの情報が変わった 設定ファイルを書き換えるだけで対応できない $ cd base-workspace; make app=loader カスタマイズ可能な項目は ev3.h にまとめてある #define TMAX_APP_TSK_NUM (32) #define TMAX_APP_SEM_NUM (16) #define TMAX_APP_FLG_NUM (16) #define TMAX_APP_DTQ_NUM (16) #define TMAX_APP_TEXT_SIZE (1024 * 1024) #define TMAX_APP_DATA_SIZE (1024 * 1024) #define TMAX_APP_BINARY_SIZE (1024 * 1024) e.g. Application Module のリソース制限 57

EV3RT の進んだ使い方 HRP2 カーネルの全機能が自由に利用できる 動的ローディング形式では アプリの障害から Loader とベースシステムを守るために アプリには幾つかの制限が存在 全てのオブジェクトは単一のユーザドメイン (TDOM_APP) に属する 使用可能な最高優先度 (TMIN_APP_PRI) が存在する スタンドアローン形式では 上記の制限がなくて cfg ファイルでアプリケーションを自由に設計できる メリット HPR2 の全ての機能 ( 動的生成機能拡張を含む ) が使える デメリット Loader が使えなくなって アプリの更新に手間がかかる カーネルドメインを利用する場合 デバッグは難しくなる 58

EV3RT の進んだ使い方 デバイスドライバ ミドルウェアの直接アクセス アプリ開発の利便性を向上するために Bluetooth や FatFS のドライバ機能が標準 C ライブラリ経由で使う 学習コストがなくなった反面 フル機能も使えなくなった 例えば 標準 Bluetooth スタックの BTstack は Bluetooth Personal Area Network Bluetooth HID => キーボード ゲームコントローラ等 Bluetooth OBEX => ファイル転送サービス 等様々なプロトコルも対応 EV3 間の通信を実現できる 59

EV3RT の進んだ使い方 プラットフォーム拡張の例 : スクリーンショット機能追加 EV3RT のチュートリアルを作る時 LCD の画面を撮りたい ユーザアプリは自分の画面しかアクセスできない Console の画面を撮ることができない 複数のアプリを撮りたい場合 アプリ毎に修正が必要 スタンドアロン形式でシステムタスクを追加 特権モードで動作 LCD のドライバに直接にアクセスできる lcd_dri.h on_display_fb の内容を周期的に SD カードに保存 ボタンハンドラ方式だと既存の機能と干渉しやすい Newlib のファイル操作関数 (fopen 等 ) は非特権用のため fatfs_dri.h を include して直接に FatFS の関数 (f_open 等 ) を使用 60

ご清聴ありがとうございました 61