[93] | 1 |
|
---|
| 2 | TOPPERS/SSPカーネル
|
---|
| 3 | ユーザーズマニュアル
|
---|
| 4 |
|
---|
| 5 | 対応バージョン: Release 1.3.0
|
---|
| 6 | 最終更新: 2015年5月19日
|
---|
| 7 |
|
---|
| 8 | このドキュメントは,TOPPERS/SSPカーネルを使用するために必要な事項を説明
|
---|
| 9 | するものである.
|
---|
| 10 |
|
---|
| 11 | ----------------------------------------------------------------------
|
---|
| 12 | TOPPERS/SSP Kernel
|
---|
| 13 | Smallest Set Profile Kernel
|
---|
| 14 |
|
---|
| 15 | Copyright (C) 2011-2013 by Meika Sugimoto
|
---|
| 16 | Copyright (C) 2014,2015 by Naoki Saito
|
---|
| 17 | Nagoya Municipal Industrial Research Institute, JAPAN
|
---|
| 18 |
|
---|
| 19 | 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
|
---|
| 20 | ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
|
---|
| 21 | 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
|
---|
| 22 | (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
|
---|
| 23 | 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
|
---|
| 24 | スコード中に含まれていること.
|
---|
| 25 | (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
|
---|
| 26 | 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
|
---|
| 27 | 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
|
---|
| 28 | の無保証規定を掲載すること.
|
---|
| 29 | (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
|
---|
| 30 | 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
|
---|
| 31 | と.
|
---|
| 32 | (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
|
---|
| 33 | 作権表示,この利用条件および下記の無保証規定を掲載すること.
|
---|
| 34 | (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
|
---|
| 35 | 報告すること.
|
---|
| 36 | (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
|
---|
| 37 | 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
|
---|
| 38 | また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
|
---|
| 39 | 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
|
---|
| 40 | 免責すること.
|
---|
| 41 |
|
---|
| 42 | 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
|
---|
| 43 | よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
|
---|
| 44 | に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
|
---|
| 45 | アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
|
---|
| 46 | の責任を負わない.
|
---|
| 47 |
|
---|
| 48 | ----------------------------------------------------------------------
|
---|
| 49 |
|
---|
| 50 | ○目次
|
---|
| 51 |
|
---|
| 52 | 1.TOPPERS/SSPカーネルの概要
|
---|
| 53 | 1.1 TOPPERS/SSPカーネルの位置付け
|
---|
| 54 | 1.2 TOPPERS/SSPカーネルの仕様
|
---|
| 55 | 1.3 既知の問題
|
---|
| 56 | 2.ターゲット依存部
|
---|
| 57 | 2.1 ターゲット依存部の概要
|
---|
| 58 | 2.2 簡易パッケージ
|
---|
| 59 | 2.3 個別パッケージ
|
---|
| 60 | 3.クイックスタートガイド
|
---|
| 61 | 3.1 開発環境の準備
|
---|
| 62 | 3.2 コンフィギュレータの構築
|
---|
| 63 | 3.3 サンプルプログラムの構築と実行
|
---|
| 64 | 3.4 カーネルを関数単位でライブラリ化する方法
|
---|
| 65 | 3.5 アプリケーションとカーネルを別々に構築する方法
|
---|
| 66 | 4.ディレクトリ構成・ファイル構成
|
---|
| 67 | 4.1 配布パッケージのディレクトリ構成
|
---|
| 68 | 4.2 ターゲット非依存部のファイル構成
|
---|
| 69 | 5.コンフィギュレーションスクリプトの使い方
|
---|
| 70 | 6.Makefileの修正方法
|
---|
| 71 | 6.1 Makefileの変数定義
|
---|
| 72 | 6.2 コンパイルオプション
|
---|
| 73 | 7.コンフィギュレータの使い方
|
---|
| 74 | 8.システムサービス
|
---|
| 75 | 8.1 シリアルインタフェースドライバ
|
---|
| 76 | 8.1.1 シリアルインタフェースドライバのサービスコール
|
---|
| 77 | 8.1.2 シリアルインタフェースドライバのその他のサービス
|
---|
| 78 | 8.2 カーネル起動メッセージの出力
|
---|
| 79 | 9.サポートライブラリ
|
---|
| 80 | 9.1 キュー操作ライブラリ関数
|
---|
| 81 | 10.使用上の注意とヒント
|
---|
| 82 | 10.1 タイマドライバの組込み
|
---|
| 83 | 10.2 assertマクロの処理
|
---|
| 84 | 10.3 オブジェクトIDの管理
|
---|
| 85 | 10.4 カーネルの内部シンボルのリネーム
|
---|
| 86 | 10.5 システムの起動時の初期化処理
|
---|
| 87 | 11.参考情報
|
---|
| 88 | 11.1 利用条件と利用報告
|
---|
| 89 | 11.2 保証・適用性・サポート
|
---|
| 90 | 11.3 バグレポート
|
---|
| 91 | 11.4 ウェブサイト
|
---|
| 92 | 11.5 TOPPERSユーザーズメーリングリスト
|
---|
| 93 | 11.6 TOPPERSプロジェクトのメンバ向けのサービス
|
---|
| 94 | 11.7 TOPPERSプロジェクトへの参加
|
---|
| 95 | 12.
|
---|
| 96 | 12.1 サービスコール一覧
|
---|
| 97 | 12.2 静的API一覧
|
---|
| 98 | 12.3 バージョン履歴
|
---|
| 99 |
|
---|
| 100 |
|
---|
| 101 | 1.TOPPERS/SSPカーネルの概要
|
---|
| 102 |
|
---|
| 103 | 1.1. TOPPERS/SSPカーネルの位置付け
|
---|
| 104 |
|
---|
| 105 | TOPPERS/SSPカーネルは,TOPPERS/ASPカーネルの仕様に対して,
|
---|
| 106 | 小規模アプリケーション向けに仕様を絞ったものである.最小セットに
|
---|
| 107 | おける"最小"とは,カーネルが使用するROM/RAM使用量を小さくするために
|
---|
| 108 | 仕様を最適化することを意味する.
|
---|
| 109 |
|
---|
| 110 | 提供する機能はμITRON4.0仕様準拠の最低機能をベースとして,一部
|
---|
| 111 | 自動車制御用プロファイルの機能を取り込む.
|
---|
| 112 |
|
---|
| 113 | このため,SSPカーネルはASPカーネルの下位互換でも上位互換でもない.
|
---|
| 114 | ただし,制約タスク拡張パッケージを適用した場合,SSPカーネルは
|
---|
| 115 | SSPカーネルの上位互換となる.
|
---|
| 116 |
|
---|
| 117 | 1.2. TOPPERS/SSPカーネルの仕様
|
---|
| 118 |
|
---|
| 119 | SSPカーネルの仕様の概要については,「TOPPERS新世代カーネル統合仕様書」を
|
---|
| 120 | 参照のこと.
|
---|
| 121 |
|
---|
| 122 | 1.3. 既知の問題
|
---|
| 123 |
|
---|
| 124 | kernel_cfg.c(およびcfg1_out.c)は,カーネル,システムサービス,アプリ
|
---|
| 125 | ケーションのいずれのインクルードファイルもインクルードし,いずれのシン
|
---|
| 126 | ボルも参照する可能性がある.そのため,カーネル,システムサービス,アプ
|
---|
| 127 | リケーションでシンボル等が衝突している場合や,コンパイルオプションが食
|
---|
| 128 | い違っている場合に,kernel_cfg.c(およびcfg1_out.c)が正しくコンパイル
|
---|
| 129 | できなくなる場合が考えられる.カーネルのシンボルをリネームするなどの方
|
---|
| 130 | 法で軽減されてはいるが,問題がなくなっているわけではない.
|
---|
| 131 |
|
---|
| 132 | システムコンフィギュレーションファイルから,コンフィギュレータに対する
|
---|
| 133 | INCLUDEディレクティブにより他のコンフィギュレーションファイルをインクルー
|
---|
| 134 | ドしている場合に,その中に含まれるC言語プリプロセッサのインクルードディ
|
---|
| 135 | レクティブ(#include)で,コンフィギュレーションファイルの置かれている
|
---|
| 136 | ディレクトリが,ファイルを検索するパスにはいらないという問題がある.例
|
---|
| 137 | えば,syssvc/syslog.cfgに「#include "syslog.h"」と記述できないのは,こ
|
---|
| 138 | の問題があるためである.
|
---|
| 139 |
|
---|
| 140 | 現時点では,アドレスが64ビットの環境には対応していない.64ビットアドレ
|
---|
| 141 | ス環境をサポートするための最大の課題は,モトローラSレコードフォーマット
|
---|
| 142 | が64ビットアドレスに対応していないことである.
|
---|
| 143 |
|
---|
| 144 | 2.ターゲット依存部
|
---|
| 145 |
|
---|
| 146 | 2.1. ターゲット依存部の概要
|
---|
| 147 |
|
---|
| 148 | SSPカーネルのターゲット非依存部と,各種のターゲットシステムに対応するた
|
---|
| 149 | めのターゲット依存部は,別々に開発されている.そのため,SSPカーネルが対
|
---|
| 150 | 応しているすべてのターゲット依存部を,バージョンを整合させてパッケージ
|
---|
| 151 | 化することは困難である.そこで,主に初級のユーザを対象にした簡易パッケー
|
---|
| 152 | ジと,上級のユーザやカーネル開発者を対象にした個別パッケージを用意して
|
---|
| 153 | いる.
|
---|
| 154 |
|
---|
| 155 | SSPカーネルを未サポートのターゲットシステムへポーティングするために必要
|
---|
| 156 | な作業は,開発環境の構築と標準の開発環境との差異の吸収,カーネル自身の
|
---|
| 157 | ポーティング,システムサービスのポーティングなどからなる.詳しくは,
|
---|
| 158 | 「ターゲット依存部 ポーティングガイド」を参照すること.
|
---|
| 159 |
|
---|
| 160 | ※ ターゲット依存部 ポーティングガイドは現在は未完である
|
---|
| 161 |
|
---|
| 162 | 2.2. 簡易パッケージ
|
---|
| 163 |
|
---|
| 164 | 簡易パッケージは,SSPカーネルが対応しているターゲットシステム毎に用意さ
|
---|
| 165 | れ,そのターゲットシステム上でSSPカーネルを動作させるために必要なファイ
|
---|
| 166 | ル一式をパッケージ化したものである.簡易パッケージに含まれるファイルは,
|
---|
| 167 | バージョンが整合していることが確認されている.
|
---|
| 168 |
|
---|
| 169 | 簡易パッケージのバージョン番号は,パッケージ化した日付とすることを原則
|
---|
| 170 | とするが,ターゲットシステム毎の事情によりこの原則に従わない場合がある.
|
---|
| 171 |
|
---|
| 172 | 簡易パッケージは,基本的には,次に説明する個別パッケージを複数まとめた
|
---|
| 173 | ものである.そのため,対象ターゲットシステムに必要のないファイルも含ま
|
---|
| 174 | れている.また,簡易パッケージに含まれている個別パッケージのバージョン
|
---|
| 175 | は,個別パッケージのMANIFESTファイルを参照することで知ることができる.
|
---|
| 176 |
|
---|
| 177 | 2.3. 個別パッケージ
|
---|
| 178 |
|
---|
| 179 | 個別パッケージは,SSPカーネルの開発単位毎に,その開発単位で開発を担当し
|
---|
| 180 | ているファイル一式をパッケージ化したものである.SSPカーネルのターゲット
|
---|
| 181 | 非依存部も,一つの個別パッケージとして配布される.ある個別パッケージを
|
---|
| 182 | 使用するためには,一般には,他の個別パッケージが必要となる.ターゲット
|
---|
| 183 | 依存部の個別パッケージを使用するために必要となる個別パッケージとそのバー
|
---|
| 184 | ジョンについては,ターゲット依存部のユーザーズマニュアルを参照すること.
|
---|
| 185 | 使用する個別パッケージのバージョンを整合させることは,ユーザの責任であ
|
---|
| 186 | る.
|
---|
| 187 |
|
---|
| 188 | 個別パッケージのバージョン番号は,X.Y.Zの形で表現される.ターゲット非依
|
---|
| 189 | 存部のバージョン番号を,SSPカーネル全体のリリース番号とする.ターゲット
|
---|
| 190 | 依存部のバージョン番号は,XとYが,それが依存するターゲット非依存部と一
|
---|
| 191 | 致している.それに対して,Zは一致しているとは限らない.例えば,ターゲッ
|
---|
| 192 | ト非依存部のバージョン1.1.0に対応するターゲット依存部は,バージョン
|
---|
| 193 | 1.1.Zの形となる.ターゲット依存部のみがバージョンアップした場合には,Z
|
---|
| 194 | が変更される.
|
---|
| 195 |
|
---|
| 196 | 使用する個別パッケージは,次の例のように,ターゲット非依存部の個別パッ
|
---|
| 197 | ケージを展開したのと同じディレクトリで展開する.
|
---|
| 198 |
|
---|
| 199 | % tar xvfz ssp-1.3.0.tar.gz
|
---|
| 200 | % tar xvfz ssp_arch_rx_rxc-1.3.0.tar.gz
|
---|
| 201 |
|
---|
| 202 | ターゲット非依存部の個別パッケージには,以下のターゲット依存部が含まれ
|
---|
| 203 | ている.
|
---|
| 204 |
|
---|
| 205 | target/cq_frk_fm3_gcc Interface誌付属Cortex-M3基板
|
---|
| 206 | (GNU開発環境)用ターゲット依存部
|
---|
| 207 | arch/arm_m_gcc Cortex-M3(GNU開発環境)用プロセッサ依存部
|
---|
| 208 |
|
---|
| 209 |
|
---|
| 210 | 3.クイックスタートガイド
|
---|
| 211 |
|
---|
| 212 | ここでは,ターゲット依存部が用意されているターゲットシステム上で,SSPカー
|
---|
| 213 | ネル上で動作するサンプルプログラムを構築・動作させるまでの手順を示す.
|
---|
| 214 |
|
---|
| 215 | 3.1. 開発環境の準備
|
---|
| 216 |
|
---|
| 217 | SSPカーネルを用いたシステム構築には,以下のツールが必要である.
|
---|
| 218 |
|
---|
| 219 | ホストシステム用のツール
|
---|
| 220 | perl 動作確認:5.16.2
|
---|
| 221 | GNU Make 動作確認:3.81
|
---|
| 222 |
|
---|
| 223 | TOPPERS新世代カーネル用コンフィギュレータ
|
---|
| 224 | cfg 動作確認:1.8.0
|
---|
| 225 | ※ 1.6.0以前のバージョンでは動作しない.
|
---|
| 226 |
|
---|
| 227 | ターゲットシステム用のツール(クロス開発環境)
|
---|
| 228 | 標準規格に準拠したCコンパイラ
|
---|
| 229 | アセンブラ,リンカ,ライブラリアン
|
---|
| 230 | シンボルファイル出力ツール,ヘキサファイル出力ツール
|
---|
| 231 | 標準Cライブラリ(必須ではない)
|
---|
| 232 |
|
---|
| 233 | ターゲットシステム用のツールにGNU開発環境を用いる場合には,以下のツール
|
---|
| 234 | が必要である.
|
---|
| 235 |
|
---|
| 236 | ターゲットシステム用のGNU開発環境ツール
|
---|
| 237 | BINUTILS(as,ld,ar,nm,ranlib,objcopy,objdump)
|
---|
| 238 | GCCまたはGCC-CORE(gccおよびそこから呼び出されるツール)
|
---|
| 239 | NEWLIB(標準Cライブラリ,必須ではない)
|
---|
| 240 |
|
---|
| 241 | 動作確認されているターゲットシステム用のツールについては,ターゲット依
|
---|
| 242 | 存部のユーザーズマニュアルを参照すること.
|
---|
| 243 |
|
---|
| 244 | ターゲットシステム用の標準Cライブラリは,アプリケーションが標準Cライブ
|
---|
| 245 | ラリを使用しない場合には,必要ない.ただし,コンパイラが標準Cライブラリ
|
---|
| 246 | 関数(memcpy,memsetなど)を呼び出すコードを生成する場合があり,その場
|
---|
| 247 | 合には標準Cライブラリが必要である.標準Cライブラリを用意する代わりに,
|
---|
| 248 | 生成したコードが呼び出す関数のみを自分で用意してもよい.
|
---|
| 249 |
|
---|
| 250 | なお,perlスクリプトはマルチバイト文字を扱う文字コードがEUC,改行コードが
|
---|
| 251 | LFであることを仮定している.それ以外の文字コード,改行コードで動作させる
|
---|
| 252 | ためにはperlスクリプトの修正が必要となることがある.
|
---|
| 253 |
|
---|
| 254 | 以下では,これらのツールが用意できていることを前提に,UNIXマシン上での
|
---|
| 255 | 構築手順を説明する.また以下の説明では,makeコマンドがGNU Makeであるも
|
---|
| 256 | のとする(SSPカーネルのサンプルのMakefileは,GNU Makeの拡張機能を用いて
|
---|
| 257 | いる).
|
---|
| 258 |
|
---|
| 259 | 3.2. コンフィギュレータの構築
|
---|
| 260 |
|
---|
| 261 | カーネルを構築する前に,まず,TOPPERS新世代カーネル用コンフィギュレータ
|
---|
| 262 | を構築する必要がある.簡易パッケージに含まれていた場合など,コンフィギュ
|
---|
| 263 | レータを実行ファイル形式で入手した場合には,このステップは必要ない.
|
---|
| 264 |
|
---|
| 265 | コンフィギュレータの構築には,以下のツールが必要である.
|
---|
| 266 |
|
---|
| 267 | ホストシステム用のツール(セルフ開発環境)
|
---|
| 268 | C++コンパイラ,C++ライブラリ
|
---|
| 269 | 動作確認(Mac OS X環境):Apple LLVM version 5.0 (clang-500.2.79)
|
---|
| 270 | Boost 動作確認:1.55.0
|
---|
| 271 | Visual Studio (Windowsの場合)
|
---|
| 272 |
|
---|
| 273 | 最初に,パッケージにコンフィギュレータのソースファイルが含まれていない
|
---|
| 274 | 場合には,コンフィギュレータのパッケージを,SSPカーネルのソースファイル
|
---|
| 275 | を展開したディレクトリの下に展開する.
|
---|
| 276 |
|
---|
| 277 | % cd ssp
|
---|
| 278 | % tar xvfz cfg-1.8.0.tar.gz
|
---|
| 279 |
|
---|
| 280 | または,コンフィギュレータのパッケージを他のディレクトリに展開し,SSPカー
|
---|
| 281 | ネルのソースファイルを展開したディレクトリからシンボリックリンクをはっ
|
---|
| 282 | てもよい.
|
---|
| 283 |
|
---|
| 284 | ソースファイルが展開できると,cfgディレクトリに移動し,コンフィギュレー
|
---|
| 285 | ションスクリプト(configure)でMakefileの環境依存部(Makefile.config)
|
---|
| 286 | を生成した後,makeコマンドによりコンフィギュレータ(cfgプログラム)が構
|
---|
| 287 | 築できる.
|
---|
| 288 |
|
---|
| 289 | % cd cfg
|
---|
| 290 | % ./configure
|
---|
| 291 | % make
|
---|
| 292 |
|
---|
| 293 | ただし,Boostをインストールしたディレクトリおよび名称が標準で想定してい
|
---|
| 294 | るものとは違う場合には,configureの--with-headersおよび--with-libraries
|
---|
| 295 | オプションにより,ヘッダファイルおよびライブラリの置かれたディレクトリ
|
---|
| 296 | を指定する必要がある.
|
---|
| 297 |
|
---|
| 298 | また,ホストシステムによっては,最適化レベルを上げると正しくコンパイル
|
---|
| 299 | できないことが知られている.そのような場合には,最適化レベルを下げるか,
|
---|
| 300 | 最適化を抑止するように,Makefileを修正する必要がある.
|
---|
| 301 |
|
---|
| 302 | なお,コンフィギュレータの使用方法については,「7.コンフィギュレータ
|
---|
| 303 | の使い方」の章で説明する.
|
---|
| 304 |
|
---|
| 305 | 3.3. サンプルプログラムの構築と実行
|
---|
| 306 |
|
---|
| 307 | 次に,SSPカーネル上で動作するサンプルプログラムを構築する方法を説明する.
|
---|
| 308 |
|
---|
| 309 | まず,サンプルプログラムのオブジェクトファイルを置くディレクトリを作成
|
---|
| 310 | し,コンフィギュレーションスクリプトを実行する.例えば,オブジェクトファ
|
---|
| 311 | イルを置くディレクトリを,SSPカーネルのソースファイルを展開したディレ
|
---|
| 312 | クトリの下のOBJという名称のディレクトリにする場合には,次のコマンドを
|
---|
| 313 | 実行する(ディレクトリの場所と名称は任意に決めてよい).
|
---|
| 314 |
|
---|
| 315 | % cd ssp
|
---|
| 316 | % mkdir OBJ
|
---|
| 317 | % cd OBJ
|
---|
| 318 | % perl ../configure -T <ターゲット略称>
|
---|
| 319 |
|
---|
| 320 | ここで,<ターゲット略称>は,targetディレクトリの下に置かれているターゲッ
|
---|
| 321 | ト依存部ディレクトリの名称である.コンフィギュレーションスクリプトのオ
|
---|
| 322 | プションについては,「5.コンフィギュレーションスクリプトの使い方」の
|
---|
| 323 | 章で説明する.
|
---|
| 324 |
|
---|
| 325 | コンフィギュレーションスクリプトの実行により,カレントディレクトリには,
|
---|
| 326 | サンプルプログラムを構築するためのMakefile,サンプルプログラム用のコン
|
---|
| 327 | フィギュレーションファイル(sample1.cfg),サンプルプログラム本体
|
---|
| 328 | (sample1.hおよびsample1.c)が生成される.
|
---|
| 329 |
|
---|
| 330 | コンフィギュレーションスクリプトの実行後,必要であればMakefileを修正す
|
---|
| 331 | る.Makefileの修正方法については,「6.Makefileの修正方法」の章で説明
|
---|
| 332 | する.
|
---|
| 333 |
|
---|
| 334 | その後,make dependで依存関係ファイル(Makefile.depend)を生成した後,
|
---|
| 335 | makeコマンドによりサンプルプログラムのロードモジュール(SSPまたは
|
---|
| 336 | SSP.exe)が生成できる.依存関係ファイルの生成には若干時間がかかる.
|
---|
| 337 |
|
---|
| 338 | % make depend
|
---|
| 339 | % make
|
---|
| 340 |
|
---|
| 341 | ここで構築したサンプルプログラム(sample1.h,sample1.c,sample1.cfg)
|
---|
| 342 | は,SSPカーネルの基本的な動作を確認するためのものである.このプログラ
|
---|
| 343 | ムの概要説明は,sample1.cの先頭のコメントにある.
|
---|
| 344 |
|
---|
| 345 | 3.4. カーネルを関数単位でライブラリ化する方法
|
---|
| 346 |
|
---|
| 347 | 前節の手順では,カーネルをファイル単位でコンパイルし,ライブラリ化して
|
---|
| 348 | いたが,カーネルのコードサイズを縮小するためには,使用しないサービスコー
|
---|
| 349 | ルはリンクしない方が望ましい.そこでSSPカーネルでは,カーネルを関数単位
|
---|
| 350 | でコンパイルし,ライブラリ化する方法を用意している.
|
---|
| 351 |
|
---|
| 352 | この方法でサンプルプログラムを構築するには,コンフィギュレーションスク
|
---|
| 353 | リプトに,それを指示するオプション(-f)を付加するだけでよい.
|
---|
| 354 |
|
---|
| 355 | % mkdir OBJ_LIB
|
---|
| 356 | % cd OBJ_LIB
|
---|
| 357 | % perl ../configure -T <ターゲット略称> -f
|
---|
| 358 |
|
---|
| 359 | ここで,OBJ_LIBというディレクトリの場所と名称は,任意に決めてよい.これ
|
---|
| 360 | 以降の手順は,前節と同じである.
|
---|
| 361 |
|
---|
| 362 | 3.5. アプリケーションとカーネルを別々に構築する方法
|
---|
| 363 |
|
---|
| 364 | 前節で説明した方法では,アプリケーションとカーネルを同時に生成するため,
|
---|
| 365 | オブジェクトファイルを置くディレクトリに非常に多くのファイルが作成され
|
---|
| 366 | て,扱いにくくなる.そこで,カーネルを修正する頻度が低い場合には,カー
|
---|
| 367 | ネルは事前に構築しておき,後でアプリケーションだけを構築する方法を用意
|
---|
| 368 | している.以下では,サンプルプログラムを構築を例に,その手順について説
|
---|
| 369 | 明する.
|
---|
| 370 |
|
---|
| 371 | まず,カーネルを構築するディレクトリを作成し,コンフィギュレーションス
|
---|
| 372 | クリプトを実行する.例えば,カーネルを構築するディレクトリを,SSPカー
|
---|
| 373 | ネルのソースファイルを展開したディレクトリの下のKERNEL_LIBという名称の
|
---|
| 374 | ディレクトリにする場合には,次のコマンドを実行する(ディレクトリの場所
|
---|
| 375 | と名称は任意に決めてよい).
|
---|
| 376 |
|
---|
| 377 | % mkdir KERNEL_LIB
|
---|
| 378 | % cd KERNEL_LIB
|
---|
| 379 | % perl ../configure -T <ターゲット略称> -f
|
---|
| 380 |
|
---|
| 381 | これにより,カーネルを構築するディレクトリに,Makefile,sample1.cfg,
|
---|
| 382 | sample1.h,sample1.cが生成されるが,Makefile以外は実質的には使用しない.
|
---|
| 383 |
|
---|
| 384 | make dependで依存関係ファイル(Makefile.depend)を生成した後,make
|
---|
| 385 | libkernel.aによりカーネルライブラリ(libkernel.a)が生成できる.
|
---|
| 386 |
|
---|
| 387 | % make depend
|
---|
| 388 | % make libkernel.a
|
---|
| 389 |
|
---|
| 390 | 次に,アプリケーションを構築するディレクトリを作成し,コンフィギュレー
|
---|
| 391 | ションスクリプトを実行する.例えば,アプリケーションを構築するディレク
|
---|
| 392 | トリを,SSPカーネルのソースファイルを展開したディレクトリの下のAPLとい
|
---|
| 393 | う名称のディレクトリにする場合には,次のコマンドを実行する(ディレクト
|
---|
| 394 | リの場所と名称は任意に決めてよい).
|
---|
| 395 |
|
---|
| 396 | % cd ..
|
---|
| 397 | % mkdir APL
|
---|
| 398 | % cd APL
|
---|
| 399 | % perl ../configure -T <ターゲット略称> -L ../KERNEL_LIB
|
---|
| 400 |
|
---|
| 401 | ここで-Lオプションには,カーネルを構築したディレクトリのパスを指定する.
|
---|
| 402 |
|
---|
| 403 | 最後に,make dependで依存関係ファイル(Makefile.depend)を生成した後,
|
---|
| 404 | makeコマンドによりサンプルプログラムのロードモジュール(SSPまたは
|
---|
| 405 | SSP.exe)が生成できる.
|
---|
| 406 |
|
---|
| 407 | % make depend
|
---|
| 408 | % make
|
---|
| 409 |
|
---|
| 410 | この手順では,アプリケーション構築時にはカーネルの再構築が必要かチェッ
|
---|
| 411 | クしないため,カーネルのソースコードを修正した場合には,カーネルを構築
|
---|
| 412 | したディレクトリでmake libkernel.aを再実行する必要がある.
|
---|
| 413 |
|
---|
| 414 | 以上では,カーネルとアプリケーションを別々のディレクトリで構築したが,
|
---|
| 415 | -Lオプションにカレントディレクトリ(ただし,"."という記述では不可)を指
|
---|
| 416 | 定することで,カーネルとアプリケーションを同じディレクトリで別々に構築
|
---|
| 417 | することもできる.具体的には,次の手順となる.
|
---|
| 418 |
|
---|
| 419 | % mkdir OBJ
|
---|
| 420 | % cd OBJ
|
---|
| 421 | % perl ../configure -T <ターゲット略称> -L ../OBJ
|
---|
| 422 | % make depend
|
---|
| 423 | % make libkernel.a
|
---|
| 424 | % make cleankernel
|
---|
| 425 | % make
|
---|
| 426 |
|
---|
| 427 | ここで,make cleankernelは,カーネルライブラリを生成するための中間ファ
|
---|
| 428 | イルを削除するものである.この手順では,make dependによりカーネルライ
|
---|
| 429 | ブラリに関する依存関係を生成しないため,カーネルのソースコードを修正し
|
---|
| 430 | た場合には,必ずmake cleankernel(または,make clean)してから,make
|
---|
| 431 | libkernel.aする必要があるので注意すること.
|
---|
| 432 |
|
---|
| 433 | なお,make realcleanすると,make dependとmakeにより生成したファイルをす
|
---|
| 434 | べて削除する.それに対して,make cleanでは,make dependにより生成した依
|
---|
| 435 | 存関係ファイルは削除しない.
|
---|
| 436 |
|
---|
| 437 |
|
---|
| 438 | 4.ディレクトリ構成・ファイル構成
|
---|
| 439 |
|
---|
| 440 | 4.1. 配布パッケージのディレクトリ構成
|
---|
| 441 |
|
---|
| 442 | include/ アプリケーション向けヘッダファイル
|
---|
| 443 | kernel/ カーネルソースファイル
|
---|
| 444 | syssvc/ システムサービスヘッダファイル,ソースファイル
|
---|
| 445 | target/ ターゲット依存部
|
---|
| 446 | arch/ ターゲット依存部の共通部分
|
---|
| 447 | gcc/ GCC開発環境依存部
|
---|
| 448 | pdic/ PDIC(デバイスドライバのOS非依存部分)
|
---|
| 449 | utils/ ユーティリティプログラム
|
---|
| 450 | sample/ サンプルプログラムとMakefile
|
---|
| 451 | doc/ ドキュメント
|
---|
| 452 | extension/ 拡張パッケージ
|
---|
| 453 |
|
---|
| 454 | 4.2. ターゲット非依存部のファイル構成
|
---|
| 455 |
|
---|
| 456 | ターゲット非依存部(テストプログラムと拡張パッケージは除く)の各ファイ
|
---|
| 457 | ルの概要は次の通り.
|
---|
| 458 |
|
---|
| 459 | README.txt TOPPERS/SSPカーネルの簡単な紹介
|
---|
| 460 | configure コンフィギュレーションスクリプト(GNU開発環境用)
|
---|
| 461 | MANIFEST 個別パッケージのファイルリスト
|
---|
| 462 |
|
---|
| 463 | include/
|
---|
| 464 | kernel.h SSPカーネルを使用するための定義
|
---|
| 465 | sil.h システムインタフェースレイヤを使用するための定義
|
---|
| 466 | t_stddef.h TOPPERS共通ヘッダファイル
|
---|
| 467 | itron.h ITRON仕様共通規定のデータ型・定数・マクロ
|
---|
| 468 |
|
---|
| 469 | kernel/
|
---|
| 470 | Makefile.kernel カーネルのファイル構成の定義
|
---|
| 471 | kernel_impl.h カーネル実装用標準ヘッダファイル
|
---|
| 472 | kernel_int.h kernel_cfg.c用のヘッダファイル
|
---|
| 473 | kernel_rename.def カーネルの内部識別名のリネーム定義
|
---|
| 474 | kernel_rename.h カーネルの内部識別名のリネーム
|
---|
| 475 | kernel_unrename.h カーネルの内部識別名のリネーム解除
|
---|
| 476 | kernel_api.csv コンフィギュレータの静的APIテーブル
|
---|
| 477 | kernel_def.csv コンフィギュレータの値取得シンボルテーブル
|
---|
| 478 | kernel.tf コンフィギュレータのパス2のテンプレートファイル
|
---|
| 479 | kernel_check.tf コンフィギュレータのパス3のテンプレートファイル
|
---|
| 480 | allfunc.h すべての関数をコンパイルするための定義
|
---|
| 481 | check.h エラーチェック用マクロ
|
---|
| 482 | startup.c カーネルの初期化と終了処理
|
---|
| 483 | task.h タスク操作ルーチン関連の定義
|
---|
| 484 | task.c タスク操作ルーチン
|
---|
| 485 | task_manage.c タスク管理機能
|
---|
| 486 | sys_manage.c システム状態管理機能
|
---|
| 487 | interrupt.h 割込み管理機能関連の定義
|
---|
| 488 | interrupt.c 割込み管理機能
|
---|
| 489 | exception.h CPU例外管理機能関連の定義
|
---|
| 490 | exception.c CPU例外管理機能
|
---|
| 491 | queue.h キュー操作ライブラリを使用するための定義
|
---|
| 492 |
|
---|
| 493 | syssvc/
|
---|
| 494 | banner.h カーネル起動メッセージの出力のための定義
|
---|
| 495 | banner.c カーネル起動メッセージの出力
|
---|
| 496 | banner.cfg カーネル起動メッセージの出力のコンフィギュレー
|
---|
| 497 | ションファイル
|
---|
| 498 | serial.h シリアルインタフェースドライバを使用するための定義
|
---|
| 499 | serial.c シリアルインタフェースドライバ
|
---|
| 500 | serial.cfg シリアルドライバのコンフィギュレーションファイル
|
---|
| 501 | syssvc_def.csv システムサービスのコンフィギュレーションの際に必要な
|
---|
| 502 | コンフィギュレータの値取得シンボルテーブル
|
---|
| 503 |
|
---|
| 504 | arch/gcc/
|
---|
| 505 | MANIFEST 個別パッケージのファイルリスト
|
---|
| 506 | tool_stddef.h t_stddef.hの開発環境依存部(GCC用)
|
---|
| 507 |
|
---|
| 508 | utils/
|
---|
| 509 | applyrename ファイルにリネームを適用
|
---|
| 510 | genrename リネームヘッダファイルの生成
|
---|
| 511 | makedep 依存関係リストの生成(GNU開発環境用)
|
---|
| 512 | makerelease リリースパッケージの生成
|
---|
| 513 |
|
---|
| 514 | sample/
|
---|
| 515 | Makefile サンプルのMakefile(GNU開発環境用)
|
---|
| 516 | sample1.h サンプルプログラム(1)に関する定義
|
---|
| 517 | sample1.c サンプルプログラム(1)
|
---|
| 518 | sample1.cfg サンプルプログラム(1)のコンフィギュレーションファイル
|
---|
| 519 |
|
---|
| 520 | extension/
|
---|
| 521 | alarm.h アラームハンドラ機能関連の定義
|
---|
| 522 | alarm.c アラームハンドラ機能
|
---|
| 523 | cyclic.h 周期ハンドラ機能関連の定義
|
---|
| 524 | cyclic.c 周期ハンドラ機能
|
---|
| 525 | dataqueue.h データキュー機能関連の定義
|
---|
| 526 | dataqueue.c データキュー機能
|
---|
| 527 | time_event.h タイムイベント管理関連の定義
|
---|
| 528 | eventflag.h イベントフラグ関連の定義
|
---|
| 529 | eventflag.c イベントフラグ機能
|
---|
| 530 | time_event.c タイムイベント管理
|
---|
| 531 | time_manage.c システム時刻管理機能
|
---|
| 532 | MANIFEST 拡張パッケージのファイルリスト
|
---|
| 533 |
|
---|
| 534 | doc/
|
---|
| 535 | user.txt ユーザーズマニュアル
|
---|
| 536 | ssp_spec.txt TOPPERS/SSPカーネルの仕様概要
|
---|
| 537 | extension.txt 機能拡張・チューニングガイド
|
---|
| 538 | porting.txt ターゲット依存部 ポーティングガイド
|
---|
| 539 | configurator.txt コンフィギュレータ仕様
|
---|
| 540 | version.txt 変更履歴
|
---|
| 541 |
|
---|
| 542 |
|
---|
| 543 | 5.コンフィギュレーションスクリプトの使い方
|
---|
| 544 |
|
---|
| 545 | コンフィギュレーションスクリプト(configure)は,SSPカーネルおよびアプ
|
---|
| 546 | リケーションプログラムを構築するために必要な基本的なコンフィギュレーショ
|
---|
| 547 | ンを行うためのプログラムである.
|
---|
| 548 |
|
---|
| 549 | SSPカーネルを用いてアプリケーションを作成する場合には,まずオブジェクト
|
---|
| 550 | ファイルを置くディレクトリを作成し,そのディレクトリでコンフィギュレー
|
---|
| 551 | ションスクリプトを実行する.オブジェクトファイルを置くディレクトリの場
|
---|
| 552 | 所と名称は,任意に決めてよい.
|
---|
| 553 |
|
---|
| 554 | コンフィギュレーションスクリプトに対するオプションは次の通り.
|
---|
| 555 |
|
---|
| 556 | -T <ターゲット略称>
|
---|
| 557 | ターゲットシステムの名称を,targetディレクトリの下に置かれてい
|
---|
| 558 | るターゲット依存部ディレクトリの名称で指定する(必須).
|
---|
| 559 |
|
---|
| 560 | -A <アプリケーションプログラム名>
|
---|
| 561 | アプリケーションプログラムの名称を指定する.省略した場合には,
|
---|
| 562 | サンプルプログラム(sample1)となる.
|
---|
| 563 |
|
---|
| 564 | -a <アプリケーションのディレクトリ名>
|
---|
| 565 | アプリケーションプログラムのソースファイル(システムコンフィギュ
|
---|
| 566 | レーションファイルを除く)を置いたディレクトリ名を指定する.省
|
---|
| 567 | 略した場合には,オブジェクトファイルを置くディレクトリに置かれ
|
---|
| 568 | ていることを仮定する.システムコンフィギュレーションファイルは,
|
---|
| 569 | オブジェクトファイルを置くディレクトリに置くこと.
|
---|
| 570 |
|
---|
| 571 | -U <オブジェクトファイル名>
|
---|
| 572 | アプリケーションプログラムのメインのオブジェクトファイル(-A
|
---|
| 573 | で指定したアプリケーションプログラム名に".o"を付加したもの)以
|
---|
| 574 | 外に,リンクすべきオブジェクトファイルの名称を,".o"を付加した
|
---|
| 575 | 形で指定する.""で囲むことによって,複数のファイルを指定するこ
|
---|
| 576 | とも可能である(-Uオプションを複数使ってはならない).
|
---|
| 577 |
|
---|
| 578 | -L <カーネルライブラリのディレクトリ名>
|
---|
| 579 | 事前に構築したカーネルライブラリ(libkernel.a)を用いて,アプリ
|
---|
| 580 | ケーションのみを構築する場合には,このオプションにカーネルライ
|
---|
| 581 | ブラリの置かれたディレクトリ名を指定する.このオプションの使用
|
---|
| 582 | 例については,「3.5 アプリケーションとカーネルを別々に構築する
|
---|
| 583 | 方法」の節を参照すること.
|
---|
| 584 |
|
---|
| 585 | -f
|
---|
| 586 | カーネルを関数単位でコンパイルしライブラリ化する場合に,このオ
|
---|
| 587 | プションを指定する.このオプションの使用例については,「3.4 カー
|
---|
| 588 | ネルを関数単位でライブラリ化する方法」の節を参照すること.
|
---|
| 589 |
|
---|
| 590 | -D <SSPカーネルのソースディレクトリ名>
|
---|
| 591 | SSPカーネルのソースファイルを置いたディレクトリ名を指定する.省
|
---|
| 592 | 略した場合には,configureの置かれているディレクトリとなる.
|
---|
| 593 |
|
---|
| 594 | -l <プログラミング言語>
|
---|
| 595 | アプリケーションプログラムのプログラミング言語を指定する.現時
|
---|
| 596 | 点では,cとc++のみをサポートしている.
|
---|
| 597 |
|
---|
| 598 | -t <テンプレートディレクトリ名>
|
---|
| 599 | Makefileやサンプルプログラムのテンプレートの置かれたディレクト
|
---|
| 600 | リ名を指定する.省略した場合には,SSPカーネルのソースファイルを
|
---|
| 601 | 置いたディレクトリの下のsampleディレクトリとなる.
|
---|
| 602 |
|
---|
| 603 | -m <テンプレートMakefile名>
|
---|
| 604 | Makefileのテンプレートとするファイル名を指定する.省略した場合
|
---|
| 605 | には,Makefileとなる.
|
---|
| 606 |
|
---|
| 607 | -d <実行環境名>
|
---|
| 608 | ターゲットシステム上でのプログラムの実行環境(ないしは,デバッ
|
---|
| 609 | グ環境)の名称を指定する.このオプションを指定すると,実行環境
|
---|
| 610 | を指定するシンボル(TOPPERS_<デバッグ環境名>)がマクロ定義され
|
---|
| 611 | る.省略した場合には,実行環境を指定するシンボルはマクロ定義さ
|
---|
| 612 | れない.
|
---|
| 613 |
|
---|
| 614 | -r
|
---|
| 615 | トレースログ記録のサンプルコードを有効にする場合に,このオプショ
|
---|
| 616 | ンを指定する.このオプションの使用例については,「11.5 トレース
|
---|
| 617 | ログ記録のサンプルコードの使用方法」の節を参照すること.
|
---|
| 618 |
|
---|
| 619 | -p <perlのパス名>
|
---|
| 620 | perlのパス名を指定する.省略した場合には,/usr/local/binと
|
---|
| 621 | /usr/binを探索し,perlのパス名を決定する.
|
---|
| 622 |
|
---|
| 623 | -g <コンフィギュレータのパス名>
|
---|
| 624 | コンフィギュレータ(cfg)のパス名を指定する.省略した場合には,
|
---|
| 625 | デフォルトのパス名(SSPカーネルのソースディレクトリの下の
|
---|
| 626 | cfg/cfg/cfg)となる.
|
---|
| 627 |
|
---|
| 628 | コンフィギュレーションスクリプトが行う処理は次の通りである.
|
---|
| 629 |
|
---|
| 630 | (1) Makefileの生成
|
---|
| 631 |
|
---|
| 632 | テンプレートディレクトリ(デフォルトでは,sample)から適切なMakefileを
|
---|
| 633 | 選択し,必要な箇所を書き換えて,Makefileを生成する.
|
---|
| 634 |
|
---|
| 635 | (2) サンプルプログラムの生成
|
---|
| 636 |
|
---|
| 637 | 指定したアプリケーションプログラムがテンプレートディレクトリにある場合,
|
---|
| 638 | 適切なアプリケーションプログラムのソースファイルを選択し,必要な箇所を
|
---|
| 639 | 書き換えて,アプリケーションプログラムのソースファイル(例えば,
|
---|
| 640 | sample1.h,sample1.c,sample1.cfg)を生成する.
|
---|
| 641 |
|
---|
| 642 | (3) コンフィギュレータが用意できているかのチェック
|
---|
| 643 |
|
---|
| 644 | コンフィギュレータ(cfg)の実行ファイルがあるかチェックし,ファイルがな
|
---|
| 645 | い場合には,その旨を出力する.
|
---|
| 646 |
|
---|
| 647 |
|
---|
| 648 | 6.Makefileの修正方法
|
---|
| 649 |
|
---|
| 650 | 前の章で説明したように,コンフィギュレーションスクリプトに与えるオプショ
|
---|
| 651 | ン等からMakefileが生成されるが,コンフィギュレーションスクリプトで対応
|
---|
| 652 | できない場合には,Makefileを直接修正する必要がある.ここでは,Makefile
|
---|
| 653 | の中で,修正が必要となる可能性の高い箇所について説明する.
|
---|
| 654 |
|
---|
| 655 | なお,Makefileを修正した後にコンフィギュレーションスクリプトを再実行す
|
---|
| 656 | ると,修正したMakefileが上書きされてしまうので注意すること(古いものが
|
---|
| 657 | Makefile.bakに保存される).
|
---|
| 658 |
|
---|
| 659 | 6.1. Makefileの変数定義
|
---|
| 660 |
|
---|
| 661 | (A) ターゲット略称
|
---|
| 662 |
|
---|
| 663 | TARGETには,ターゲットシステムの名称を,targetディレクトリの下に置かれ
|
---|
| 664 | ているターゲット依存部ディレクトリの名称で指定する.この定義は,通常は,
|
---|
| 665 | コンフィギュレーションスクリプトに対する-Tオプションにより行う.
|
---|
| 666 |
|
---|
| 667 | (B) オブジェクトファイルの拡張子
|
---|
| 668 |
|
---|
| 669 | Cygwin環境でコンパイルする時には,OBJEXTを"exe"に定義する必要がある.こ
|
---|
| 670 | れは,Cygwin環境では,ロードモジュールのファイル名に拡張子".exe"が付加
|
---|
| 671 | されるのに対応するためのものである.Cygwin環境であることを判定できれば,
|
---|
| 672 | コンフィギュレーションスクリプトがこの定義を行う.
|
---|
| 673 |
|
---|
| 674 | (C) 実行環境(ターゲット依存)
|
---|
| 675 |
|
---|
| 676 | ターゲットによっては,実行環境に対応してターゲット依存部のコードを差し
|
---|
| 677 | 換える場合がある.これを可能にするために,実行環境の名称をDBGENVに定義
|
---|
| 678 | している.この定義は,通常は,コンフィギュレーションスクリプトに対す
|
---|
| 679 | る-Dオプションにより行う.どのターゲットがどの実行環境に対応しているか
|
---|
| 680 | は,ターゲット依存部のユーザーズマニュアルを参照すること.
|
---|
| 681 |
|
---|
| 682 | (D) カーネルライブラリのディレクトリ名
|
---|
| 683 |
|
---|
| 684 | KERNEL_LIBには,カーネルライブラリの置かれたディレクトリ名を定義する.
|
---|
| 685 | この定義は,通常は,コンフィギュレーションスクリプトに対する-Lオプショ
|
---|
| 686 | ンにより行う.
|
---|
| 687 |
|
---|
| 688 | (E) カーネルを関数単位でコンパイルするかどうか
|
---|
| 689 |
|
---|
| 690 | KERNEL_FUNCOBJSは,カーネルを関数単位でコンパイルする場合にはtrueに定義
|
---|
| 691 | し,ファイル単位でコンパイルする場合には未定義とする.この定義は,通常
|
---|
| 692 | は,コンフィギュレーションスクリプトに対する-fオプションにより行う.
|
---|
| 693 |
|
---|
| 694 | (F) 共通コンパイルオプション
|
---|
| 695 |
|
---|
| 696 | すべてのプログラムに共通するコンパイルオプションの追加が必要な場合には,
|
---|
| 697 | 下の変数の定義を変更する.そのコンパイルオプションが,特定のターゲット
|
---|
| 698 | で常に必要な場合には,ターゲット依存の定義を入れたMakefile.target等を修
|
---|
| 699 | 正すべきである.
|
---|
| 700 |
|
---|
| 701 | CDEFS コンパイラに対する-Dオプションを記述する.
|
---|
| 702 | INCLUDES コンパイラに対する-Iオプションを記述する.
|
---|
| 703 | COPTS コンパイラに対するその他のオプションを記述する.
|
---|
| 704 | LDFLAGS リンカに対するオプションを記述する.
|
---|
| 705 | LIBS ライブラリリンクのためのオプションを記述する.
|
---|
| 706 |
|
---|
| 707 | 追加の可能性のあるコンパイルオプションについては,「6.2 コンパイルオプ
|
---|
| 708 | ション」の節を参照のこと.
|
---|
| 709 |
|
---|
| 710 | (G) アプリケーションプログラム名
|
---|
| 711 |
|
---|
| 712 | APPLNAMEには,アプリケーションプログラム名を定義する.システムコンフィ
|
---|
| 713 | ギュレーションファイル名は,APPLNAMEに定義した名前に拡張子".cfg"を付加
|
---|
| 714 | した名前とする.また,アプリケーションのメインファイルは,APPLNAMEに定
|
---|
| 715 | 義した名前に拡張子".c"を付加した名前とする.この定義は,通常は,コンフィ
|
---|
| 716 | ギュレーションスクリプトに対する-Aオプションにより行う.
|
---|
| 717 |
|
---|
| 718 | (H) アプリケーションのディレクトリ名
|
---|
| 719 |
|
---|
| 720 | アプリケーションのソースファイルを,オブジェクトファイルを置くのとは別
|
---|
| 721 | のディレクトリに置く場合には,APPLDIRにそのディレクトリ名を定義する.こ
|
---|
| 722 | の定義は,通常は,コンフィギュレーションスクリプトに対する-aオプション
|
---|
| 723 | により行う.アプリケーションのソースファイルを置くディレクトリが複数あ
|
---|
| 724 | る場合には,APPL_DIRの定義を変更することで対応する.
|
---|
| 725 |
|
---|
| 726 | (I) アプリケーションのプログラムファイル名
|
---|
| 727 |
|
---|
| 728 | アプリケーションが複数のソースファイルで構成される場合には,そのオブジェ
|
---|
| 729 | クトファイル名を,APPL_ASMOBJS,APPL_COBJS,APPL_CXXOBJSに列挙する.
|
---|
| 730 |
|
---|
| 731 | (J) アプリケーションのコンパイルオプション
|
---|
| 732 |
|
---|
| 733 | アプリケーションのコンパイルに必要なコンパイルオプションや,アプリケー
|
---|
| 734 | ションがライブラリを必要とする場合には,APPL_CFLAGSおよびAPPL_LIBSに定
|
---|
| 735 | 義する.
|
---|
| 736 |
|
---|
| 737 | (K) ロードモジュールのファイル名
|
---|
| 738 |
|
---|
| 739 | 標準のロードモジュールのファイル名をOBJNAMEに定義する.デフォルトはSSP
|
---|
| 740 | である.
|
---|
| 741 |
|
---|
| 742 | (L) ターゲットファイルの定義
|
---|
| 743 |
|
---|
| 744 | ターゲット"all"の依存ファイルとして,ロードモジュールの形式を指定する.
|
---|
| 745 | 具体的には,ELF形式の時は$(OBJFILE),バイナリ形式の時は$(OBJNAME).bin,
|
---|
| 746 | モトローラ S形式の時は$(OBJNAME).srecを指定する.$(OBJFILE)は,Cygwin
|
---|
| 747 | 環境でOBJEXTを"exe"に定義した時には$(OBJNAME).exe,そうでない場合には
|
---|
| 748 | $(OBJNAME)となる.
|
---|
| 749 |
|
---|
| 750 | (M) makedepのオプションの定義
|
---|
| 751 |
|
---|
| 752 | Cygwin環境でルートディレクトリが"cygdrive"でない場合には,makedepの-Rオ
|
---|
| 753 | プションでルートディレクトリ名を与える必要がある.makedepのオプションは,
|
---|
| 754 | 次の例のように,MAKEDEP_OPTSに定義する.
|
---|
| 755 |
|
---|
| 756 | MAKEDEP_OPTS = -R cygdrive
|
---|
| 757 |
|
---|
| 758 | 6.2. コンパイルオプション
|
---|
| 759 |
|
---|
| 760 | SSPカーネルのコード中には,assertマクロが使われている.assertマクロは,
|
---|
| 761 | NDEBUGを定義することで,オブジェクトコード中から消すことができる.カー
|
---|
| 762 | ネルのデバッグが終了すれば,-DNDEBUGを指定してコンパイルした方が効率が
|
---|
| 763 | よくなる.
|
---|
| 764 |
|
---|
| 765 | ターゲット依存部において,コンパイルオプションに-Werror(警告をエラー扱
|
---|
| 766 | いする)を指定している場合がある.そのようなターゲットにおいて,アプリ
|
---|
| 767 | ケーションで警告が避けられない場合には,ターゲット依存部を修正してコン
|
---|
| 768 | パイルオプションを削除する必要がある.
|
---|
| 769 |
|
---|
| 770 |
|
---|
| 771 | 7.コンフィギュレータの使い方
|
---|
| 772 |
|
---|
| 773 | コンフィギュレータ(cfg)は,TOPPERS新世代カーネル統合仕様書の2.12.5節
|
---|
| 774 | の記述の通り,3つのパスで構成される.
|
---|
| 775 |
|
---|
| 776 | コンフィギュレータは,システムコンフィギュレーションファイル名をパラメー
|
---|
| 777 | タに取り,以下のオプションを持つ(重要なもののみ).
|
---|
| 778 |
|
---|
| 779 | --help
|
---|
| 780 | オプションのリストと説明を表示する.
|
---|
| 781 |
|
---|
| 782 | -v[--version]
|
---|
| 783 | コンフィギュレータのバージョンを表示する.
|
---|
| 784 |
|
---|
| 785 | -k[--kernel]<カーネル名>
|
---|
| 786 | カーネルの名称を指定する.デフォルトはSSP.
|
---|
| 787 |
|
---|
| 788 | -p[--pass]<パス番号>
|
---|
| 789 | パス番号を指定する.1〜3のいずれか.
|
---|
| 790 |
|
---|
| 791 | -I[--include-path]<インクルードパス名>
|
---|
| 792 | INCLUDEディレクティブにおいて,インクルードするコンフィギュレー
|
---|
| 793 | ションファイルを探すパス名を指定する.
|
---|
| 794 |
|
---|
| 795 | -T[--template-file]<テンプレートファイル名>
|
---|
| 796 | テンプレートファイルの名称を指定する.パス2とパス3で有効.
|
---|
| 797 |
|
---|
| 798 | --api-table <静的APIテーブルファイル名>
|
---|
| 799 | 静的APIテーブルのファイル名を指定する.
|
---|
| 800 |
|
---|
| 801 | --cfg1-def-table <値取得シンボルテーブルファイル名>
|
---|
| 802 | 値取得シンボルテーブルのファイル名を指定する.
|
---|
| 803 |
|
---|
| 804 | -r[--rom-image]<ロードモジュール名>
|
---|
| 805 | ロードモジュールをSレコードフォーマットの形に変換したファイルの
|
---|
| 806 | 名称を指定する.パス3でのみ有効.
|
---|
| 807 |
|
---|
| 808 | -s [--symbol-table] <シンボルファイル名>
|
---|
| 809 | ロードモジュール中の各シンボルとアドレスの対応表を含むシンボル
|
---|
| 810 | ファイルの名称を指定する.パス3でのみ有効.
|
---|
| 811 |
|
---|
| 812 | --id-output-file <ID番号出力ファイル名>
|
---|
| 813 | SSPカーネルでは使用してはならない。詳細はconfigurator.txtの
|
---|
| 814 | 「○カーネル構成・初期化ファイル(kernel_cfg.c)」の(5)を参照のこと。
|
---|
| 815 |
|
---|
| 816 | --id-input-file <ID番号入力ファイル名>
|
---|
| 817 | SSPカーネルでは使用してはならない。詳細はconfigurator.txtの
|
---|
| 818 | 「○カーネル構成・初期化ファイル(kernel_cfg.c)」の(5)を参照のこと。
|
---|
| 819 |
|
---|
| 820 | --external-id
|
---|
| 821 | オブジェクトのID番号を保持する変数の定義を生成する.パス2でのみ
|
---|
| 822 | 有効.
|
---|
| 823 |
|
---|
| 824 | -M[--print-dependencies]<ターゲットシンボル>
|
---|
| 825 | システムコンフィギュレーションファイルの依存関係を出力する.
|
---|
| 826 | Makefile中の依存関係を生成する際に用いる.
|
---|
| 827 |
|
---|
| 828 | コンフィギュレータの詳細仕様については,別途PDFファイルの形で配布してい
|
---|
| 829 | る「TOPPERS新世代カーネル用コンフィギュレータ仕様」を参照すること.
|
---|
| 830 |
|
---|
| 831 |
|
---|
| 832 | 8.システムサービス
|
---|
| 833 |
|
---|
| 834 |
|
---|
| 835 | 8.1. シリアルインタフェースドライバ
|
---|
| 836 |
|
---|
| 837 | シリアルインタフェースドライバは,シリアルポートを扱うためのドライバで
|
---|
| 838 | ある.
|
---|
| 839 |
|
---|
| 840 | シリアルインタフェースドライバは,システムコンフィギュレーションファイ
|
---|
| 841 | ルでserial.cfgをインクルードすることで,システムに組み込むことができる.
|
---|
| 842 | シリアルインタフェースドライバを呼び出すソースファイルでは,serial.hを
|
---|
| 843 | インクルードする.
|
---|
| 844 |
|
---|
| 845 | 8.1.1. シリアルインタフェースドライバのサービスコール
|
---|
| 846 |
|
---|
| 847 | シリアルインタフェースドライバを呼び出すサービスコールの仕様は次の通り
|
---|
| 848 | である.この中で,シリアルポートのID番号(portid)の解釈はターゲット依
|
---|
| 849 | 存となる.
|
---|
| 850 |
|
---|
| 851 | これらのサービスコールは,非タスクコンテキストから呼び出すことはできな
|
---|
| 852 | い.また,serial_rea_datとserial_wri_datは,ディスパッチ保留状態で呼び
|
---|
| 853 | 出すことはできない.いずれも,呼び出した場合にはE_CTXエラーとなる.
|
---|
| 854 |
|
---|
| 855 | (1) ER serial_opn_por(ID portid)
|
---|
| 856 |
|
---|
| 857 | portidで指定されたシリアルポートをオープンし,受信/送信が可能な状態に
|
---|
| 858 | する.
|
---|
| 859 |
|
---|
| 860 | (2) ER serial_cls_por(ID portid)
|
---|
| 861 |
|
---|
| 862 | portidで指定されたシリアルポートをクローズする.
|
---|
| 863 |
|
---|
| 864 | (3) ER_UINT serial_rea_dat(ID portid, char *buf, uint_t len)
|
---|
| 865 |
|
---|
| 866 | portidで指定されたシリアルポートから,lenバイトの文字列を受信し,bufか
|
---|
| 867 | らの領域に入れる.シリアルポートの受信バッファに格納されているバイト数が
|
---|
| 868 | len バイトより少ない場合,取得可能なデータをbufに格納したら即座にリターン
|
---|
| 869 | する.受信した文字数またはエラーコードを返す.
|
---|
| 870 |
|
---|
| 871 | (4) ER_UINT serial_wri_dat(ID portid, const char *buf, uint_t len)
|
---|
| 872 |
|
---|
| 873 | portidで指定されたシリアルポートに,bufからのlenバイトの文字列を送信す
|
---|
| 874 | る.送信中にシリアルポートの送信バッファがフルになった場合,その時点で
|
---|
| 875 | 即座にリターンする.送信した文字数またはエラーコードを返す.
|
---|
| 876 |
|
---|
| 877 | (5) ER serial_ctl_por(ID portid, uint_t ioctl)
|
---|
| 878 |
|
---|
| 879 | portidで指定されたシリアルポートの制御情報を,ioctlで示される値に設定す
|
---|
| 880 | る.
|
---|
| 881 |
|
---|
| 882 | ioctlには,以下の制御情報を表す定数を,ビット毎に論理和をとったものを
|
---|
| 883 | 指定する.
|
---|
| 884 |
|
---|
| 885 | IOCTL_ECHO(エコーバックモード)
|
---|
| 886 | このビットを設定すると,シリアルインタフェースドライバがエコー
|
---|
| 887 | バックを行う.具体的には,バッファから文字を取り出す度に,その
|
---|
| 888 | 文字を書き出す.
|
---|
| 889 |
|
---|
| 890 | IOCTL_CRLF(改行モード)
|
---|
| 891 | LF(line feed)を書き出すと,CR(carriage return)+LFに変換し
|
---|
| 892 | て書き出す.
|
---|
| 893 |
|
---|
| 894 |
|
---|
| 895 | なお,オープン直後のデフォルトの設定値は(IOCTL_ECHO | IOCTL_CRLF)である.
|
---|
| 896 |
|
---|
| 897 |
|
---|
| 898 | 8.1.2. シリアルインタフェースドライバのその他のサービス
|
---|
| 899 |
|
---|
| 900 | シリアルインタフェースドライバは,前記のサービスコールに加えて,初期化
|
---|
| 901 | 処理と未送信文字の取出し処理を持つ.初期化処理は,カーネルに初期化ルー
|
---|
| 902 | チンとして登録する.また,ターゲット依存で,初期化処理,終了処理,割込
|
---|
| 903 | みサービスルーチンを持つ.これらの登録処理はserial.cfgに含まれる.
|
---|
| 904 |
|
---|
| 905 | (1) void serial_initialize(intptr_t exinf)
|
---|
| 906 |
|
---|
| 907 | シリアルインタフェースドライバを初期化する.カーネルに初期化ルーチンと
|
---|
| 908 | して登録する.exinfは無視する.
|
---|
| 909 |
|
---|
| 910 | (2) bool_t serial_get_chr(ID portid, char *p_c)
|
---|
| 911 |
|
---|
| 912 | portidで指定されたシリアルポートの送信バッファ中の文字を,p_cの指す番地
|
---|
| 913 | に取り出し,trueを返す関数.文字がなかった時には,falseを返す.終了処理
|
---|
| 914 | ルーチン中で呼び出すことを想定している.
|
---|
| 915 |
|
---|
| 916 |
|
---|
| 917 | 8.2. カーネル起動メッセージの出力
|
---|
| 918 |
|
---|
| 919 | カーネル起動メッセージの出力は,カーネルの起動時に,カーネルの名称やバー
|
---|
| 920 | ジョン番号,著作権表示などを出力するための機能である.
|
---|
| 921 |
|
---|
| 922 | カーネル起動メッセージの出力は,システムコンフィギュレーションファイル
|
---|
| 923 | でbanner.cfgをインクルードすることで,システムに組み込むことができる.
|
---|
| 924 |
|
---|
| 925 | カーネル起動メッセージの出力は,次の関数で構成される.
|
---|
| 926 |
|
---|
| 927 | (1) void print_banner(intptr_t exinf)
|
---|
| 928 |
|
---|
| 929 | システムログ機能を用いて,カーネル起動メッセージを出力する.banner.cfg
|
---|
| 930 | によって,カーネルに初期化ルーチンとして登録される.exinfは無視される.
|
---|
| 931 |
|
---|
| 932 |
|
---|
| 933 | 9.サポートライブラリ
|
---|
| 934 |
|
---|
| 935 | サポートライブラリは,アプリケーションやシステムサービスを作成するため
|
---|
| 936 | に利用できるライブラリ関数群である.
|
---|
| 937 |
|
---|
| 938 |
|
---|
| 939 | 9.1. キュー操作ライブラリ関数
|
---|
| 940 |
|
---|
| 941 | キュー操作ライブラリは,キューヘッダを含むリング構造のダブルリンクキュー
|
---|
| 942 | を扱うライブラリである.キューヘッダの次エントリはキューの先頭のエント
|
---|
| 943 | リ,前エントリはキューの末尾のエントリとする.また,キューの先頭のエン
|
---|
| 944 | トリの前エントリと,キューの末尾のエントリの次エントリは,キューヘッダ
|
---|
| 945 | とする.空のキューは,次エントリ,前エントリとも自分自身を指すキューヘッ
|
---|
| 946 | ダであらわす.
|
---|
| 947 |
|
---|
| 948 | キュー操作ライブラリ関数を用いる場合には,queue.hをインクルードする.
|
---|
| 949 |
|
---|
| 950 | キューヘッダとエントリのためのデータ構造として,QUEUE構造体を用いる.
|
---|
| 951 | QUEUE構造体の定義は次の通り.QUEUE型の変数は配列として定義することを前提と
|
---|
| 952 | している.
|
---|
| 953 |
|
---|
| 954 | typedef struct
|
---|
| 955 | {
|
---|
| 956 | QUEIDX next;
|
---|
| 957 | QUEIDX prev;
|
---|
| 958 | } QUEUE;
|
---|
| 959 |
|
---|
| 960 | QUEIDXはQUEUE型の配列のインデックス値を表すデータ型である.
|
---|
| 961 |
|
---|
| 962 | typedef uint8_t QUEIDX;
|
---|
| 963 |
|
---|
| 964 |
|
---|
| 965 | キュー操作のために用意している関数は次の通り.
|
---|
| 966 |
|
---|
| 967 | (1) queue_initialize(QUEUE *queue , QUEIDX queue_null)
|
---|
| 968 |
|
---|
| 969 | キューを初期化する.queueにはキューヘッダを,queue_nullには
|
---|
| 970 | 無効なキューヘッダを示すインデックス値を指定する.
|
---|
| 971 |
|
---|
| 972 | (2) queue_insert_prev(QUEUE *top , QUEIDX queue , QUEIDX entry)
|
---|
| 973 |
|
---|
| 974 | queueで指定するエントリの前に,entryで指定するエントリを挿入する.
|
---|
| 975 | topはqueue,entryを含むQUEUE型配列の先頭アドレスである.
|
---|
| 976 | queueにキューヘッダを指定した場合には,キューの末尾にp_entryで指定す
|
---|
| 977 | るエントリを挿入することになる.
|
---|
| 978 |
|
---|
| 979 | (3) queue_delete_next(QUEUE *top , QUEIDX queue)
|
---|
| 980 |
|
---|
| 981 | queueで指定するエントリの次のエントリを削除し,削除したエントリの
|
---|
| 982 | キュー配列中のインデックスを返す.
|
---|
| 983 | topはqueue,entryを含むQUEUE型配列の先頭アドレスである.
|
---|
| 984 |
|
---|
| 985 | (6) queue_empty(QUEUE *queue , QUEIDX queue_null)
|
---|
| 986 |
|
---|
| 987 | キューが空の場合にはtrue,そうでない場合にはfalseを返す.queueには
|
---|
| 988 | キューヘッダを,queue_nullには無効なキューヘッダを示すインデックス値を
|
---|
| 989 | 指定する.
|
---|
| 990 |
|
---|
| 991 |
|
---|
| 992 | 10.使用上の注意とヒント
|
---|
| 993 |
|
---|
| 994 | 10.1. タイマドライバの組込み
|
---|
| 995 |
|
---|
| 996 | タイマドライバをシステムに組み込むために,システムコンフィギュレーショ
|
---|
| 997 | ンファイルの先頭でtarget_timer.cfgをインクルードする必要がある.
|
---|
| 998 |
|
---|
| 999 | 10.2. assertマクロの処理
|
---|
| 1000 |
|
---|
| 1001 | SSPカーネルのコード中には,assertマクロが使われている.assertマクロの定
|
---|
| 1002 | 義はt_stddef.hに含まれ,assertが失敗した場合の最後の処理(通常は,プロ
|
---|
| 1003 | グラムを停止させる処理)は,ターゲット依存部のTOPPERS_assert_abortで決
|
---|
| 1004 | 定される.
|
---|
| 1005 |
|
---|
| 1006 | assertが失敗した場合,システム開発中はデバッガに落とすのが望ましいが,
|
---|
| 1007 | システム稼働時の対処法は,システムに対する要件に依存する.そこで,ター
|
---|
| 1008 | ゲット依存部のTOPPERS_assert_abortを,システム要件に合致した適切な処理
|
---|
| 1009 | に置き換える必要がある.システム要件によっては,NDEBUGを定義してassert
|
---|
| 1010 | マクロの処理をオブジェクトコード中から消す(「6.2 コンパイルオプション」
|
---|
| 1011 | の節を参照)方法も考えられる.
|
---|
| 1012 |
|
---|
| 1013 |
|
---|
| 1014 | 10.3. オブジェクトIDの管理
|
---|
| 1015 |
|
---|
| 1016 | TOPPERS/SSPカーネルでは,オブジェクトのID番号を,コンフィギュレータが割
|
---|
| 1017 | り付ける方法が基本となっている.
|
---|
| 1018 |
|
---|
| 1019 | アプリケーションプログラム中でオブジェクトのID番号を参照する場合には,
|
---|
| 1020 | 次の2つの方法が考えられる.
|
---|
| 1021 |
|
---|
| 1022 | (1) オブジェクト識別名を用いる
|
---|
| 1023 |
|
---|
| 1024 | オブジェクト生成のための静的API(CRE_YYY)の第1パラメータに記述したオブ
|
---|
| 1025 | ジェクト識別名を,アプリケーションプログラム中でも用いる方法.
|
---|
| 1026 |
|
---|
| 1027 | コンフィギュレータは,オブジェクト識別名を,割り付けたID番号にマクロ定
|
---|
| 1028 | 義するC言語プリプロセッサのディレクティブ(#define)をkernel_cfg.hに生
|
---|
| 1029 | 成するため,アプリケーションプログラムからkernel_cfg.hをインクルードす
|
---|
| 1030 | る必要がある.
|
---|
| 1031 |
|
---|
| 1032 | この方法は,オブジェクトコード中にID番号が直接埋め込まれるために実行効
|
---|
| 1033 | 率が良い一方で,コンフィギュレータが実行されてkernel_cfg.hが書き換わる
|
---|
| 1034 | 度に,アプリケーションプログラムの再コンパイルが必要になるという欠点が
|
---|
| 1035 | ある.そのため,アプリケーションプログラムを構成するファイルの中で,一
|
---|
| 1036 | 部のファイルのみでオブジェクト識別名を参照する構成にするといった工夫を
|
---|
| 1037 | することが望ましい.
|
---|
| 1038 |
|
---|
| 1039 | (2) オブジェクトのID番号を保持する変数を用いる
|
---|
| 1040 |
|
---|
| 1041 | オブジェクトのID番号を保持するconst属性を付加した変数を用意し,アプリケー
|
---|
| 1042 | ションプログラム中では,その変数を用いる方法.
|
---|
| 1043 |
|
---|
| 1044 | 例えば,TASK1というオブジェクト識別名のタスクに対して,次のような変数を
|
---|
| 1045 | 用意する.
|
---|
| 1046 |
|
---|
| 1047 | const ID TASK1_id = TASK1;
|
---|
| 1048 |
|
---|
| 1049 | アプリケーションプログラム中では,この変数(TASK1_id)を用いることで,
|
---|
| 1050 | コンフィギュレータが実行されてkernel_cfg.hが書き換わる度に,上記の変数
|
---|
| 1051 | 定義を含んだファイルのみを再コンパイルすればよいことになる.
|
---|
| 1052 |
|
---|
| 1053 | この方法は,アプリケーションプログラムの再コンパイルを最小限にできる利
|
---|
| 1054 | 点がある一方で,変数のためのメモリ領域が必要になることに加えて,(プロ
|
---|
| 1055 | セッサによっては)変数アクセスのためのオーバヘッドが生じるという欠点が
|
---|
| 1056 | ある.また,定数ではなく変数であることから,他の変数の初期化には使えな
|
---|
| 1057 | いという制限がある.
|
---|
| 1058 |
|
---|
| 1059 | なお,TOPPERS/SSPカーネルのコンフィギュレータは,--external-idオプショ
|
---|
| 1060 | ンを付加することにより,上記の変数定義をkernel_cfg.c中に生成する機能を
|
---|
| 1061 | 持っているので,すべてのオブジェクトIDをこの方法で参照する場合には,こ
|
---|
| 1062 | の機能を用いることを推奨する.
|
---|
| 1063 |
|
---|
| 1064 | コンフィギュレータによるID番号割付けのもう1つの課題として,コンフィギュ
|
---|
| 1065 | レーションファイルの修正により,オブジェクトIDの割付けが変わってしまう
|
---|
| 1066 | ことが挙げられる.これは,アプリケーションソフトウェアの設計仕様書にID
|
---|
| 1067 | 番号が記載されている場合や,デバッグ作業においてID番号を即値として表示
|
---|
| 1068 | や確認ができない場合に,作業効率を低下させる可能性が考えられる.
|
---|
| 1069 |
|
---|
| 1070 | この問題に対応するために,TOPPERS新世代カーネル用コンフィギュレータには,
|
---|
| 1071 | ID番号の割付け結果をファイルに書き出す機能(--id-output-fileオプション)
|
---|
| 1072 | と,ID番号の割付けをファイルから取り込む機能(--id-input-fileオプション)
|
---|
| 1073 | とが用意されている.ただしSSPカーネルの場合,現時点では動作上の問題があり
|
---|
| 1074 | 使用することができない.詳細は configurator.txt の「○カーネル構成・初期
|
---|
| 1075 | 化ファイル(kernel_cfg.c)」の (5) を参照のこと.
|
---|
| 1076 |
|
---|
| 1077 | 10.4. カーネルの内部シンボルのリネーム
|
---|
| 1078 |
|
---|
| 1079 | SSPカーネルでは,モジュール内部の名称が他のモジュール内部の名称と衝突す
|
---|
| 1080 | ることを避けるために,カーネルの内部シンボルは,C言語レベルで,先頭が
|
---|
| 1081 | "_kernel_"または"_KERNEL_"である名称としている.
|
---|
| 1082 |
|
---|
| 1083 | これをソースコードの可読性と両立させるために,SSPカーネルでは,ソースコー
|
---|
| 1084 | ドは自然な名前を用いて記述し,C言語プリプロセッサのマクロ定義(#define)
|
---|
| 1085 | を用いて,それを"_kernel_"または"_KERNEL_"で始まる名前(自然な名前が
|
---|
| 1086 | yyyyyの場合には,_kernel_yyyyy)にリネームする仕組みを用いている.
|
---|
| 1087 |
|
---|
| 1088 | 具体的には,関連するディレクトリにxxx_rename.defを置き,そこからリネー
|
---|
| 1089 | ムのためのヘッダファイル(xxx_rename.hおよびxxx_unrename.h)を生成する
|
---|
| 1090 | ツール(utils/genrename)を用意している.
|
---|
| 1091 |
|
---|
| 1092 | この仕組みは,ソースコードの可読性向上に役立つ一方で,弊害もある.例え
|
---|
| 1093 | ば,多くのデバッガで,ソースコード中の名称とオブジェクトコード中の名称
|
---|
| 1094 | が異なるために,ソースコード中の変数名を指定して値を読んだり,関数名を
|
---|
| 1095 | 指定してブレークポイントを置くといったことができない.
|
---|
| 1096 |
|
---|
| 1097 | この状況に対応するために,SSPカーネルでは,ソースコード中の該当する名称
|
---|
| 1098 | をリネームするためのユーティリティ(utils/applyrename)を用意している.
|
---|
| 1099 | applyrenameユーティリティに,リネーム定義ファイル(xxx_rename.def)のプ
|
---|
| 1100 | リフィックス(xxxの部分)と,リネームしたいファイルリストを与えると,リ
|
---|
| 1101 | ネーム処理を行なう.例えば,kernelディレクトリのすべてのファイルに対し
|
---|
| 1102 | て,カーネルの内部シンボルをリネームするには,次のコマンドを実行すれば
|
---|
| 1103 | よい.
|
---|
| 1104 |
|
---|
| 1105 | % cd kernel
|
---|
| 1106 | % ../utils/applyrename kernel *
|
---|
| 1107 |
|
---|
| 1108 | また,ターゲット依存部のディレクトリのすべてのファイルに対して,カーネ
|
---|
| 1109 | ルの内部シンボルをリネームするには,次のようなコマンドを実行すればよい.
|
---|
| 1110 |
|
---|
| 1111 | % cd target/cq_starm_gcc/
|
---|
| 1112 | % ../../utils/applyrename target *
|
---|
| 1113 | % ../../utils/applyrename ../../kernel/kernel *
|
---|
| 1114 |
|
---|
| 1115 | 10.5. システムの起動時の初期化処理
|
---|
| 1116 |
|
---|
| 1117 | システムの起動時にアプリケーションで必要となる初期化処理を行うための機
|
---|
| 1118 | 能として初期化ルーチンが用意されているが,初期化ルーチンが実行されるよ
|
---|
| 1119 | りも早いタイミングで実行することが必要な初期化処理がある場合がある.
|
---|
| 1120 |
|
---|
| 1121 | このような場合に用いるために,標準的なスタートアップモジュールから,ター
|
---|
| 1122 | ゲットシステム依存の初期化フック(hardware_init_hook)を呼び出すことと
|
---|
| 1123 | している.hardware_init_hookは,カーネルのターゲット依存部で用意されて
|
---|
| 1124 | いるのが標準であるが,これをアプリケーションで用意したものに置き換え,
|
---|
| 1125 | その中でアプリケーションで必要となる初期化処理を行うことができる.
|
---|
| 1126 |
|
---|
| 1127 | ただし,hardware_init_hookの作成する場合には,bssセクションとdataセクショ
|
---|
| 1128 | ンが初期化されていないことや,ライブラリが初期化されていないこと,C言語
|
---|
| 1129 | で記述できるとは限らないことなどに注意が必要である.作成にあたっては,
|
---|
| 1130 | 「ターゲット依存部 ポーティングガイド」を参照すること.
|
---|
| 1131 |
|
---|
| 1132 | カーネルのスタートアップモジュールがhardware_init_hookを呼び出すように
|
---|
| 1133 | 実装されていない場合には,スタートアップモジュールをアプリケーションで
|
---|
| 1134 | 用意したものに置き換える方法を推奨する.
|
---|
| 1135 |
|
---|
| 1136 | 11.参考情報
|
---|
| 1137 |
|
---|
| 1138 | 11.1. 利用条件と利用報告
|
---|
| 1139 |
|
---|
| 1140 | SSPカーネルの利用条件は,各ファイルの先頭に表示されている.著作権は,各
|
---|
| 1141 | ファイルの先頭に表示されている著作権者が保有している.
|
---|
| 1142 |
|
---|
| 1143 | 利用条件の(3)の(b)において,利用の形態をTOPPERSプロジェクトに報告する方
|
---|
| 1144 | 法としては,SSPカーネルを利用した製品の名称と応用分野,製品化した会社名
|
---|
| 1145 | と業種等の情報を,以下のURLのページから報告するものとする.
|
---|
| 1146 |
|
---|
| 1147 | http://www.toppers.jp/report.html
|
---|
| 1148 |
|
---|
| 1149 | またその際に,SSPカーネルを使用してのコメントやご意見もいただけると幸い
|
---|
| 1150 | である.
|
---|
| 1151 |
|
---|
| 1152 | 11.2. 保証・適用性・サポート
|
---|
| 1153 |
|
---|
| 1154 | SSPカーネルは無保証で提供されているものである.開発者およびTOPPERSプロ
|
---|
| 1155 | ジェクトは,SSPカーネルに関して,特定の使用目的に対する適合性も含めて,
|
---|
| 1156 | いかなる保証も行わない.また,SSPカーネルの利用により直接的または間接的
|
---|
| 1157 | に生じたいかなる損害に関しても,その責任を負わない.
|
---|
| 1158 |
|
---|
| 1159 | 開発者およびTOPPERSプロジェクトは,SSPカーネルに関するサポートの約束は
|
---|
| 1160 | していない.SSPカーネルに関して質問がある場合は,後述のTOPPERSユーザー
|
---|
| 1161 | ズメーリングリストを利用していただけると幸いである.確実なサポートが必
|
---|
| 1162 | 要な場合には,有償でサポートサービスを提供している会社に相談されたい.
|
---|
| 1163 |
|
---|
| 1164 | 11.3. バグレポート
|
---|
| 1165 |
|
---|
| 1166 | SSPカーネルにバグや問題点を発見された場合には,後述のTOPPERSユーザーズ
|
---|
| 1167 | メーリングリストに報告して欲しい.
|
---|
| 1168 |
|
---|
| 1169 | メーリングリストにバグや問題点などを報告する場合には,必要に応じて次の
|
---|
| 1170 | 情報を知らせて欲しい.
|
---|
| 1171 |
|
---|
| 1172 | 使用しているカーネルに関する情報
|
---|
| 1173 | ・ターゲット非依存部のバージョン
|
---|
| 1174 | ・使用しているターゲット依存部とそのバージョン
|
---|
| 1175 | ・TOPPERSプロジェクトからのリリースに対する改造箇所(あれば)
|
---|
| 1176 |
|
---|
| 1177 | ターゲットシステムに関する情報
|
---|
| 1178 | ・ターゲットプロセッサの種類
|
---|
| 1179 | ・ターゲットボード等の種類
|
---|
| 1180 |
|
---|
| 1181 | ホストに関する情報
|
---|
| 1182 | ・OSのバージョン(サービスパックの適用状況も)
|
---|
| 1183 | ・コンパイラなどの開発環境のバージョン(Cygwinのバージョンも)
|
---|
| 1184 |
|
---|
| 1185 | 11.4. ウェブサイト
|
---|
| 1186 |
|
---|
| 1187 | TOPPERSプロジェクトのウェブサイトは,以下のURLにある.
|
---|
| 1188 |
|
---|
| 1189 | http://www.toppers.jp/
|
---|
| 1190 |
|
---|
| 1191 | TOPPERSプロジェクトやSSPカーネルに関する最新情報は,このウェブサイトか
|
---|
| 1192 | ら得ることができる.また,SSPカーネルの最新版は,このウェブサイトからダ
|
---|
| 1193 | ウンロードすることができる.
|
---|
| 1194 |
|
---|
| 1195 | 11.5. TOPPERSユーザーズメーリングリスト
|
---|
| 1196 |
|
---|
| 1197 | SSPカーネルを含むTOPPERSプロジェクトの開発成果物のユーザに対する情報提
|
---|
| 1198 | 供およびユーザ相互間の情報交換を容易にするために,TOPPERSユーザーズメー
|
---|
| 1199 | リングリスト(users@toppers.jp)を用意している.
|
---|
| 1200 |
|
---|
| 1201 | このメーリングリストには,誰でも自由に登録し,メールを送付することがで
|
---|
| 1202 | きる(登録者以外はメールを送付できない).また,送付されたメールは,誰
|
---|
| 1203 | でも自由にウェブサイトで読むことができる.
|
---|
| 1204 |
|
---|
| 1205 | メーリングリストへの登録方法については,以下のURLのページに説明がある.
|
---|
| 1206 |
|
---|
| 1207 | http://www.toppers.jp/community.html
|
---|
| 1208 |
|
---|
| 1209 | 11.6. TOPPERSプロジェクトのメンバ向けのサービス
|
---|
| 1210 |
|
---|
| 1211 | TOPPERSプロジェクトのメンバに対しては,上記に加えて,SSPカーネルに関連
|
---|
| 1212 | して次のサービスを用意している.
|
---|
| 1213 |
|
---|
| 1214 | (1) TOPPERS開発者メーリングリスト
|
---|
| 1215 |
|
---|
| 1216 | TOPPERSプロジェクトのメンバは,SSPカーネルに関する質問,バグや問題点な
|
---|
| 1217 | どの報告に,TOPPERS開発者メーリングリスト(dev@toppers.jp)を利用するこ
|
---|
| 1218 | とができる.
|
---|
| 1219 |
|
---|
| 1220 | (2) SSPカーネルの開発支援サイト
|
---|
| 1221 |
|
---|
| 1222 | SSPカーネルの開発支援のためのTRAC(バグトラッキングシステム)が,以下の
|
---|
| 1223 | URLにある(TRACへのアクセスには,会員パスワードが必要である).
|
---|
| 1224 |
|
---|
| 1225 | http://dev.toppers.jp/trac/ssp_core
|
---|
| 1226 |
|
---|
| 1227 | TOPPERSプロジェクトのメンバは,このサイトから,ウェブインタフェースおよ
|
---|
| 1228 | びsubversionサーバにより,SSPカーネルの開発中のバージョンを得ることがで
|
---|
| 1229 | きる.また,バグトラッキングデータベースにアクセスすることができ,過去
|
---|
| 1230 | のバグ履歴へのアクセスや,バグの登録をすることができる.
|
---|
| 1231 |
|
---|
| 1232 | 11.7. TOPPERSプロジェクトへの参加
|
---|
| 1233 |
|
---|
| 1234 | TOPPERSプロジェクトでは,何からの形でプロジェクトに貢献していただける方,
|
---|
| 1235 | プロジェクトで開発したソフトウェアをお使いの方,プロジェクトに興味をお
|
---|
| 1236 | 持ちの方の参加を求めている.TOPPERSプロジェクトへの参加方法については,
|
---|
| 1237 | 以下のページに説明がある.
|
---|
| 1238 |
|
---|
| 1239 | http://www.toppers.jp/joinus.html
|
---|
| 1240 |
|
---|
| 1241 |
|
---|
| 1242 | 12.リファレンス
|
---|
| 1243 |
|
---|
| 1244 | 12.1. サービスコール一覧
|
---|
| 1245 |
|
---|
| 1246 | (1) タスク管理機能
|
---|
| 1247 |
|
---|
| 1248 | ER ercd = act_tsk(ID tskid)
|
---|
| 1249 | ER ercd = iact_tsk(ID tskid)
|
---|
| 1250 |
|
---|
| 1251 | (2) システム状態管理機能
|
---|
| 1252 |
|
---|
| 1253 | ER ercd = loc_cpu(void)
|
---|
| 1254 | ER ercd = iloc_cpu(void)
|
---|
| 1255 | ER ercd = unl_cpu(void)
|
---|
| 1256 | ER ercd = iunl_cpu(void)
|
---|
| 1257 | ER ercd = dis_dsp(void)
|
---|
| 1258 | ER ercd = ena_dsp(void)
|
---|
| 1259 | bool_t state = sns_ctx(void)
|
---|
| 1260 | bool_t state = sns_loc(void)
|
---|
| 1261 | bool_t state = sns_dsp(void)
|
---|
| 1262 | bool_t state = sns_dpn(void)
|
---|
| 1263 | bool_t state = sns_ker(void)
|
---|
| 1264 | ER ercd = ext_ker(void)
|
---|
| 1265 |
|
---|
| 1266 | (3) 割込み管理機能
|
---|
| 1267 |
|
---|
| 1268 | ER ercd = dis_int(INTNO intno)
|
---|
| 1269 | ER ercd = ena_int(INTNO intno)
|
---|
| 1270 |
|
---|
| 1271 | 12.2. 静的API一覧
|
---|
| 1272 |
|
---|
| 1273 | (1) タスク管理機能
|
---|
| 1274 |
|
---|
| 1275 | CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,
|
---|
| 1276 | PRI itskpri, SIZE stksz, STK_T *stk })
|
---|
| 1277 | DEF_EPR(ID tskid,{ PRI etskpri })
|
---|
| 1278 |
|
---|
| 1279 | (2) 割込み管理機能
|
---|
| 1280 |
|
---|
| 1281 | ATT_ISR({ ATR isratr, intptr_t exinf, INTNO intno, ISR isr, PRI isrpri })
|
---|
| 1282 | DEF_INH(INHNO inhno, { ATR inhatr, INTHDR inthdr })
|
---|
| 1283 | CFG_INT(INTNO intno, { ATR intatr, PRI intpri })
|
---|
| 1284 |
|
---|
| 1285 | (3) CPU例外管理機能
|
---|
| 1286 |
|
---|
| 1287 | DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })
|
---|
| 1288 |
|
---|
| 1289 | (4) システム構成管理機能
|
---|
| 1290 |
|
---|
| 1291 | DEF_ICS({ SIZE istksz, STK_T *istk })
|
---|
| 1292 | DEF_STK({SIZE stksz, STK_T *stk})
|
---|
| 1293 | ATT_INI({ ATR iniatr, intptr_t exinf, INIRTN inirtn })
|
---|
| 1294 | ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn })
|
---|
| 1295 |
|
---|
| 1296 | 12.3. バージョン履歴
|
---|
| 1297 |
|
---|
| 1298 | 2011年 3月31日 Release 1.0.0 早期リリース
|
---|
| 1299 | 2011年11月16日 Release 1.1.0 最初の一般リリース
|
---|
| 1300 | 2011年 3月23日 Release 1.1.1 軽微な修正とバグフィックス
|
---|
| 1301 | 2013年 4月23日 Release 1.2.0 タスクの起動要求キューイング機能の追加
|
---|
| 1302 | DEF_ICSの仕様変更
|
---|
| 1303 | DEF_STKの追加
|
---|
| 1304 | 同期・通信機能拡張パッケージの追加
|
---|
| 1305 | 2014年 3月 6日 Release 1.2.1 バグフィックス
|
---|
| 1306 | 2015年 5月19日 Release 1.3.0
|
---|
| 1307 |
|
---|
| 1308 | 以上
|
---|