Nios II IDE によるソフトウェア開発 セクション 2

Similar documents
Nios II - Vectored Interrupt Controller の実装

SOPC Builder ペリフェラル 簡易ユーザ・ガイド - PIO (Parallel I/O)

複数の Nios II を構成する際の注意事項

Nios II Flash Programmer ユーザ・ガイド

Nios II - PIO を使用した I2C-Bus (2ワイヤ)マスタの実装

Nios II SBT Flash Programmer ユーザ・ガイド

Quartus II クイック・スタートガイド

Microsoft Word - ALT0982_program_epcs_by_niosii_v10.doc

ModelSim-Altera Edition インストール & ライセンスセットアップ Linux ver.11

ModelSim-Altera - RTL シミュレーションの方法

PCI-Express ハード IP を使用した DMA の実現 for Cyclone V GT FPGA 開発キット(ソフトウェア編)

Quartus II はじめてガイド - Convert Programming File の使い方

アルテラ USB-Blastre ドライバのインストール方法 for Windows OS

Nios II 簡易シミュレーション

Quartus Prime はじめてガイド - デバイス・プログラミングの方法

Nios II 簡易チュートリアル

Quartus Prime - プログラミング・ファイルの生成や変換(Convert Programming Files)

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

FPGA 外部のメモリをアバロン・MM・インタフェースへ接続する方法

Nios II IDE によるソフトウェア開発 - セクション 1

Quartus II はじめてガイド - プロジェクトの作成方法

Nios II ソフトウェア開発ハンドブック Version 1.2 第6章. 例外処理 ver.1.2

Nios II ハードウェア・チュートリアル

Quartus II クイック・スタート・ガイド

S1C17 Family Application Note S1C17 シリーズ PORT 多重割り込みアプリケーションノート Rev.1.0

Preloader Generator の使用方法

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

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

オンチップ・メモリ クイック・ガイド for Cyclone III

Nios II 簡易チュートリアル

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

ブート領域、フラッシュ領域の分割方法 RL78ファミリ用Cコンパイラ CC-RL

Nios II カスタム・インストラクションによるキャスト(型変換)の高速化

Notes and Points for TMPR454 Flash memory

Nios® II HAL API を使用したソフトウェア・サンプル集 「Modular Scatter-Gather DMA Core」

04-process_thread_2.ppt

RH850の割り込み/例外実現方法 CC-RHアプリケーションガイド

PowerPoint Presentation

スライド 1

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

AquesTalk プログラミングガイド

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

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

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

AN1526 RX開発環境の使用方法(CS+、Renesas Flash Programmer)

Quartus II はじめてガイド - デバイス・プログラミング方法

JP-2-Develop Websites and Components in AEM v6x_(V3_after QA)_1111

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

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

Quartus II はじめてガイド - プロジェクトの作成方法

TFTP serverの実装

本書は INpMac v2.20(intime 5.2 INplc 3 Windows7/8/8.1に対応 ) の内容を元に記載しています Microsoft Windows Visual Studio は 米国 Microsoft Corporation の米国及びその他の国における登録商標です

SoC はじめてガイド - HPS-FPGA 間のアクセス方法(Arria® V SoC / Cyclone® V SoC 編)

Quartus II Web Edition インストール・ガイド

UIOUSBCOM.DLLコマンドリファレンス

24th Embarcadero Developer Camp

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

AquesTalk Win Manual

スライド 1

Quartus II - デバイスの未使用ピンの状態とその処理

Quartus II はじめてガイド - EDA ツールの設定方法

1. 新規プロジェクト作成の準備新規プロジェクトのためのフォルダを用意して そこにプロジェクトを作成します [ 新しいフォルダー ] をクリックして希望のフォルダに新しいフォルダを作成します この例では TrST_F401N_BlinkLD2 というフォルダを作成しました TrST_F401N_Bl

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

AN1609 GNUコンパイラ導入ガイド

<4D F736F F D20342E899E D2091E52D81848FAC82D682CC88F8897A2E646F6378>

MSP430 CCSv5 を使い Flash Memory 内容と version 情報を確認する方法 ( テクニック編 ) Rev: PIC Trout 今回は 下記の2 件について説明します 1) CCSv5 を使用して MSP430 の Flash Memory 内容を

2015/04/01 改定 オムロン DeviceNet ユニット CJ1W-DRM21 に関するコンフィグレーション作業について 1. 概要 DeviceNet ユニット CJ1W-DRM21 を装着したオムロン製 CJ2 シリーズと WAGO-I/0-SYSTEM DeviceNet 対応バスカ

intra-mart WebPlatform/AppFramework

プログラミング実習I

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

HLS はじめてガイド - 簡易チュートリアル

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

Singapore Contec Pte Ltd. Opening Ceremony

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

Microsoft Word - EFI_Framework_Debug_JP.doc

Windows GPO のスクリプトと Cisco NAC 相互運用性

スライド 1

Microsoft PowerPoint - 09.pptx

ご注意 1) 本書の内容 およびプログラムの一部 または全部を当社に無断で転載 複製することは禁止されております 2) 本書 およびプログラムに関して将来予告なしに変更することがあります 3) プログラムの機能向上のため 本書の内容と実際の画面 操作が異なってしまう可能性があります この場合には 実

Micro Focus Enterprise Developer チュートリアル メインフレーム COBOL 開発 : MQ メッセージ連携 1. 目的 本チュートリアルでは CICS から入力したメッセージを MQ へ連携する方法の習得を目的としています 2. 前提 使用した OS : Red H

memo

Nios II マイコン活用ガイド Nios II マイコンボード紹介 ステップ 1 AuCE C3 製品紹介 AuCE C3 は ソフトコア プロセッサ Nios II( アルテラ社 ) を搭載可能なマイコンボードです 弊社の基本ソフトウェアをインストールし FPGA 開発者のデザインと Nios

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

フローチャート自動生成ツール yflowgen の使い方 目次 1 はじめに 本ツールの機能 yflowgen.exe の使い方 yflowgen.exe の実行方法 制限事項 生成したファイル (gml ファイル形式 ) の開

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

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Transcription:

ALTIMA Corp. Nios II IDE によるソフトウェア開発セクション 2 ver.1.0 2010 年 8 月 ELSENA,Inc.

Nios II IDE によるソフトウェア開発セクション 2 目次 1. はじめに... 4 2. Nios II ソフトウェア プロジェクトが必要とする重要なファイル... 4 2-1. HAL システム ヘッダファイル... 4 2-2. リンカ スクリプト... 6 2-2-1. リンカ スクリプト... 6 2-2-2. generated.x ファイル... 7 2-2-3. リンカ スクリプトのカスタマイズ... 8 2-2-4. 変数のメモリ配置... 8 2-2-5. スタックとヒープの配置... 9 2-3. 初期化ファイル... 11 2-3-1. alt_sys_init.c ( 自動生成 )... 11 3. ブート シーケンス... 12 3-1. ブート シーケンス... 12 3-1-1. Hosted vs Free-Standing アプリケーション... 13 3-1-2. ブート コピア... 13 3-1-3. ブート コピアの修正... 14 3-1-4. フラッシュ メモリのプログラミング... 14 4. Nios II コード サイズ... 15 4-1. コード サイズの確認... 15 4-1-1. コード サイズを知る方法 (.objdump ファイルの生成 )... 15 4-1-2..objdump ファイルからコード サイズを読む... 15 4-2. コード サイズの縮小... 16 4-2-1. コードのフット プリントを小さくするオプション... 16 4-2-2. alt_* 標準入出力ルーチンの使用... 18 4-2-3. コード サイズ例... 18 5. Nios II 例外処理... 19 5-1. Nios II 例外処理... 19 5-2. ハードウェア割り込み... 19 5-2-1. 割り込み処理のための HAL API... 19 ver. 1.0 2010 年 8 月 2/25 ALTIMA Corp. / ELSENA,Inc.

Nios II IDE によるソフトウェア開発セクション 2 5-2-2. 例外処理ルーチンの書き方... 20 5-2-3. 例 1: 割り込み処理ルーチン... 21 5-2-4. 例 2: ネストした割り込み処理... 22 5-3. 割り込みレスポンスの高速化... 23 5-3-1. 割り込みレイテンシ用語とその値... 23 5-3-2. 割り込みレスポンスの高速化... 23 5-3-3. Interrupt Vector カスタム インストラクション... 24 ver. 1.0 2010 年 8 月 3/25 ALTIMA Corp. / ELSENA,Inc.

Nios II IDE によるソフトウェア開発セクション 2 1. はじめに この資料は Nios II IDE によるソフトウェア開発について紹介しています セクション 2 で取り上げている内容は 以下のとおりです Nios II ソフトウェア プロジェクトが必要とするファイル ブート シーケンス Nios II コード サイズ 例外処理 2. Nios II ソフトウェア プロジェクトが必要とする重要なファイル 以下のファイルは Nios II ソフトウェア プロジェクトを構成する際に重要なファイルです これらのファイルは 基本的に Nios II IDE にてプロジェクトのビルド時に自動生成されます ファイルの場所 : syslib プロジェクト => Debug / Release => system_description システム ヘッダ ( system.h ) SOPC Builder で生成したシステム内の全ペリフェラルのメモリマップが定義されたファイルです リンカ スクリプト ( generated.x ) プログラム セグメントをメモリのどこに配置するかを指定したファイルです ユーザは System Library Properties にてプログラム セグメントの設定を行うことができます 初期化ファイル ( alt_sys_init.c ) システムが使用するデバイス ドライバを初期化するためのソース ファイルです 2-1. HAL システム ヘッダファイル HAL システム ライブラリを使用するにあたっての各ペリフェラルの基本情報が定義された system.h ファイルについて説明します system.h ファイルには SOPC Builder で生成した Nios II や各ペリフェラルのハードウェア情報のすべてが記述されたファイルです system.h ファイルは HAL システム ライブラリ用に Nios II IDE によって syslib プロジェクトのビルド時に自動生成されます ver. 1.0 2010 年 8 月 4/25 ALTIMA Corp. / ELSENA,Inc.

system.h にはシステム内の各ペリフェラルの設定 システム パラメータのマクロ定義が含まれます ペリフェラル ハードウェア設定 ベース アドレス 割り込み番号 ペリフェラルの名前 関数のプロトタイプ宣言 static 宣言 構造体定義は含みません system.h ファイルを アプリケーション コードで #include し ファイルの中で定義されているベース アドレスや割り込み番号をペリフェラル名で表したマクロを使用してアクセスするコードを書くことができます SOPC Builder でのアドレスマップの変更を行った際などには system.h にも変更が反映されるため アプリケーションの変更を行うことなく 容易に対応することができます SOPC Builder システム ペリフェラル名 ベース アドレス 割り込み優先順位 その他パラメータ等 Nios II IDE syslib プロジェクトプロパティ stdio デバイス Linker メモリ設定等 system.h ファイル system.h, generated.x, alt_sys_init.c それぞれのファイルは SOPC Builder で Generate 時に生成される.ptf ファイルのシステムのハードウェア情報と Nios II IDE でのソフトウェア プロジェクトの syslib プロジェクトのプロパティで設定された情報が定義されたファイルです SOPC Builder の System Contents タブで各コンポーネントのスタート アドレスやモジュール名等 ハードウェアに変更がある場合には下記の方法でソフトウェア プロジェクトに反映させます SOPC Builder にて Generate ボタンにより.ptf ファイルの再生成 Nios II IDE で新しい.ptf ファイルに基づいたソフトウェア プロジェクトを作成 Nios II IDE が system.h, generated.x, alt_sys_init.c を再生成 ver. 1.0 2010 年 8 月 5/25 ALTIMA Corp. / ELSENA,Inc.

2-2. リンカ スクリプト 2-2-1. リンカ スクリプト Nios II のリンカ スクリプト generated.x は Nios II IDE にてソフトウェア プロジェクトをビルドした際に自動生成されます syslib プロジェクトの system_description フォルダに生成されます このリンカ スクリプトは 利用可能なメモリ セクション内でコードおよびデータのマッピングを制御します 自動生成されたリンカ スクリプトは システム内の各物理メモリ デバイスに対するセクション (.text.rodata.rwdata.bss) を定義します 例えば system.h ファイルで定義された on_chip_memory という名前のメモリコンポーネントが存在する場合には.on_chip_memory という名前のメモリ セクションが生成されます コードとデータを system.h ファイルで定義された物理メモリ デバイスに配置します Nios II IDE の syslib ライブラリのプロパティの Linker Script 欄でプログラム メモリ (.text) リード オンリー データメモリ (.rodata) リード / ライト データメモリ (.rwdata) 等を配置するメモリ デバイスを選択します メモリ デバイスは SOPC Builder システムに組み込まれているメモリから選択します ver. 1.0 2010 年 8 月 6/25 ALTIMA Corp. / ELSENA,Inc.

Linker Script で設定した.text 等の領域のほかにリセット ハンドラ用の予約領域 例外ハンドラ用の予約領域も確保されます リセット ハンドラと例外ハンドラは Nios II の設定の Reset Vector Exception Vector にて設定されます リセット ベクタは通常フラッシュ メモリ等の不揮発性のメモリに配置します 例 ) リンク マップ ddr_sdram Boot メモリ中のリセット ハンドラ用 例外ハンドラ用 2-2-2. generated.x ファイル 自動生成されるリンカ スクリプトの一部を抜粋したものです.text.rodata.rwdata.bss が下記のように定義されており それぞれのセクションが SOPC Builder で定義されている各メモリ デバイスに割り当てられています SECTIONS がメモリ セクションを示しています ver. 1.0 2010 年 8 月 7/25 ALTIMA Corp. / ELSENA,Inc.

2-2-3. リンカ スクリプトのカスタマイズ すべてのリンク情報はリンカ スクリプトによって定義されます 必要であればリンカ スクリプトを編集することが可能です その際には Nios II IDE によって自動生成されるリンカ スクリプトの generated.x をカスタマイズして使用します まず generated.x を syslib プロジェクトフォルダに新しい名前 ( 例 generated_new.x ) でコピーし編集したものを syslib プロジェクトのプロパティ設定のページで Custom linker script にチェックを入れて選択し 使用します 2-2-4. 変数のメモリ配置 新たなメモリ セクションの生成や各セクションの配置はリンカ スクリプトで指定することが可能です ユーザのソース コード内で attribute section 記述により 特定の変数や関数を任意のメモリ領域に配置することが可能です こちらは GCC コンパイラの機能になります デフォルトの設定では 変数は.rwdata セクション 関数は.text セクションに配置されます 以下のコードは.on_chip_memory という名前のメモリに変数 foo_ver.ext_ram という名前のメモリに関数 bar_func を配置する方法を示します 例 ) 変数および関数を物理メモリ セクション配置する /* Data using the section attribute should be initialized */ int foo_var attribute ((section (".on_chip_memory"))) = 0; void bar_func(void* ptr) attribute ((section (".ext_ram"))); ver. 1.0 2010 年 8 月 8/25 ALTIMA Corp. / ELSENA,Inc.

ユーザのソース コード内で下記のようにポインタによって 変数アドレスを直接指定することも可能です それぞれの物理アドレスは system.h 内でマクロで定義されていますので 使用することができます #include "system.h" < 省略 > int *length_mem_ptr; char *type_mem_ptr; length_mem_ptr = (int)ext_flash_base; type_mem_ptr = (char)onchip_ram_base; system.h ファイル 2-2-5. スタックとヒープの配置 スタックとヒープは デフォルトの設定ですと.wrdata セクションと同じメモリ パーティションに配置されます スタックのベース アドレスは メモリの最終アドレスに設定され 下位方向 ( アドレスの若い方向 ) に進みます ヒープ領域はメモリの未使用領域の先頭から上位に向かって伸びていきます 0x1000000 0xE00000 0xC00000 0xA00000 0x800000 RAM Dynamic Memory Application Code Start-up Code Stack Heap.bss.rwdata.rodata.text.exceptions ( 例外アドレス ) ver. 1.0 2010 年 8 月 9/25 ALTIMA Corp. / ELSENA,Inc.

スタックとヒープのベース アドレスは リンカのコマンドラインスイッチで下記コマンドを使用してオーバーライドが可能です スタックのオーバーライドコマンド alt_stack_pointer 例 ) -Wl,-defsym Wl, alt_stack_pointer=alt_irq_entry+0xfffe0 ヒープのオーバーライドコマンド alt_heap_start これらのコマンドを使用してオーバーライドした情報は.objdump ファイルで確認できます (.objdump ファイルについては 4-1. 章コード サイズの確認を参照 ) リンカ オプションをここに入力 アプリケーション プロジェクトの C/C++ Build 設定項目の Linker Flags の欄に リンカ オプションを入力します スタックとヒープの配置をオーバーライドする場合には プログラムの動作中に ヒープ領域とスタック領域が使用可能なメモリ容量を超えないよう注意しなければなりません Nios II IDE のデバッガには上記の自動チェック機能がオプションとして用意されています ( セクション 3 高度なデバッグ機能参照 ) ver. 1.0 2010 年 8 月 10/25 ALTIMA Corp. / ELSENA,Inc.

2-3. 初期化ファイル 2-3-1. alt_sys_init.c ( 自動生成 ) alt_sys_init.c ファイルはシステム内のサポート対象デバイスのデバイス ドライバを初期化するためのコードが含まれています syslib プロジェクトの system_description フォルダに生成されます このファイルの中では alt_sys_init () 関数が定義されています この関数は main () の前に呼び出されデバイスを初期化し プログラムからデバイスを使用できる状態にします 例 ) alt_sys_init.c 抜粋 デバイス ドライバヘッダ ファイル デバイス ドライバが定義する変数の宣言 デバイスの初期化 ver. 1.0 2010 年 8 月 11/25 ALTIMA Corp. / ELSENA,Inc.

3. ブート シーケンス 3-1. ブート シーケンス HAL は 以下のブート シーケンスを実行するシステム初期化コードを提供します Reset ブート コピアの実行 リンカ スクリプトで定義されたメモリにコードをコピー crt0.s キャッシュ bss 領域 スタック ポインタ グローバル ポインタの初期化 alt_main 割り込みシステムの初期化と main を呼び出すためのセットアップ alt_sys_init HAL デバイスの初期化 main() アプリケーション コード ユーザのアプリケーションで alt_main エントリ ポイントが必要な場合には 必要に応じて alt_main.c や alt_sys_init.c のブート コードのカスタマイズが可能です ブート コードを変更することによって 以下のような制御を行うことができます alt_main.c ブート シーケンスの制御とシステム リソースの選択 alt_sys_init.c 不要なデバイスの初期化コードを削除しコード サイズを小さくする 自動生成されるファイルの代わりに ローカル ファイルを使用する 例として 以下のような方法でブート コードのカスタマイズを行います <nios2eds> components altera_hal HAL src にある alt_main.c ファイルを syslib プロジェクトにコピーしてカスタマイズを行う syslib プロジェクト中の alt_sys_init.c をアプリケーション フォルダにコピーしてカスタマイズを行う 上記のような方法は free-standing development になります ver. 1.0 2010 年 8 月 12/25 ALTIMA Corp. / ELSENA,Inc.

3-1-1. Hosted vs Free-Standing アプリケーション Hosted と Free-Standing の実行環境には 以下のような違いがあります Hosted アプリケーション 開発するコードは main () から開始 すべてのシステム サービスとデバイスの初期化が行われ使用可能状態 どのようなシステム変更でもツールが自動的に対応 Free-Standing アプリケーション カスタマイズされたブート シーケンスを使用 ブート シーケンスの綿密な制御が可能 開発するコードは alt_main () から開始 (Altera 標準 ) 使用するデバイス サービスの初期化はユーザが行う alt_main () で 使用するキャラクタ モード デバイス ドライバを初期化し stdio をそのデバイスにリダイレクトしなければ動作しない 3-1-2. ブート コピア リセット ベクタを持つメモリ デバイスが Nios II プロセッサのブート デバイスになり プログラムが保存されます 外部フラッシュ メモリ または EPCS シリアル コンフィギュレーション デバイス オンチップ RAM をブート デバイスに指定できます システム ライブラリ プロパティの設定にてプログラムの実行領域 (.text セクション ) がブート デバイスではなく 外部の RAM 等に配置されている場合 Nios II Flash Programmer はすべてのコードおよびデータ セクションをロードするブート ローダを自動的にリセット ベクタに配置します ただし.text 領域がブート デバイス内に指定されている場合には 個別のローダは存在しません また フラッシュ メモリを.text 領域.rodata 領域に指定することは可能ですが フラッシュ メモリからの実行はアクセス スピードが遅いために 動作は低速となってしまいます 例 ) リセット ベクタをフラッシュ メモリ.text を RAM に配置した場合 Nios II IDE で Flash Programmer を実行すると自動で Boot Copier を実行コードに組み込んで.flash ファイルが生成される Boot Copier ファイル変換 書き込み実行 my_sw.elf my_sw.flash my_sw.flash Flash ブート コピアのソース コードは Nios II EDS のインストール ディレクトリに含まれます 例 ) <nios2eds> components altera_nios2 boot_loader_sources ver. 1.0 2010 年 8 月 13/25 ALTIMA Corp. / ELSENA,Inc.

3-1-3. ブート コピアの修正ブート時に下記のような拡張機能が必要な場合には ブート コピアをユーザが修正することも可能です 複数のブート イメージを切り替えて使用する ブート中のメッセージの表示 ブートデータのエラーチェック Word-align されていないイメージデータを展開するカスタマイズを行う場合には 下記のアプリケーションノートをご参照ください AN458: Alternative Nios II Boot Methods ( サンプル ソース付き ) http://www.altera.com./literature/lit-an.jsp http://www.altera.com/literature/an/an458.pdf 3-1-4. フラッシュ メモリのプログラミング CFI フラッシュと EPCS シリアル コンフィギュレーション デバイスは Nios II IDE もしくはコマンド シェルから Flash Programmer を使用してプログラミング可能です Flash Programmer は 以下のコードやデータを簡単にフラッシュ メモリに書き込むことができます FPGA ハードウェア イメージ ソフトウェア プログラム データ その他 任意のファイル ブート コピアの自動組み込み ソフトウェア プログラム データ FPGA ハードウェア イメージ 任意のファイル ver. 1.0 2010 年 8 月 14/25 ALTIMA Corp. / ELSENA,Inc.

4. Nios II コード サイズ コード サイズを最小サイズに縮小する必要がある場合に使用できる 各オプションについて説明します 4-1. コード サイズの確認 4-1-1. コード サイズを知る方法 (.objdump ファイルの生成 ) 以下の方法で Nios II コマンド シェル もしくは Nios II IDE にてプログラムのコード サイズを確認することができます コマンド シェルにて ビルド終了後に以下のコマンドを実行 nios2-elf-size <myproject.elf> nios2-elf-readelf <myproject.elf> ビルド時に.objdump ファイルを生成 IDE の window メニュー > Preferences > Nios II の設定で objdump ファイルの生成オプション (Generate objdump file) を On にすると アプリケーション プロジェクトの Debug ( もしくは Release) フォルダに <Application_Project_Name>.elf.objdump の名前で生成されます 4-1-2..objdump ファイルからコード サイズを読む 以下は.objdump ファイルの抜粋です 各メモリ セクションのサイズやアドレスがレポートされています Size の項目がそのセクションのコード サイズになります この例では.text 領域に配置されたプログラム コードは 0x228B0 byte です 例 ).objdump ファイルの抜粋 ver. 1.0 2010 年 8 月 15/25 ALTIMA Corp. / ELSENA,Inc.

4-2. コード サイズの縮小 4-2-1. コードのフット プリントを小さくするオプション 下記の各オプションを使用して コード サイズを縮小することが可能です コンパイラでの最適化 Application / Syslib 両方のプロジェクト Properties の C/C++ Build > Optimization Level を Os や O3 に設定することによって コンパイル時にコードはサイズと速度が最適化され フット プリントを縮小することができます Reduce device drivers の選択 いくつかのデバイスでは フル機能の 高速 型と軽量の スモール 型のドライバが用意されています HAL システム ライブラリは 常に高速型のドライバを使用します Nios II IDE の System library properties の reduce device drivers の設定をオンにすることによって スモール 型のドライバを使用します このスモール フットプリント ドライバに対応しているペリフェラルは UART JTAG UART 共通フラッシュ インターフェース コア LCD モジュール コントローラ コアです Max file descriptor の値を減らす キャラクタ モード デバイスおよびファイルにアクセスするファイル ディスクリプタは 使用可能なファイル ディスクリプタのプールから割り当てられます デフォルトは 32 です 例えば プログラムで 10 のみ必要であれば Max file descriptors: の値を小さくすることによってメモリ フットプリントを縮小することができます Small ANSI C library の選択 Small C library を選択することによって 縮小版の newlib ANSI C 標準ライブラリを使用する設定に変更できます 縮小版のライブラリには各関数に制限事項がありますので 使用する関数に影響があるかどうかをご確認いただく必要があります clean exit の非選択 終了時に伴うオーバーヘッドを回避するために ユーザ プログラムでは exit () 関数の代わりに _exit () を使用することができます Clean exit (flush buffers) の設定をオフにすることによって _exit () も使用しない設定にすることができます ver. 1.0 2010 年 8 月 16/25 ALTIMA Corp. / ELSENA,Inc.

UNIX-style 入力関数の使用 ANSI C ファイル I/O ではなく UNIX 形式のファイル I/O を直接使用することによってコード フットプリントを削減することが可能です Program never exits の選択 HAL はシステム シャットダウン時に exit () 関数を呼び出して プログラムからの終了を実現します exit () 関数は main () から戻るときに使用されますが 通常組み込みシステムは終了することがないため このコードは冗長となります Program never exits のオプションをオンにすることによって exit () 関数を省いてコード サイズを縮小します Support C++ の非選択 デフォルトだと C++ プログラムをサポートしていますが この設定をオフにすることができます lightweight device driver API の選択 デフォルトの設定はオフです Lightweight device driver API の設定をオンにすることによって いくつかの機能を省いてドライバのサイズを小さくします この設定は JTAG UART UART Optrex 16207 LCD のキャラクタ デバイスに対して有効です lightweight deriver API を使用する場合には 下記のような制限があります stdin stdout stderr ファイル ディスクリプタのみをサポート hostfs zipfs は使用不可 システムに含まれるすべてのキャラクタ モードのデバイス ドライバが lightweight driver API をサポートしていること 不要な場合 stdout/stdin/stderr を null にする stdin stdout stderr ファイル ディスクリプタはドライバがインストールされると HAL で設定されたチャネルにリダイレクトされます stdin stdout stderr の設定を null にすることによってリダイレクトのコードが削減されてフット プリントを小さくすることができます ver. 1.0 2010 年 8 月 17/25 ALTIMA Corp. / ELSENA,Inc.

4-2-2. alt_* 標準入出力ルーチンの使用 キャラクタ モードの縮小版 API を使用することによって 通常の printf ( ) 関数や getchar ( ) 関数を使用する場合に比べてコード サイズを縮小することができます この API には alt_printf ( ) alt_putchar ( ) alt_getchar ( ) alt_putstr ( ) の関数が含まれます この API を使用するためには sys/alt_stdio.h をインクルードします alt_printf ( ) 関数は通常の printf ( ) 関数と似ていますが %c %s %x のフォーマット指定子のみをサポートします コード サイズは alt_printf ( ) は約 350 Byte small newlib の printf ( ) は約 2240 Byte です 4-2-3. コード サイズ例 下記は Hello World テンプレートを使用した場合に 上記のコード削減のオプションを使用してどの程度コード サイズを縮小できるかを示しています Cyclone III のサンプル デザインを使用 Nios II のコアは Standard を使用しています Hello World デフォルト各オプションを使用削減率 66 Kbytes 340Bytes 90% 以上 ver. 1.0 2010 年 8 月 18/25 ALTIMA Corp. / ELSENA,Inc.

5. Nios II 例外処理 Nios II プロセッサで例外を処理する場合のプログラムの記述方法について説明します 5-1. Nios II 例外処理 Nios II の例外処理はすべての例外が exception location に置かれた例外処理ハンドラによって処理されます この例外処理コードは HAL システム ライブラリが提供し アドレスは SOPC Builder の Nios II Processor の Core Nios II タブの Exception Vector で設定したアドレスに配置されます 例外ハンドラでは例外のタイプを判定し どのように処理するかを決定します 例外ハンドラには alt_irq_entry () alt_irq_handler () software_exception () のルーチンがあります alt_irq_entry () ハードウェア割り込みが存在する場合に 発生した割り込みのタイプを判定し適切なルーチンを呼び出します alt_irq_handler () ハードウェア割り込みの割り込み番号を判定し 登録されたルーチンを呼び出します software_exception () ソフトウェア例外の原因を特定します 5-2. ハードウェア割り込み 5-2-1. 割り込み処理のための HAL API 下記の HAL API を使用して プログラムの特定のセクションに対しての割り込みをディセーブルしたり 再度イネーブルしたりすることができます alt_irq_register () : ユーザ割り込み処理 (ISR) 関数の登録 alt_irq_disable_all () : すべての割り込みを禁止します alt_irq_enable_all () : すべての割り込みを許可します alt_irq_interruptible () : ISR 関数内で使用します ISR 処理中に発生した より優先度の高い割り込みリクエストを許可します デフォルトでは ISR 実行中は他の割り込みは許可されません alt_irq_non_interruptible () : ISR 処理中に発生した割り込みを許可しません ( デフォルト ) 下記の HAL API を使用して ハードウェア割り込みにマスクをかけることができます 引数は 各ハードウェア割り込みに設定した割り込み番号です alt_irq_enable (alt_u32 id) alt_irq_disable (alt_u32 id) ver. 1.0 2010 年 8 月 19/25 ALTIMA Corp. / ELSENA,Inc.

5-2-2. 例外処理ルーチンの書き方 まず 呼び出される ISR をプログラム中に記述します ISR では 引数として ISR で使用するためのデータのポインタ (*context) SOPC Builder で割り当てられた割り込み番号 (id) が渡されます 呼び出し側では 記述した ISR を alt_irq_register () 関数を使用して登録します alt_irq_register () には 3 つの引数 割り込み番号 (id) ISR に引き渡すデータのポインタ (*context) 呼び出し先の関数のポインタ (*isr) を渡します ISR を記述する際には 以下の事項を考慮してください ISR 内で記述する処理は できるだけシンプルなものにします 基本的に時間のかかる処理は ISR 内では行わずアプリケーション内で行います ISR 内での標準入出力関数や RTOS 関数の呼び出しは 正常動作しません 例えば printf () 関数はルーチン内で UART や JTAG_UART を使用するため 割り込みを使用します 割り込み処理中は 基本的には他の割り込みはディセーブルとなりますので 正常動作しません ISR 内で他の割り込みを可能にするためには alt_irq_interruptible () や alt_irq_non_interruptible () を使用して制御します ISR を記述 sample_isr ( void* context, alt_u32 id) { } id : 割り込み番号 (0 to 31) context :ISR で使用する もしくは ISR 内で作成されるデータへの void ポインタ ISR の登録 プロトタイプ : alt_irp_register( alt_u32 id, void* context, void (*isr) (void*, alt_32)); 使用例 : alt_irq_register ( periph_irq, &some_data, sample_isr ); ver. 1.0 2010 年 8 月 20/25 ALTIMA Corp. / ELSENA,Inc.

5-2-3. 例 1: 割り込み処理ルーチン ISR の記述 context をローカルポインタに代入 この ISR 内 もしくは外に情報を渡すために使用可能 volatile は コンパイラによる不要な最適化を防ぐために使用 ISR は 可能な限り短時間の処理のみを実行する必要があります 必要なデータを取り込み 必要最低限のデバイス コントロールを行い ISR 内で割り込みをクリアし 終了します IRQ の登録とデバイスの初期化 ver. 1.0 2010 年 8 月 21/25 ALTIMA Corp. / ELSENA,Inc.

5-2-4. 例 2: ネストした割り込み処理 下記は ISR 実行中に 現在実行中の ISR よりも高い優先順位の高い割り込みが入ったときに そちらの ISR を実行するサンプルです テスト記述として illuminate_led2 () の中で alt_irq_interruptible() を記述し while 文を使用してより優先順位の高い割り込みが入るのを待ちます ボタン割り込みでエッジ キャプチャ レジスタを使用してエッジで割り込みを検出した場合には 必ず ISR の中でエッジ キャプチャ レジスタをリセットする必要があります 呼び出し側では button PIO の初期化と ISR (illuminate_led2) の登録を行います ISR 呼び出し側 ver. 1.0 2010 年 8 月 22/25 ALTIMA Corp. / ELSENA,Inc.

5-3. 割り込みレスポンスの高速化 5-3-1. 割り込みレイテンシ用語とその値 割り込みレイテンシ (Latency) 割り込みが発生してから 例外処理コードの最初のインストラクションを実行するまでの時間 (CPU サイクル ) 割り込み応答時間 (Response Time) 割り込みが発生してから ユーザが書いた割り込みルーチンの最初のインストラクションを実行するまでの時間 (CPU サイクル ) 割り込み復帰時間 (Recovery Time) 割り込み処理ルーチンの最後のインストラクションから通常の処理に戻るまでの時間 (RTOS の場合は 割り込まれたタスクに復帰するまでの時間 ) 割り込み処理パフォーマンス ( クロックサイクル数 ) Core Latency Response Time Recovery Time Nios II / f 10 105 62 Nios II / s 10 128 130 Nios II /e 12 485 222 5-3-2. 割り込みレスポンスの高速化 割り込みレスポンスを高速化するために 下記の操作が有効です ISR コードを高速でレイテンシの小さい tightly coupled メモリ または on-chip メモリに配置する 下記のように attribute 記述を使用して 作成した ISR を高速メモリに配置することも可能です void my_isr attribute ((section (.tightly_coupled_instruction_memory ))); スタック ( もしくは割り込み専用スタック ) を高速メモリに配置する System ライブラリの Properties で Use a separate exception stack にチェックを入れて使用するメモリを指定します ver. 1.0 2010 年 8 月 23/25 ALTIMA Corp. / ELSENA,Inc.

Interrupt Vector カスタム インストラクションを使用する 割り込み処理のディスパッチをハードウェアで実行します 5-3-3. Interrupt Vector カスタム インストラクション SOPC Builder の設定にて Interrupt Vector カスタム インストラクションがあらかじめ用意されています これを Nios II コアに追加することによって プライオリティ エンコーダ ( マルチプレクサ ) をハードウェアでインプリメントします マルチプレクサの段数は システムが持つ割り込み信号の数に比例します 使用するロジックは数 LE ですが 多くの割り込み信号が接続されていると Fmax に影響する場合があります Interrupt Vector カスタム インストラクションを使用する際には 自動でカスタム インストラクションが呼び出されるためユーザ コードを変更する必要はありません ver. 1.0 2010 年 8 月 24/25 ALTIMA Corp. / ELSENA,Inc.

免責 及び ご利用上の注意 弊社より資料を入手されましたお客様におかれましては 下記の使用上の注意を一読いただいた上でご使用ください 1. 本資料は非売品です 許可無く転売することや無断複製することを禁じます 2. 本資料は予告なく変更することがあります 3. 本資料の作成には万全を期していますが 万一ご不明な点や誤り 記載漏れなどお気づきの点がありましたら 本資料を入手されました下記代理店までご 一報いただければ幸いです 株式会社アルティマ : 222-8563 横浜市港北区新横浜 1-5-5 マクニカ第二ビル TEL: 045-476-2155 HP: http://www.altima.co.jp 技術情報サイト EDISON : https://www.altima.jp/members/index.cfm 株式会社エルセナ : 163-0928 東京都新宿区西新宿 2-3-1 新宿モノリス 28F TEL: 03-3345-6205 HP: http://www.elsena.co.jp 技術情報サイト ETS : https://www.elsena.co.jp/elspear/members/index.cfm 4. 本資料で取り扱っている回路 技術 プログラムに関して運用した結果の影響については 責任を負いかねますのであらかじめご了承ください 5. 本資料は製品を利用する際の補助的な資料です 製品をご使用になる場合は 英語版の資料もあわせてご利用ください ver. 1.0 2010 年 8 月 25/25 ALTIMA Corp. / ELSENA,Inc.