NiosIIのsopcinfoがEclipseのBSPに反映されないハマり事

# この記事の概要

Intel FPGAにてNiosIIを含んだロジックを作り、Eclipseでソフトウェア開発環境を構築しました。その後FPGA側のシステムを変更してもEclipseでのBSPに反映されずハマりましたので、その対処法を書き残します。

:::note info
使用したもの
開発環境：Windows10Professional
開発ツール：Quartus Prime 18.1 Lite Edition
ターゲットボード：DE0-Nano Development Board
参考書：小林優『改定2版 FPGAボードで学ぶ組込みシステム開発入門[Intel FPGA編]』技術評論社
:::

## 結論

* ハマった原因：Eclipseでのプロジェクト作成を「NiosII Application and BSP from Template」で行った場合、BSPプロジェクトはsopcinfoファイルを絶対パスで参照していること。
* 対処方法：プロジェクトの作成はTemplateを使用せず、「NiosII Board Support Package」および「NiosII Application」で作成する。
* ビルド時にリンカーエラーが出るときは、NiosIIプラットフォームのソフトウェア収納用メモリサイズを大きくする。

## 詳細

### ハマった原因

[NiosIIでSDRAMを追加する際の設定ポイント](https://qiita.com/GoroMichi/items/baad1be5f6e48f0b3cfe)という記事のあとがきで言及しましたが、NiosIIプラットフォームを変更したのになぜかEclipseでBSPを再Generateしても変更が反映されていない、という状況でかなりハマってしまいました。
その原因は、それまで練習用に使ってきたプロジェクト一式をコピペして別の場所へ用意しSDRAMの実装練習用に流用したことでした。練習用の使ってきたプロジェクトは、参考書に従ってEclipseのBSPとアプリケーションのプロジェクトは「NiosII Application and BSP from Template」で作成していましたが、どうやらこれがsopcinfoファイルを絶対パスで参照しているようです。

### 対処方法

プロジェクトの作成はTemplateを使用せず、「NiosII Board Support Package」および「NiosII Application」で作成すること、これに尽きます。では早速、Templateを使わずにBSPプロジェクトとアプリケーションプロジェクトをEclipseに追加する際の設定を説明してゆきます。

#### 本説明の前提

フォルダ構成は下図の通りとします。quartusフォルダ以下にNiosIIプラットフォームを含むFPGAデザイン一式があり、ソフトウェアはeclipseフォルダ以下にプロジェクトを作るという設定です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/655b5820-04ab-ff3d-b250-cbf81e6d7de8.png" width="500">

それではまず、Eclipseを起動しましょう。

#### BSPプロジェクトの作成

まずはNisoIIプラットフォームに対応したBSPプロジェクトを作成することから解説します。

- **プロジェクトを作成する。**
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/a714519f-dd6a-af7e-cef6-480fe067a604.png)
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/54dd58d4-424d-4c5d-c72c-e587d2e9ae2f.png)
この画面でのポイントについて説明します。
1\. ・・・プロジェクト名はBSPであることがわかる名前にしておきましょう。
2\. ・・・sopcinfoファイルはここで指定します。
3\. ・・・「Use default location」のチェックがデフォルトで入っていますが外して、Locationを好きな場所へ変更しましょう。
4\. ・・・ここはデフォルトでチェックが入っていますが念のため確認しておきましょう。

- **BSPの設定を変更する。**
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/9489d196-02cc-b478-2b04-5f1274f7ff3c.png)
![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/b0a2f40b-c6d2-00cb-871b-2d0ab244ee02.png)
1\. ・・・両方チェックを入れましょう。今回想定するNiosIIプラットフォームは、ソフトウェアを収納するRAMが16KByte程度なので、このチェックを入れないとビルド時にリンカーでエラーになります。
2\. ・・・onchip_memoryに該当するものへ変更しましょう。今回想定するNiosIIプラットフォームは、ソフトウェアをFPGA内蔵RAMに収納します。
![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/84d79722-363c-1276-3fe1-80022fee6c27.png)
1\. ・・・onchip_memoryに該当するものへ変更しましょう。ソフトウェアの各セクションの配置がデフォルトではSDRAM領域になってしまっています。
2\. ・・・最後にGenerateをしてからExitしましょう。

- **BSPの設定を確認する。**
![図6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/aba37338-cfd9-eef7-5dea-2d85dc81b609.png)
![図7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/9edb976a-aec0-032d-5626-5428f0cea1af.png)
前項の「BSPの設定を変更する」が正しく出来ていれば、このようになっているはずです。
1\. ・・・デバッガを使ってステップ実行等を行う場合、この設定になっていることを確認しておきましょう。
2\. ・・・両方チェックが入っていることを確認しましょう。

このようにして作成したBSPプロジェクトを、最後に「Generate BSP 」しておきます。
![図7a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/f1d5958f-3481-1bfe-2260-915607ab8eca.png)


#### アプリケーションプロジェクトの作成

次に、作成したBSPプロジェクトを利用するアプリケーションのプロジェクトの作成について解説します。

- **プロジェクトを作成する。**
![図8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/f5ee7725-10f0-19ce-7b84-068c3393dd90.png)
![図9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/9185ffd5-a99f-8dd0-8893-5767a073b265.png)
この画面でのポイントは、
1\. ・・・プロジェクト名はアプリケーションであることがわかる名前にしておきましょう。
2\. ・・・紐づけるBSPプロジェクトをここで指定します。
3\. ・・・「Use default location」のチェックがデフォルトで入っていますが外して、Locationを好きな場所へ変更しましょう。
4\. ・・・ここはデフォルトでチェックが入っていますが念のため確認しておきましょう。

- **プロジェクトの設定を確認する。**
![図10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/fb5088c4-07fc-7757-4ce0-9aca62908f02.png)
![図11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/3fbe8e19-b274-0e13-51f4-619b4ab9b4e2.png)
前項の「プロジェクトを作成する」が正しく出来ていれば、このようになっているはずです。
1\. ・・・デバッガを使ってステップ実行等を行う場合、この設定になっていることを確認しておきましょう。

このようにして作成したアプリケーションプロジェクトへソースコード等を追加して、アプリケーションの制作を行います。

#### ビルドの実行

最後にもう一つハマってしまったことがあります。
アプリケーションプロジェクトをビルドするとリンカーでエラーがでてしまい、原因がわからずハマってしまいました。
![図12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/329e217b-c124-bd1e-dec1-17f3c72f3744.png)
エラーメッセージ的には、プログラムの各セクションについて「onchip memoryの範囲に無いよ」、との主旨なのですが、BSP設定で各セクションをonchip memoryに割り当てたはずだし・・・

色々考えて気づいた（というか思いついた）のですが、確保していたonchip memoryのサイズが小さくでプログラムが入り切らないこと、ではなかろうかと。

そこでPlatform Editorを立ち上げ、onchip memoryのサイズを8KByteから16KByteへ増やしてみました。
![図13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483682/c79c27a2-40ce-b91d-931b-e7679d5b584a.png)
1\. この行をダブルクリックすると右側に新たなペインが登場します。
2\. ここを8192Byteから倍の16384Byteへ増やし、Generate HDLしました。

これで、ビルド時のエラーもなくなり、めでたくFPGAボードへソフトウェアをダウンロードしてデバッガを起動することができるようになりました。


## あとがき
以上で、NiosIIプラットフォームを含むFPGA開発プロジェクトの一式を任意のフォルダへ移動させることができるようになりました。
参考書ではテンプレートを使用したプロジェクト作成のやり方しか載っていなかったので、この試行錯誤の結果を自分のためにも残して置かなければ、と思い本記事を投稿しました。
同じようにハマっている人の助けにもなれば幸いです。