===================================================================== AT91SKYEYEターゲット依存部 Last Modified: 2015 May 27 ===================================================================== ○概要 AT91SKYEYEターゲット依存部は,オープンソースのプロセッサシミュレータで ある,Skyeye上の ARM7TDMI をベースとした AT91 システムをサポートしてい る. ○SkyEye 本カーネルを動作させるためには,TOPPERSプロジェクトから公開されている, TOPPERSカーネル向けシミュレーション環境が必要となる. http://www.toppers.jp/sim.html ○カーネルの使用リソース カーネルは以下のリソースを使用する. ・RAM コードとデータを配置する. 使用量はオブジェクト数に依存する. ・TC1 カーネル内部のティックの生成に用いる. ・USART0 コンソールの出力に使用. ○実行環境 動作確認を行った実行環境は,Widnows 7(SP1) 上の Cygwin である. ○デバッグ環境 デバッグ環境としては,skyeyeのサポートする方法を用いることができる. arm-none-eabi-gdb (バージョン7.1) によるデバッグの動作確認を行った. 「TOPPERSカーネル向けシミュレーション環境」の skyeye.exe を用いた GDBデバッグを行う場合,gdb-7.1 以前のバージョンを使用する必要がある. たとえば,GDBのソースコードを以下からダウンロードしてビルドする. http://ftp.gnu.org/gnu/gdb/ gdb-7.1a.tar.gz をダウンロードした場合の手順の概略を以下に示す. $ tar xvf gdb-7.1a.tar.gz $ cd gdb-7.1 $ mkdir build $ cd build $ ../configure --target=arm-none-eabi --prefix=/home/saito/tool/gdb-7.1 --enable-interwork --enable-multilib $ make all $ make install ○コンパイラ 動作確認した GCC は,以下のサイトからWindows版のバイナリをダウンロードして使用し た以下のバージョンである. GNU Tools for ARM Embedded Processors https://launchpad.net/gcc-arm-embedded GCC ARM Embedded 4.9-2015-q1-update 上記コンパイラをインストールする際には,空白が含まれるディレクトリにイ ンストールしないこと(インストーラが作成するインストールディレクトリ自 体に空白が含まれるため注意すること). ○カーネル終了時の処理 ext_ker が呼び出されカーネル終了時には,at91skyeye.h にある at91skyeye_exit() が実行される.既定では,特に処理は記述されていない. 独自の処理処理を追加したい場合は,at91skyeye_exit() の内容を書き換えること. ○ gcovによるカバレッジ取得(未確認) gcovによるカバレッジを取得したい場合には,Makefileで ENABLE_GCOV を以 下の値のいずれかに定義すること. full : 全体取得 part : 一部取得 only_kernel_full : 全体取得(カーネルコードのみ) only_kernel_part : 一部取得(カーネルコードのみ) full と only_kernel_full は,プログラム実行全体のカバレッジを取得する. only_kernel_full はカーネルコードのみのカバレッジを取得する.これらの カバレッジ結果は,ext_ker()を呼び出してカーネル終了することにより, *.gcda に出力される. part と only_kernel_part 指定した区間(時間)のカバレッジを取得する. only_kernel_part はカーネルコードのみのカバレッジを取得する.区間(時 間)を指定やカバレッジの出力のために以下の関数を提供する. void gcov_init(void); GCOV初期化関数.呼び出した時点以降のカバレッジを取得する. void gcov_pause(void); GCOV中断関数.カバレッジの取得を中断する. void gcov_resume(void); GCOV再開関数.カバレッジの取得を再開する. void gcov_dump(void); GCOV出力関数.カバレッジを.gcda に出力する. カーネル実行後にカーネルがあるディレクトリで以下のコマンドを実行すると, カバレッジの結果が xxx.c.gcov に出力される. $arm-none-eabi-gcov.exe *.gcda カバレッジの結果をhtml化するlcovを使うことも可能である. http://ltp.sourceforge.net/coverage/lcov.php 動作確認を行ったバージョンは 1.9 であるが,日本語を出力するためと, Windwosネイティブアプリである Sourcery G++ を Cygwin環境上で使用してい る場合には,以下のパッチが必要である. -------------------------------------------------------------------------- --- lcov-1.9_org/bin/genhtml 2010-08-06 20:05:17.000000000 +0900 +++ lcov-1.9/bin/genhtml 2010-11-24 11:29:58.075739700 +0900 @@ -4007,10 +4007,10 @@ write_html($_[0], < - + - + $_[3] @@ -4069,11 +4069,11 @@ write_html($_[0], < - + $_[3] - + @@ -5578,10 +5578,10 @@ $result = < - + - + \@pagetitle\@ diff -urN lcov-1.9_org/bin/geninfo lcov-1.9/bin/geninfo --- lcov-1.9_org/bin/geninfo 2010-08-06 20:05:17.000000000 +0900 +++ lcov-1.9/bin/geninfo 2010-11-24 11:31:26.481094900 +0900 @@ -862,7 +862,7 @@ # Execute gcov command and suppress standard output $gcov_error = system_no_output(1, $gcov_tool, $da_filename, - "-o", $object_dir, @gcov_options); + @gcov_options); if ($da_renamed) { @@ -929,7 +929,7 @@ my $num; ($source, $object) = read_gcov_header($gcov_file); - + $source =~ s/(.*)\r$/$1/; if (defined($source)) { $source = solve_relative_path($base_dir, $source); -------------------------------------------------------------------------- カバレッジの取得後,以下のコマンドを実行すると,coverage_html 以下にカ バレッジ結果のhtmlが生成される. $make lcov ○トレースログのファイル出力 トレースログをファイルへ出力するための文字出力関数を用意している. void target_fput_log_file(char c); この関数を trace_dump の引数とすることにより,トレースログは, kernel_trace.log というファイルに出力される. ○各種設定の変更 幾つかのパラメータは変更可能になっている.設定ファイル毎に設定可能項目 は次のようになっている. ●Makefile.target の設定項目 ・GCC_TARGET GCCの suffix を定義 ・INCLUDES インクルード指定 ・COPTS Cコンパイラへのオプション ・LDFLAGS リンカへのオプション ●target_config.h の設定項目 ・DEFAULT_ISTKSZ ディフォルトの非タスクコンテキスト用のスタックサイズ ・SIL_DLY_TIM1/2 微少時間待ちのための定義 ○変更履歴 2015/05/27 ・SSP-1.3.0へ対応 ・LaunchPad GCCへの対応 -----(ここから下はASP版の記録) 2013/02/05 ・1.8.0対応のため,char_t の箇所を他の型に変更. 2012/11/17 ・2012/11/09の修正に間違いがあったため修正. 2012/11/09 ・有効な割込み番号を(1〜18)に修正. 2011/11/22 ・ARMCC対応に伴う変更 ・at91skyeye.ld(変更) ・ベクターのセクション名を".vector"から"vector"に変更. ・target_asm.inc(追加) ・target_cfg1_out.h(変更) ・core_cfg1_out.hのインクルード方法を""から<>に変更して,コンパイラの 引数で指定された順でインクルードファイルをサーチするよう変更. ・target_config.h(変更) ・core_config.hのインクルード方法を""から<>に変更して,コンパイラの 引数で指定された順でインクルードファイルをサーチするよう変更. ・target_sil.h(変更) ・core_sil.hのインクルード方法を""から<>に変更して,コンパイラの 引数で指定された順でインクルードファイルをサーチするよう変更. ・target_support.S(変更) ・ARMCCとファイルを共有するため,ディレクティブをマクロに書き換え. ・CPSRの操作にcxsfを付加 ・start.S 2011/05/09 ・ASP 1.7.0 への追従. ・オフセットファイルの生成方法をコンフィギュレータを用いる方法に変更. 2011/03/10 ・ASP 1.7.0 への追従. 2011/03/04 ・トレースログをファイルに出力する機能を追加. 2011/01/31 ・SkyEyeのバージョンがサポートしているバージョンと異なった場合に, SkyEyeのバージョンと,カーネルがサポートしているバージョンを表示する ように変更. 2010/11/30 ・全ての割込みをマスクしてARM依存の終了処理を呼び出すように変更. 2010/11/28 ・software_init_hook が定義されていない場合に呼び出さないように 一旦volatile指定のあるfpに代入するように変更 2010/11/24 ・lcov 1.9 への対応. 2010/11/01 ・4種類のカバレッジ取得方法をサポート. 2010/09/10 ・GCOVを有効時にマクロ TOPPERS_ENABLE_GCOV を有効にするよう変更. ・CPU例外を未定義命令に変更. 2010/07/26 ・アセンブラファイル中の分岐命令を AAPCS推奨に変更. 2010/07/10 ・ASP 1.5.0 への追従. 2010/06/23 ・ena_int()で,割込みマスクの状態を考慮せずにハードウェアを更新してい た問題を修正. 2010/05/19 ・割込み受け付け時に,システムの割込み優先度マスクを受け付けた割込みの 割込み優先度に設定していなかった問題を修正. 2010/04/21 ・SkyEye DeviceManager Extension 2.1.0 に対応. ・起動時にSkyEyeのバージョンを確認するように変更. 2009/12/19 ・起動時に software_init_hook() を呼び出すように変更. 2009/11/30 ・リンカスクリプトを generic-hosted.ld ベースから, armulator-ram-hosted.ld ベースに変更. コード・データサイズを大きくすると,標準関数やgcovが正しく動作しない 問題を解決.同時に skyeye.conf のメモリの設定をリンカスクリプトの内 容と統一. 2009/11/13 ・スタックを kernel_cfg.c で確保するように変更. 2009/10/18 ・TLV 1.1rc対応. ・サイクルカウンタの有効化. ・TRACE_GET_TIM()を定義. 2009/08/02 ・lcovのサポート. 2009/08/01 ・newlibのサポート.サポートに伴い,SkyEyeはTOPPERSプロジェクトから公 開している SkyEye -V1.2 DeviceManager Extension 2.0.3 以降 が必要と なる. ・gcovのサポート. 2009/07/09 ・target_timer_initialize()でタイマ周期にTIMER_CLOCKの値を反映するよう に修正. 2009/05/18 ・共通部 1.4.0 追従. ・コンパイラを Sourcery G++ Lite に変更. 2009/01/29 ・サイクルカウンタのサポート ・トレースログ機能で用いる ・使用するためには,TOPPERSで拡張済みのskyeyeが必要となる 2008/11/4 ・Skyeye-1.2.6に対応 ・Skyeye-1.2.6で追加されたUART受信割り込み許可・禁止レジスタに対応