DE0-Nano-SoC用ベアメタルアプリのコンパイル

FPGA

ベアメタルアプリのコンパイル環境を構築する手順のメモです。コンパイル環境は、既存のサンプルをベースに作成しました。参考にしたサンプルはこちらのものです。
http://www.altera.com/literature/an/cv_boot_guide.zip
readmeを読むと、Altera Cyclone V SoC Development Boardをターゲットとしたサンプルのようですが、DE0-Nano-SoCでも動作しました。具体的な構築手順は次のとおりです。コンパイル環境の構築には、SoC EDSのインストールが必要です。DS-5は利用していません。

コンパイル環境の構築手順

サンプル環境の準備

まずcv_boot_guide.zipを解凍します。次に、sourceディレクトリに格納されているAltera-SoCFPGA-HardwareLib-Unhosted-CV-GNU.tar.gzを適当なディレクトリに解凍します。解凍すると、次のようなファイルが生成されます。

サンプルのディレクトリ内容

サンプルのディレクトリ内容

このサンプルは、DS-5にインポートして利用するように作成されていますが、今回はDS-5を利用していません。

Makefileの修正

Quartus II 15.0の環境でコンパイルを行うと、エラーが発生するのでMakefileを修正します。

CFLAGS  := -g -O0 -Wall -Werror -std=c99 $(MULTILIBFLAGS) -I$(HWLIBS_ROOT)/include
# 次の3行を追加
ALT_DEVICE_FAMILY = soc_cv_av
CFLAGS += -I$(HWLIBS_ROOT)/include/${ALT_DEVICE_FAMILY}
CFLAGS += -D${ALT_DEVICE_FAMILY}
# ここまで
LDFLAGS := -T$(LINKER_SCRIPT) $(MULTILIBFLAGS)

コンパイル

Embedded Command Shellを起動します。Embedded Command Shellは、Quartus II(SoC EDS)のインストールディレクトリのembeddedに格納されています。

Embedded Command Shellの起動

Embedded Command Shellの起動

Embedded Command Shell

Embedded Command Shell

ディレクトリを変更してmakeを実行します。

make実行

make実行

arm-altera-eabi-gcc -g -O0 -Wall -Werror -std=c99 -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=neon -IG:/Altera/15.0/embedded/ip/altera/hps/altera_hps/hwlib/include -IG:/Altera/15.0/embedded/ip/altera/hps/altera_hps/hwlib/include/soc_cv_av -Dsoc_cv_av -c hello.c -o hello.o
arm-altera-eabi-gcc -g -O0 -Wall -Werror -std=c99 -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=neon -IG:/Altera/15.0/embedded/ip/altera/hps/altera_hps/hwlib/include -IG:/Altera/15.0/embedded/ip/altera/hps/altera_hps/hwlib/include/soc_cv_av -Dsoc_cv_av -c io.c -o io.o
arm-altera-eabi-g++ -TcycloneV-dk-ram-modified.ld -mcpu=cortex-a9 -mfloat-abi=softfp -mfpu=neon hello.o io.o -o hello.axf
arm-altera-eabi-objcopy -O binary hello.axf hello.bin
mkimage -A arm -T standalone -C none -a 0x100040 -e 0 -n "baremetal image" -d he
llo.bin hello-mkimage.bin
Image Name:   baremetal image
Created:      Fri Jan 22 07:18:01 2016
Image Type:   ARM Linux Standalone Program (uncompressed)
Data Size:    15720 Bytes = 15.35 kB = 0.01 MB
Load Address: 00100040
Entry Point:  00000000

ソースファイルの変更

ソースファイルのmain.cを少し変更してみます。

#include <stdio.h>

int main(void)
{
  //printf("Hello World!\r\n");
    printf("Hello DE0-Nano-SoC!\r\n");
    return 0;
}

変更後、再度makeを実行して、hello-mkimage.binを更新します。

動作確認

ブート環境を構築したSDカードにhello-mkimage.binを格納します。ベアメタルアプリは、SDカードのFATパーティションに書き込みます。この例の場合は、Dドライブ直下にhello-mkimage.binを格納するだけです。

ベアメタルアプリの名前がhello-mkimage.binと異なる場合には、一致するようにhello-mkimage.binの名前を変更する必要があります。
SDカードをDE0-Nano-SoCに挿入し、電源をONにするとターミナルに実行ログが表示されます。

ターミナルのログ表示

ターミナルのログ表示

cycloneV-dk-ram-modified.ldについて

サンプルのディレクトリにはcycloneV-dk-ram-modified.ldというリンカ用のスクリプトが格納されています。このようなスクリプトは、Quartus II(SoC EDS)のembedded\host_tools\mentor\gnu\arm\baremetal\arm-altera-eabi\libに格納されています。cycloneV-dk-ram-modified.ldは、名前のとおりcycloneV-dk-ram.ldを修正したファイルのようです。修正内容はサンプルディレクトリのreadmeに記載されています。修正内容としては、SDRAMの先頭64BをブートPreloader用としてリザーブしているようです。2つのファイルのdiffをとると、次のような違いがあります。

$ diff cycloneV-dk-ram.ld  cycloneV-dk-ram-modified.ld  -h
3c3
<  * Version: Sourcery CodeBench Lite 2014.11-13
---
>  * Version: Sourcery CodeBench Lite 2013.11-67
28c28,29
<   ram (rwx) : ORIGIN = 0x100000, LENGTH = 1023M
---
>   /* Need to have 64bytes available before start of program, to store the mkimage header */
>   ram (rwx) : ORIGIN = 0x100000 + 0x40, LENGTH = 1023M - 0x40
91,94d91
<   .note.gnu.build-id : ALIGN (4)
<   {
<     KEEP (*(.note.gnu.build-id))
<   } >ram
261c258
< /* checksum: 1e31d42b79217b9ca44859 */
---
> /* checksum: 107f7843360731655cf27621 */

DS-5でのコンパイルについて

このサンプルのreadmeにはDS-5での実行方法(インポート方法)が記載されていますが、そのままではコンパイル時にエラーが発生しました。具体的には、makeの最後で実行されるmkimageコマンドでnot foundエラーが発生します。単にパスが通っていないだけのエラーなので、少し修正すればDS-5でもコンパイルできそうでした。

タイトルとURLをコピーしました