-
Notifications
You must be signed in to change notification settings - Fork 3
Nios II サポート
Shuta Kimura edited this page Aug 21, 2019
·
17 revisions
TinyThreadsはIntel(Altera) Nios II CPUに対応しています。Nios II Software Build Toolsに統合することで、新規プロジェクト作成時にBSPの一種として選択できるようになります。
- インストール先の場所(IP置き場)を決めて下さい。特定のプロジェクト用フォルダの中ではなく、あなたのホームディレクトリの下など共通の場所を選択することを推奨します。
- リリース一覧から必要なバージョンのzipまたはtarball(tinythreads-nios2-xxx.{zip,tar.gz})を取得し、インストール先フォルダに展開して下さい。
- Quartusを起動し、「Tools」→「Options...」からオプション設定画面を開き、「IP Catalog Search Locations」を選択します。
- Global IP search directoryに、上記のフォルダを登録してください。
- その際、再帰的にIPが検索されるよう、「**/*」をフォルダ名の末尾に追加してください。
- 例:
- その際、再帰的にIPが検索されるよう、「**/*」をフォルダ名の末尾に追加してください。
- OKを押してオプション設定画面を閉じ、変更を保存してください。
- NiosII SBTのEclipseを起動し、「File」→「New」→「Nios II Board Support Package」を選択してください。
- 次の例のように、BSP typeにTinyThreadsが追加されていれば導入完了です。
- BSPプロジェクトの作成時に、BSP typeから「TinyThreads」を選んで下さい。
- BSPプロジェクト作成後、必要に応じて、BSP EditorのMainタブにある「tinyth」グループの設定を変更してください。設定項目はCommonとAdvancedの両方にあります。
残念ながら、Nios II開発環境は作成済みのBSPプロジェクトのOS変更に対応していません。BSPプロジェクトの作り直しが必要です。
- 必要に応じて、古いBSPプロジェクトの名前を変更してください。
- 新規BSPプロジェクトをBSP typeとしてTinyThreadsを選択して作成してください。
- 古いBSPプロジェクトから、追加のファイルや設定を移行してください。
- 各アプリケーションプロジェクトのProperies→Nios II Application Propertiesを開き、BSP project locationを新規BSPプロジェクトの場所に変更してください。
グループ | 名前 | 説明 |
---|---|---|
Common | tinyth.feature.enable_cond | 条件付き変数関連API(pthread_cond_* )を有効にします。 |
Common | tinyth.feature.enable_mutex | ミューテックス関連API(pthread_mutex_* )を有効にします。 |
Common | tinyth.feature.enable_sem | セマフォ関連API(sem_* )を有効にします。 |
Common | tinyth.feature.enable_once | Onceコントロール関連API(pthread_once_* )を有効にします。 |
Common | tinyth.feature.enable_rwlock | 無視されます。現段階ではreader-writerロックは未実装です。 |
Common | tinyth.feature.enable_spin | 無視されます。現段階ではスピンロックは未実装です。 |
Common | tinyth.feature.enable_sleep | スリープ関連API(sleep , usleep )を有効にします。 |
Common | tinyth.feature.enable_profile | タスク切り替え回数カウントを有効にします。(デバッグ向け) |
Common | tinyth.feature.enable_name | スレッド名設定機能を有効にします。(デバッグ向け) |
Common | tinyth.scheduling.preemption.enabled | プリエンプションを有効にします。 |
Common | tinyth.scheduling.preemption.interval | プリエンプションの間隔をミリ秒単位で設定します。 |
Advanced | tinyth.scheduling.priority.max | 優先度の最大値(最も優先度が低い)を指定します。有効な範囲は1~255です。 |
Advanced | tinyth.scheduling.priority.min | 優先度の最小値(最も優先度が高い)を指定します。有効な範囲は1~255です。 |
Advanced | tinyth.scheduling.priority.default | 優先度を明示的に変更しない場合の、デフォルトの優先度を指定します。有効な範囲は上記のmin~maxです。 |
Advanced | tinyth.scheduling.policy.default_fifo | デフォルトのスケジューリング方式をFIFOにします。この項目を有効にしない場合、デフォルトのスケジューリング方式はラウンドロビンになります。 |
Advanced | tinyth.others.min_stack_size | デフォルトのスタックの大きさをバイト数で指定します。 |
Advanced | tinyth.others.thread_safe_newlib | スレッドセーフなnewlibへのアクセスを有効にします。この設定を無効にするとRAM使用量を削減できますが、一部のAPIがスレッドセーフではなくなります。スレッドの処理内容が限定的であるなど、安全が担保されている場合のみ無効にしてください。詳しくは制約を参照ください。 |
Advanced | tinyth.others.use_shadow_register_set | Nios IIのShadow register setを利用した高速なスレッド切り替えを有効にします。 |
- ISRでのAPI利用に関して
- TinyThreadsが提供するAPIのうち、ISR(割り込みハンドラ)内で使用が許可されているのは
sem_post()
のみです。 - 他の関数をISR内で使用した場合、動作は未定義です。
- TinyThreadsが提供するAPIのうち、ISR(割り込みハンドラ)内で使用が許可されているのは
- スレッドセーフ設定に関して
-
tinyth.others.thread_safe_newlib
を無効にした場合、newlibの_impure_ptr
がスレッド毎に管理されません。そのため、newlibの関数を複数のスレッドから同時に呼び出した場合に、(たとえその関数がスレッドセーフだとマニュアルに書かれていても)予期しない動作をする可能性があります。 - BSP EditorでSmall C libraryを有効にした場合、newlib準拠ではないため
tinyth.others.thread_safe_newlib
は無効にしなければなりません。- この際、TinyThreads内部で呼び出される
malloc()
とfree()
は、__malloc_lock()
/__malloc_unlock()
により排他制御が行われるため安全です。 - 他のlibc関数に関してはユーザー側で適切な排他処理を行って下さい。
- この際、TinyThreads内部で呼び出される
-
- Shadow register set利用時特有の制約
- 同時に存在できるスレッドはShadow register setの個数が最大となります。これにはmain()関数が実行されるデフォルトスレッドと、動作すべきスレッドが無い場合に時間を消費するアイドルスレッドも含まれます。
- 例えば、Shadow register setが7個の場合、
pthread_create()
で同時に生成できるスレッドはそこから2を引いた5個が最大です。 - 同時生成スレッド数の上限を越えてスレッドを生成しようとすると、
pthread_create()
はEAGAIN
を返して失敗します。
- 例えば、Shadow register setが7個の場合、
- 乗除算命令のエミュレーション(Instruction emulation)は利用できません。(BSP EditorでInstruction emulationを有効にすると、TinyThreadsはコンパイルエラーを発生させます)
- 同時に存在できるスレッドはShadow register setの個数が最大となります。これにはmain()関数が実行されるデフォルトスレッドと、動作すべきスレッドが無い場合に時間を消費するアイドルスレッドも含まれます。