Skip to content

Nios II サポート

Shuta Kimura edited this page Aug 21, 2019 · 17 revisions

TinyThreadsはIntel(Altera) Nios II CPUに対応しています。Nios II Software Build Toolsに統合することで、新規プロジェクト作成時にBSPの一種として選択できるようになります。

インストール方法

  1. インストール先の場所(IP置き場)を決めて下さい。特定のプロジェクト用フォルダの中ではなく、あなたのホームディレクトリの下など共通の場所を選択することを推奨します。
  2. リリース一覧から必要なバージョンのzipまたはtarball(tinythreads-nios2-xxx.{zip,tar.gz})を取得し、インストール先フォルダに展開して下さい。
  3. Quartusを起動し、「Tools」→「Options...」からオプション設定画面を開き、「IP Catalog Search Locations」を選択します。
  4. Global IP search directoryに、上記のフォルダを登録してください。
    • その際、再帰的にIPが検索されるよう、「**/*」をフォルダ名の末尾に追加してください。
      • 例:
  5. OKを押してオプション設定画面を閉じ、変更を保存してください。
  6. NiosII SBTのEclipseを起動し、「File」→「New」→「Nios II Board Support Package」を選択してください。
  7. 次の例のように、BSP typeにTinyThreadsが追加されていれば導入完了です。

使い方

新規プロジェクトへの適用方法

  1. BSPプロジェクトの作成時に、BSP typeから「TinyThreads」を選んで下さい。
  2. BSPプロジェクト作成後、必要に応じて、BSP EditorのMainタブにある「tinyth」グループの設定を変更してください。設定項目はCommonとAdvancedの両方にあります。

既存プロジェクトへの適用方法

残念ながら、Nios II開発環境は作成済みのBSPプロジェクトのOS変更に対応していません。BSPプロジェクトの作り直しが必要です。

  1. 必要に応じて、古いBSPプロジェクトの名前を変更してください。
  2. 新規BSPプロジェクトをBSP typeとしてTinyThreadsを選択して作成してください。
  3. 古いBSPプロジェクトから、追加のファイルや設定を移行してください。
  4. 各アプリケーションプロジェクトの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内で使用した場合、動作は未定義です。
  • スレッドセーフ設定に関して
    • 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関数に関してはユーザー側で適切な排他処理を行って下さい。
  • Shadow register set利用時特有の制約
    • 同時に存在できるスレッドはShadow register setの個数が最大となります。これにはmain()関数が実行されるデフォルトスレッドと、動作すべきスレッドが無い場合に時間を消費するアイドルスレッドも含まれます。
      • 例えば、Shadow register setが7個の場合、pthread_create()で同時に生成できるスレッドはそこから2を引いた5個が最大です。
      • 同時生成スレッド数の上限を越えてスレッドを生成しようとすると、pthread_create()EAGAINを返して失敗します。
    • 乗除算命令のエミュレーション(Instruction emulation)は利用できません。(BSP EditorでInstruction emulationを有効にすると、TinyThreadsはコンパイルエラーを発生させます)