Skip to content

Zynq サポート

Shuta Kimura edited this page Aug 23, 2019 · 11 revisions

TinyThreadsはXilinx Zynq-7000シリーズに搭載されているARM Cortex-A9に対応しています。Xilinx SDKに統合することで、新規プロジェクト作成時にBSPの一種として選択できるようになります。

  • v1.5時点ではVivado 2018.3で動作確認しています。

インストール方法

  1. Xilinx SDKのインストール先を確認してください。WindowsならばC:\Xilinx\SDK\2018.3などです。
  2. リリース一覧から必要なバージョンのzipまたはtarball(tinythreads-zynq-xxx.{zip,tar.gz})を取得し、<SDKインストール先>/data/embeddedsw/ThirdParty/bsp/に展開してください。
  3. Xilinx SDKがすでに起動している場合は、一度終了して起動しなおしてください。

使い方

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

  1. Application ProjectまたはBoard Support Packageプロジェクトの作成時に、OS platformの一覧から「tinythreads」を選んで下さい。
  2. プロジェクト作成後、必要に応じて、BSP Settingsのtinythreadsグループにある設定を変更してください。

設定項目

グループ 名前 説明
features enable_cond 条件付き変数関連API(pthread_cond_*)を有効にします。
features enable_mutex ミューテックス関連API(pthread_mutex_*)を有効にします。
features enable_sem セマフォ関連API(sem_*)を有効にします。
features enable_once Onceコントロール関連API(pthread_once_*)を有効にします。
features enable_rwlock 無視されます。現段階ではreader-writerロックは未実装です。
features enable_spin 無視されます。現段階ではスピンロックは未実装です。
features enable_sleep スリープ関連API(sleep, usleep)を有効にします。
features enable_profile タスク切り替え回数カウントを有効にします。(デバッグ向け)
features enable_name スレッド名設定機能を有効にします。(デバッグ向け)
others min_stack_size デフォルトのスタックの大きさをバイト数で指定します。
others strict_check アサーションを追加し、異常動作時の検出箇所を増やします。
others thread_safe_newlib スレッドセーフなnewlibへのアクセスを有効にします。この設定を無効にするとRAM使用量を削減できますが、一部のAPIがスレッドセーフではなくなります。スレッドの処理内容が限定的であるなど、安全が担保されている場合のみ無効にしてください。詳しくは制約を参照ください。
others enable_vfp_switch VFPのコンテキスト切り替えを有効にします。この設定を有効にすると、複数のスレッドでFloating-point関連命令およびAdvanced SIMD関連命令が使用できます。
scheduling preemption_enabled プリエンプションを有効にします。
scheduling preemption_interval プリエンプションの間隔をミリ秒単位で設定します。
scheduling priority_max 優先度の最大値(最も優先度が低い)を指定します。有効な範囲は1~255です。
scheduling priority_min 優先度の最小値(最も優先度が高い)を指定します。有効な範囲は1~255です。
scheduling priority_default 優先度を明示的に変更しない場合の、デフォルトの優先度を指定します。有効な範囲は上記のmin~maxです。
scheduling policy_default_fifo デフォルトのスケジューリング方式をFIFOにします。この項目を有効にしない場合、デフォルトのスケジューリング方式はラウンドロビンになります。

制約

  • インストラクションモードについて
    • ARMエンコーディングのみ対応。Thumbモードでは動作しません。
  • ISRでのAPI利用に関して
    • TinyThreadsが提供するAPIのうち、ISR(IRQハンドラ)内で使用が許可されているのはsem_post()のみです。
    • 他の関数をISR内で使用した場合、動作は未定義です。
  • アプリケーションでの割り込みの利用に関して
    • TinyThreadsはチック割り込み生成のため、内部でXScuGicのインスタンスを保持しています。アプリケーション側で割り込み設定の実装を行う場合、tth_get_xscugic_instance()関数の戻り値で得られるXScuGicのポインタを用いて設定を行ってください。
      // 例
      #include "bspconfig.h"  /* For tth_get_xscugic_instance */
      #include "xscugic.h"    /* For XScuGic_xxx APIs */
      
      void setup_interrupts()
      {
          XScuGic *InstancePtr = (XScuGic *)tth_get_xscugic_instance();
          XScuGic_Connect(InstancePtr, ...); 
      }
  • スレッドセーフ設定に関して
    • tinyth.others.thread_safe_newlibを無効にした場合、newlibの_impure_ptrがスレッド毎に管理されません。そのため、newlibの関数を複数のスレッドから同時に呼び出した場合に、(たとえその関数がスレッドセーフだとマニュアルに書かれていても)予期しない動作をする可能性があります。
  • ISRでのVFP利用に関して
    • ISR内ではVFPを利用できません。(関連する命令を使用するとUndefinedExceptionを発生させます)
  • スレッドでのVFP利用に関して
    • others.enable_vfp_switchの設定値により振るまいが異なります。
      • trueの場合、各スレッドで独立したVFPレジスタのコンテキストを持ちます。(必要に応じてコンテキストスイッチを行います)
      • falseの場合、VFPレジスタのコンテキストスイッチは行われません。全スレッドがVFPレジスタを共有します。
    • VFPレジスタのコンテキストスイッチは多量のメモリコピーを必要とする重いスイッチのため、VFP関連命令を初めて使用するタイミングまでコンテキストスイッチを遅延させる仕様となっています。