-
Notifications
You must be signed in to change notification settings - Fork 0
/
porting.txt
3975 lines (2998 loc) · 156 KB
/
porting.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
TOPPERS/ASPカーネル
ターゲット依存部 ポーティングガイド
対応バージョン: Release 1.7.0
最終更新: 2011年4月10日
このドキュメントは,TOPPERS/ASPカーネルを,未サポートのターゲットシステ
ムにポーティングするために必要となるターゲット依存部の実装方法を説明す
るものである.
----------------------------------------------------------------------
TOPPERS/ASP Kernel
Toyohashi Open Platform for Embedded Real-Time Systems/
Advanced Standard Profile Kernel
Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
Graduate School of Information Science, Nagoya Univ., JAPAN
上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
(1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
権表示,この利用条件および下記の無保証規定が,そのままの形でソー
スコード中に含まれていること.
(2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
用できる形で再配布する場合には,再配布に伴うドキュメント(利用
者マニュアルなど)に,上記の著作権表示,この利用条件および下記
の無保証規定を掲載すること.
(3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
用できない形で再配布する場合には,次のいずれかの条件を満たすこ
と.
(a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
作権表示,この利用条件および下記の無保証規定を掲載すること.
(b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
報告すること.
(4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
免責すること.
本ソフトウェアは,無保証で提供されているものである.上記著作権者お
よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
の責任を負わない.
$Id: porting.txt 2064 2011-05-01 08:09:00Z ertl-hiro $
----------------------------------------------------------------------
○目次
1.共通事項
1.1 ターゲット依存部の構成
1.2 名前の衝突の防止
1.3 多重インクルードの防止
1.4 アセンブリ言語とのヘッダファイルの共用
1.5 インクルード記述の方法
1.6 クリティカルセクションの出入処理の実現に関する制約
2.システム構築環境のターゲット依存部
2.1 ターゲット略称とターゲット依存部のディレクトリ
2.2 Makefileのターゲット依存部
2.3 開発環境名とコマンド名の設定
2.4 コンパイルオプションとオブジェクトファイルの設定
2.5 オフセットファイルの生成方法
2.5.1 コンフィギュレータを用いる方法
2.5.2 makeoffset.cとgenoffsetを用いる方法
2.6 リンク方法の設定
2.7 依存関係の定義
2.8 その他の設定
3.TOPPERS共通定義のターゲット依存部
3.1 ターゲット識別マクロ
3.2 整数型の最大値・最小値・ビット数
3.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ
3.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ
3.5 コンパイラの拡張機能のためのマクロ定義
3.6 標準的な定義の上書き
3.7 アサーションのための定義
4.システムインタフェースレイヤ(SIL)のターゲット依存部
4.1 全割込みロック状態の管理
4.2 微少時間待ち
4.3 プロセッサのエンディアン
4.4 メモリ空間アクセス関数
4.5 I/O空間アクセス関数
5.カーネルAPIのターゲット依存部
5.1 ターゲット定義でサポートする機能
5.2 割込み優先度の範囲
5.3 タイムティックの定義
5.4 メモリ領域確保のための型定義
5.5 ビットパターンのビット数
5.6 メモリ領域確保のためのマクロ
5.7 オーバランハンドラ機能拡張のための定義(オプション)
6.カーネル実装のターゲット依存部
6.1 カーネル実装のターゲット依存部の共通事項
6.1.1 カーネル実装のターゲット依存部の構成要素
6.1.2 ターゲット依存部の関数の命名規則
6.2 トレースログ機能への対応
6.3 システム状態の管理
6.3.1 全割込みロック状態の管理
6.3.2 コンテキストの管理
6.3.3 CPUロック状態の管理
6.4 割込みに関連するシステム状態の管理
6.4.1 割込み優先度マスクの管理
6.4.2 割込み要求禁止フラグの管理
6.4.3 割込み要求のクリア
6.4.4 割込み要求のプローブ
6.4.5 割込みハンドラの先頭処理と末尾処理
6.5 タスクディスパッチャ
6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
6.5.2 ディスパッチャ本体
6.5.3 タスクコンテキストからのディスパッチ
6.5.4 ディスパッチャの動作開始
6.5.5 現在のコンテキストを捨ててディスパッチ
6.5.6 タスクの起動処理
6.6 割込みハンドラ
6.6.1 割込みハンドラの出入口処理
6.6.2 割込みハンドラ毎の出入口処理の生成
6.6.3 割込みハンドラの設定
6.6.4 割込み要求ラインの属性の設定
6.6.5 割込み管理機能の初期化処理の変更
6.6.6 デフォルトの割込みハンドラ
6.6.7 カーネル管理外の割込み
6.6.8 割込みサービスルーチンの生成
6.7 CPU例外ハンドラとCPU例外発生時のシステム状態の参照
6.7.1 CPU例外ハンドラの出入口処理
6.7.2 CPU例外ハンドラの出入口処理の生成
6.7.3 CPU例外ハンドラの設定
6.7.4 CPU例外管理機能の初期化処理の変更
6.7.5 デフォルトのCPU例外ハンドラ
6.7.6 CPU例外発生時のシステム状態の参照
6.8 カーネルの起動・終了とスタック領域など
6.9 カーネル内部のチューニング
6.9.1 ビットマップサーチ
6.9.2 ビットフィールド
6.10 カーネル実装に関するその他の定義
6.10.1 オブジェクト属性の拡張
6.10.2 エラーチェック方法の指定
6.10.3 非タスクコンテキスト用のスタック領域
6.10.4 空ラベルの定義
6.11 トレースログ機能に関する設定
6.11.1 取得できるトレースログの種類とマクロ
6.11.2 トレースログ記録のサンプルコード
6.12 カーネル実装のターゲット依存部のためのリネーム記述
6.13 タイマドライバ
6.13.1 タイマドライバのファイル構成
6.13.2 タイマの初期化・終了処理・割込み処理
6.13.3 性能評価用システム時刻の参照のための機能
6.14 オーバランタイマドライバ(オプション)
6.14.1 オーバランタイマドライバのファイル構成
6.14.2 オーバランタイマの操作と割込み処理
6.15 動的メモリ管理
6.15.1 TLSFを用いたメモリ管理モジュールの例
7.コンフィギュレータ設定ファイルのターゲット依存部
7.1 設定ファイルとターゲット依存部の位置付け
7.2 パス2のテンプレートファイルのターゲット依存部
7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
7.2.2 ターゲット非依存部で定義される変数
7.3 パス3のテンプレートファイルのターゲット依存部
7.3.1 ターゲット非依存部をインクルードする前に定義すべき変数
7.3.2 ターゲット依存部で行うべきエラーチェック
7.4 cfg1_out.cのリンクに必要なスタブの定義ファイル
8.システムサービス等のターゲット依存部
8.0 システムサービスのターゲット依存部
8.1 システムログ機能のターゲット依存定義
8.2 ログタスクのターゲット依存定義
8.3 シリアルインタフェースドライバのターゲット依存部
8.3.1 変数,データ型,管理関数
8.3.2 デバイスサービスルーチン
8.3.3 コールバックルーチン
8.4 カーネル起動メッセージの出力のターゲット依存定義
8.5 サンプルプログラムとテストプログラムのターゲット依存定義
8.6 実行時間分布集計モジュールのターゲット依存定義
9.その他
9.1 ドキュメント
9.2 パッケージ記述ファイル
10.リファレンス
10.1 ターゲット依存部のファイル一覧
1.共通事項
1.1 ターゲット依存部の構成
ターゲット依存部は,targetディレクトリの下に,ターゲットハードウェアと
開発環境の組み合わせ毎に用意する.ただし,ターゲット依存部の再利用性を
考慮し,プロセッサ,チップ,開発環境のみに依存する部分を,プロセッサ依
存部,チップ依存部,開発環境依存部という形で切り分けてもよい.切り分け
方は,ターゲット依存部の実装に任されている.プロセッサ依存部,チップ依
存部,開発環境依存部は,archディレクトリの下に置く.
ASPカーネルのターゲット依存部は,システム構築環境(Makefile等)のターゲッ
ト依存部,TOPPERS共通定義(t_stddef.h)のターゲット依存部,システムイン
タフェースレイヤ(SIL,sil.h)のターゲット依存部,カーネルAPI(kernel.h)
のターゲット依存部,カーネル実装のターゲット依存部(コンフィギュレータ
設定ファイルのターゲット依存部を含む),システムサービスのターゲット依
存部,ターゲット依存部に関するドキュメント等で構成される.
1.2 名前の衝突の防止
TOPPERSプロジェクトが提供するソフトウェアのために,TOPPERS_で始まるシン
ボルを予約している.ヘッダファイル中に記述され,アプリケーションから参
照できる内部シンボルは,TOPPERS_で始まる名前とする.
また,_kernel_で始まるシンボルは,カーネル内部の変数や関数のために予約
している.カーネル内部の変数や関数の名前で,リンク時にアプリケーション
の名前と衝突する可能性があるものは,リネーム記述にリストアップすること
で,コンパイル時に_kernel_で始まる名前に置き換えることとしている.
1.3 多重インクルードの防止
すべてのヘッダファイルは,多重にインクルードされるのを防止するための条
件コンパイル記述を入れることとする.例えば,target_config.hであれば,ファ
イルの先頭に
#ifndef TOPPERS_TARGET_CONFIG_H
#define TOPPERS_TARGET_CONFIG_H
を,ファイルの末尾に
#endif /* TOPPERS_TARGET_CONFIG_H */
を記述する.
1.4 アセンブリ言語とのヘッダファイルの共用
ASPカーネルのヘッダファイルの多くは,アセンブリ言語のソースファイルから
もインクルードできるようにするために,次のルールに従って記述するものと
する.
・TOPPERS_MACRO_ONLYがマクロ定義されている場合には,アセンブリ言語では
解釈できない記述(マクロ定義以外の記述)を除くように記述する.
・符号無し整数型の定数値は,UINT_CやULONG_Cなどの整数定数を作るためのマ
クロを用いて記述する.ただし,アセンブリ言語のソースファイルからもイ
ンクルードできるファイル中であっても,C言語のみで用いる定数をこれらの
マクロを使って記述する必要はない.
また,カーネル実装においては,次のルールに従うものとする.
・アセンブリ言語からも用いる定数の定義中に型キャストを用いる場合には,
CASTマクロを用いて記述する.
アセンブリ言語からヘッダファイルをインクルードする際には,必要に応じて,
TOPPERS_MACRO_ONLY,UINC_C,ULONG_C,CASTをマクロ定義してから,インクルー
ドしなければならない.
1.5 インクルード記述の方法
開発環境で用意されている標準ヘッダファイルおよびincludeディレクトリ下の
標準ヘッダファイルは,「#include <...>」によりインクルードする.
その他のヘッダファイルは,「#include "..."」によりインクルードする.ヘッ
ダファイルが,カレントディレクトリやインクルードするファイルと同じディ
レクトリ以外のディレクトリに置かれている場合には,次のようにパス指定を
行う.
・ターゲット依存部(target/<ターゲット名>)のディレクトリに置かれている
場合は,パス指定を行わず,ファイル名のみを記述する.
例)#include "target_config.h"
・archディレクトリ下のディレクトリに置かれている場合には,archディレク
トリからの相対パスで記述する.
例)#include "m68k_gcc/prc_config.h"
・その他の場合には,ソースプログラムのルートディレクトリ(configureが置
かれているディレクトリ)からの相対パスで記述する.
例)#include "pdic/upd72001/upd72001.h"
・カーネルを構成するファイルから,kernelディレクトリ下のヘッダファイル
をインクルードする場合は,パス指定を行わず,ファイル名のみを記述する.
例)#include "kernel_impl.h"
1.6 クリティカルセクションの出入処理の実現に関する制約
カーネル内で用いるクリティカルセクションの出入処理を実現する場合には,
次の2つの条件を満たすように実装しなければならない.
(1-6-1) 出入処理から抜けた時点では,割込みの禁止/許可が完了していなけ
ればならない.例えば,割込み禁止/許可命令を実行してから実際に割込みが
禁止/許可されるまで何命令か遅延するプロセッサの場合には,出入処理の中
にNOP命令を入れるなどの方法で,出入処理を抜けた時点では,割込みが禁止/
許可された状態になっていることを保証しなければならない.
(1-6-2) メモリ上のデータ構造が書き変わる可能性があることを,何らかの方
法でコンパイラに知らせなければならない.GNU開発環境では,次のいずれかの
方法でこの制約を満たすことができる.
(a) クリティカルセクションの出入処理の全体または出入処理の本質的な部分
(具体的には,割込み禁止/許可する処理)を(インラインでない)通常
の関数により実現する.
(b) クリティカルセクションの出入処理の本質的な部分をインラインアセンブ
ラによって実現している場合には,そのインラインアセンブラのclobber変
数リストに"memory"を追加する.
(c) クリティカルセクションの出入処理の本質的な部分が,マクロやインライ
ン関数呼出しで実現している場合には,クリティカルセクションに入る処
理の最後と出る処理の先頭に,Asm("":::"memory")という記述を入れる.
このような制約を設ける理由については,「TOPPERS/ASPカーネル 設計メモ」
の「カーネルのデータ構造に対するvolatile宣言について」の節を参照するこ
と.
2.システム構築環境のターゲット依存部
この章の説明は,GNU開発環境(GCC,GAS,BINUTILS,GNU Make)を用いること
を想定して記述してある.それ以外の開発環境を用いる場合には,開発環境に
あわせて修正する必要がある.
2.1 ターゲット略称とターゲット依存部のディレクトリ
新しいターゲット依存部を作成する時は,まず,ターゲット略称を定める.ター
ゲット略称は,システム略称と開発環境略称を"_"で連結したものとする.シス
テム略称に用いる文字は英小文字と数字と"_"に,開発環境略称に用いる文字は
英小文字と数字に限定する.GNU開発環境の開発環境略称は,"gcc"とする.例
えば,システム略称が"dve68k"で,GNU開発環境を用いる場合には,ターゲット
略称は"dve68k_gcc"となる.
ターゲット依存部のファイルを置くために,targetディレクトリの下に,ター
ゲット略称を名称とするディレクトリを作成する.これをターゲット依存部ディ
レクトリと呼ぶ.
ターゲット依存部からプロセッサ依存部やチップ依存部を切り分ける場合には,
依存部略称を定める.依存部略称は,プロセッサやチップの略称と開発環境略
称を"_"で連結したものとする.プロセッサやチップの略称に用いる文字は,英
小文字と数字と"_"に限定する.例えば,プロセッサ略称が"m68k"で,GNU開発
環境を用いる場合には,依存部略称は"m68k_gcc"となる.
また,ターゲット依存部から開発環境依存部を切り分ける場合には,開発環境
略称を依存部略称とする.例えば,GNU開発環境依存部の依存部略称は,"gcc"
となる.
これらの依存部のファイルを置くために,archディレクトリの下に,依存部略
称を名称とするディレクトリを作成する.
なお,GNU開発環境以外の開発環境を用いる場合には,コンフィギュレーション
スクリプト(configure),サンプルのMakefile(sample/Makefile),一部の
ユーティリティプログラム(utils/makedep)を,その開発環境用に用意する必
要がある場合がある.その場合には,これらのファイルを,ターゲット依存部
ディレクトリか開発環境依存部ディレクトリに置くものとする.また,開発環
境用のプロジェクトファイルが必要な場合には,ターゲット依存部ディレクト
リに置くものとする.
2.2 Makefileのターゲット依存部
Makefileのターゲット依存部は,ターゲット依存部ディレクトリに置いた
Makefile.targetまたはそこからインクルードされるファイル(プロセッサ・チッ
プ・開発環境依存部で用意されるファイルなど)に含める.
2.3 開発環境名とコマンド名の設定
開発環境名とコマンド名を設定するために,Makefileのターゲット依存部で次
の変数を定義する.
(2-3-1) TOOL 開発環境名
開発環境名に定義する.GNU開発環境を用いる場合には,gccに定義する.
(2-3-2) GCC_TARGET GNU開発環境のターゲット名
GNU開発環境を用いる場合に,GNU開発環境をconfigureする場合に指定するター
ゲット名に定義する.ここで指定したターゲット名は,開発環境のコマンド名
の先頭に付与される文字列となる.例えば,GCC_TARGETをm68k-unknown-elfに
定義した場合には,コンパイラとしてm68k-unknown-elf-gccが使われる.この
変数が定義されない場合には,単なるgccが使われる.
(2-3-3) CC Cコンパイラドライバの名称
(2-3-4) CXX C++コンパイラドライバの名称
(2-3-5) AS アセンブラの名称
(2-3-6) LD リンカの名称
(2-3-7) AR アーカイバの名称
(2-3-8) NM nmプログラムの名称
(2-3-9) RANLIB ranlibプログラムの名称
(2-3-10) OBJCOPY objcopyプログラムの名称
(2-3-11) OBJDUMP objdumpプログラムの名称
GNU開発環境以外の開発環境を用いる場合に,それぞれのコマンドの名称に定義
する.対応するコマンドがない場合や,コマンドパラメータが異なる場合には,
Makefile中でそのコマンドを呼び出している部分を変更する必要がある.
GNU開発環境では,これらはGCC_TARGETを用いて定義されるので,定義する必要
はない.
2.4 コンパイルオプションとオブジェクトファイルの設定
Makefileのターゲット依存部で以下で説明する変数を定義する時には,":="を
用いて,それまでの定義に追加する形で行う.例えば,コンパイラに対するそ
の他のオプションとして「-Wall -g -O2」を追加したい場合には,「COPTS :=
$(COPTS) -Wall -g -O2」という記述をMakefileのターゲット依存部に含める.
(2-4-1) COPTS コンパイラに対するその他のオプション
(2-4-2) CDEFS マクロ定義オプション(-Dオプション)
(2-4-3) INCLUDES ヘッダファイルの置かれたディレクトリ指定オ
プション(-Iオプション)
(2-4-4) LDFLAGS リンカに対するその他のオプション
(2-4-5) LIBS ライブラリリンク指定のためのオプション
ターゲットに依存して,すべてのソースファイルに共通するコンパイルオプショ
ンの追加が必要な場合には,オプションの種類毎に上に示した変数に定義する.
ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
下の記述を含める必要がある.
----------------------------------------
INCLUDES := $(INCLUDES) -I$(TARGETDIR)
----------------------------------------
ここでTARGETDIRは,ターゲット依存部ディレクトリに定義されている.また
SRCDIRは,Makefileにおいて,ソースプログラムのルートディレクトリ
(configureが置かれているディレクトリ)に定義されている.
コンパイラの問題等で,警告メッセージが出ることを防げない状況以外では,
COPTSに-Werrorを追加することを推奨する.
----------------------------------------
COPTS := $(COPTS) -Werror
----------------------------------------
カーネルのコンパイル時に,dereferencing type-punned pointer will break
strict-aliasing rulesという警告が出る場合には,以下を追加するとよい.こ
の警告メッセージに関する詳細は,「TOPPERS/ASPカーネル 設計メモ」の「型
キャストに伴う警告メッセージ」の節を参照すること.
----------------------------------------
KERNEL_CFLAGS := $(KERNEL_CFLAGS) -fno-strict-aliasing
----------------------------------------
また,アセンブリ言語レベルの識別名が,C言語レベルの識別名の先頭に"_"が
付いたものになる場合には,CDEFSに-DTOPPERS_LABEL_ASMを追加する.
(2-4-6) SYSSVC_DIR システムサービスのソースが置かれたディレクトリ
(2-4-7) SYSSVC_ASMOBJS アセンブリ言語で記述されたシステムサービスの
オブジェクト
(2-4-8) SYSSVC_COBJS C言語で記述されたシステムサービスのオブジェクト
(2-4-9) SYSSVC_CFLAGS システムサービスに対するコンパイルオプション
(2-4-10) SYSSVC_LIBS システムサービスに対するライブラリリンク指定
ターゲットに依存して,システムサービス(システムログタスクやデバイスド
ライバなど)のソースが置かれたディレクトリ,システムサービスを構成する
オブジェクトファイルのリスト,それらをコンパイルする際に適用するコンパ
イルオプション,その構成に必要なライブラリリンク指定を追加する場合には,
上に示した変数に定義する.
(2-4-11) KERNEL_DIR カーネルのソースが置かれたディレクトリ
(2-4-12) KERNEL_ASMOBJS アセンブリ言語で記述されたカーネルのオブジェクト
(2-4-13) KERNEL_COBJS C言語で記述されたカーネルのオブジェクト
(2-4-14) KERNEL_CFLAGS カーネルに対するコンパイルオプション
ターゲットに依存して,カーネルのソースが置かれたディレクトリ,カーネル
を構成するオブジェクトファイルのリスト,それらをコンパイルする際に適用
するコンパイルオプションを追加する場合には,上に示した変数に定義する.
ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
下の記述を含める必要がある.
----------------------------------------
KERNEL_DIR := $(KERNEL_DIR) $(TARGETDIR)
KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) target_support.o
KERNEL_COBJS := $(KERNEL_COBJS) target_config.o target_timer.o
----------------------------------------
(2-4-15) CFG_TABS コンフィギュレータに対するオプション
ターゲットに依存して,コンフィギュレータに対するオプションを追加する場
合には,上に示した変数に定義する.具体的には,コンフィギュレータの値取
得シンボルテーブルのターゲット依存部(target_def.csv)がある場合には,
それを指定するオプションを追加する必要がある.
ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
下の記述を含める必要がある.
----------------------------------------
CFG_TABS := $(CFG_TABS) --cfg1-def-table $(TARGETDIR)/target_def.csv
----------------------------------------
(2-4-16) CFG1_OUT_LDFLAGS cfg1_out.cに対するリンクオプション
ターゲットに依存して,cfg1_out.cをリンクする際に適用するオプションを追
加する場合には,上に示した変数に定義する.
(2-4-17) CFG_OBJS システムコンフィギュレーションのためのオブ
ジェクト
ターゲットに依存して,システムコンフィギュレーションのためのオブジェク
トファイルを(kernel_cfg.o以外に)追加する場合には,上に示した変数に定
義する.この場合,追加したオブジェクトファイルの作成ルール(コンパイル/
アセンブルルールと依存関係作成ルール)を,Makefileのターゲット依存部に
記述する必要がある.
(2-4-18) CFG2_OUT
ターゲットに依存して,コンフィギュレータのパス2でkernel_cfg.cと
kernel_cfg.h以外のファイルを生成する場合には,上に示した変数に定義する.
(2-4-19) OMIT_WARINIG_ALL
(2-4-20) OMIT_OPTIMIZATION
サンプルのMakefileでは,コンパイラに対するオプションに「-Wall -g -O2」
を追加する.-Wallを追加したくない場合には,Makefileのターゲット依存部で
OMIT_WARNING_ALLを"true"に定義する.-O2を追加したくない場合には,
Makefileのターゲット依存部でOMIT_OPTIMIZATIONを"true"に定義する.
2.5 オフセットファイルの生成方法
アセンブリ言語で記述されるプログラムから,C言語の構造体にアクセスする場
合には,構造体の各フィールドのオフセット値を参照することが必要である.
ASPカーネルでは,必要なオフセット値を求めてファイル(標準ではoffset.h)
に生成するための仕組みを用意している.
この仕組みを用いることで,例えば,TCB中のtexptnフィールドのオフセット値
をTCB_texptnにマクロ定義することや,TCB中のタスクコンテキストブロック
(tskctxb)に含まれるpcフィールドのオフセット値をTCB_pcにマクロ定義する
ことができる.また,TCB中のenatexフィールドのオフセット値,ビット位置,
ビットマスクを,それぞれTCB_enatex,TCB_enatex_bit,TCB_enatex_maskにマ
クロ定義することができる.
offset.hを生成するための仕組みとして,現時点では,コンフィギュレータを
用いる方法と,makeoffset.cとgenoffsetを用いる方法を用意している.後者の
方法は,GNU開発環境にしか対応していないことから,将来のバージョンでは,
後者の方法のサポートをやめる計画である.新たにポーティングする場合には,
前者の方法を用いることを推奨する.
これらの仕組みでオフセットファイルを生成できない時には,offset.hをター
ゲット依存部で用意し,Makefileのターゲット依存部でOMIT_MAKEOFFSETを
"true"に定義する.
拡張パッケージの中には,TCBにフィールドを追加するものがあるため,TCB中
のフィールドのオフセット値は変化する.offset.hを生成する場合でも,ター
ゲット依存部で用意する場合でも,拡張パッケージに対応するためには,この
ことを考慮する必要がある.
2.5.1 コンフィギュレータを用いる方法
コンフィギュレータのパス1で生成するcfg1_out.cをコンパイルして生成したオ
ブジェクトファイルから,コンフィギュレータによってoffset.hを生成する方
法である.この方法を用いるためには,ターゲット依存部でオフセットファイ
ル生成用テンプレートファイルを用意し,target_cfg1_out.h(または,そこか
らインクルードされるファイル)とtarget_def.csv(または,同等の役割を持
つファイル)に記述を追加する必要がある.なお,これらのファイルを新たに
用意した際や修正した際には,offset.hに妥当な定義が生成されていることを
確認すべきである.
オフセットファイル生成用テンプレートファイルは,ターゲット依存部で,
target_offset.tf(または,プロセッサ依存部やチップ依存部で用意するそれ
に代わるファイル)に用意する.また,Makefileのターゲット依存部で,次の
例のように,OFFSET_TFにオフセットファイル生成用テンプレートファイルのファ
イル名を定義する.
----------------------------------------
# オフセットファイル生成のための定義
OFFSET_TF = $(TARGETDIR)/target_offset.tf
----------------------------------------
オフセットファイル生成用テンプレートファイルには,以下の内容を記述する.
(1) 標準テンプレートファイルのインクルード
オフセットファイル生成用の標準テンプレートファイル(kernel/genoffset.tf)
をインクルードする.標準テンプレートファイルには,以下で用いるDEFINE関
数やDEFINE_BIT関数の定義などが含まれている.
----------------------------------------
$ 標準テンプレートファイルのインクルード
$INCLUDE "kernel/genoffset.tf"$
----------------------------------------
(2) オフセット値のマクロ定義の生成
DEFINE関数を用いて,オフセット値のマクロ定義を生成する.例えば,TCB中の
タスクコンテキストブロック(tskctxb)に含まれるpcフィールドのオフセット
値を,TCB_pcにマクロ定義する場合には,次のように記述する.
----------------------------------------
$ オフセット値のマクロ定義の生成
$DEFINE("TCB_pc", offsetof_TCB_pc)$
----------------------------------------
ここで,DEFINE関数の第1パラメータはマクロ定義するシンボル,第2パラメー
タは,オフセット値を保持するコンフィギュレータの変数である.
また,コンフィギュレータが,オフセット値を保持する変数(上の例では
offsetof_TCB_pc)に値を設定するために,target_def.csv(または,同等の役
割を持つファイル)に次の例のような行を追加する.
----------------------------------------
offsetof_TCB_pc,"offsetof(TCB,tskctxb.pc)"
----------------------------------------
ただし,各オブジェクトの初期化ブロックのターゲット非依存のフィールドの
オフセット値を取得するための記述は,kernel/kernel_def.csvに含まれている.
kernel/kernel_def.csvに含まれている記述は,target_def.csv(または,同等
の役割を持つファイル)に追加する必要はない.
(3) ビットオフセット値等のマクロ定義の生成
DEFINE_BIT関数を用いて,ビットのオフセット値,ビット位置,ビットマスク
のマクロ定義を生成する.例えば,TCB中のenatexフィールドのオフセット値,
ビット位置,ビットマスクを,それぞれTCB_enatex,TCB_enatex_bit,
TCB_enatex_maskにマクロ定義する場合には,次のように記述する.
----------------------------------------
$DEFINE_BIT("TCB_enatex", sizeof_TCB, "B")$
----------------------------------------
ここで,DEFINE_BIT関数の第1パラメータはマクロ定義するシンボル(の先頭部
分),第2パラメータは構造体のサイズである.第3パラメータには,ビットの
オフセット,ビット位置,ビットマスクを,8ビット単位(バイト単位)で求め
る場合には"B"を,16ビット単位で求める場合には"H"を,32ビット単位で求め
る場合には"W"を指定する.なお,ビット位置は,LSBを0とした値(ビットリト
ルエンディアンを想定)を求める.
また,target_cfg1_out.h(または,そこからインクルードされるファイル)に,
ビットオフセット値等を求めるための構造体の変数定義を追加する.この構造
体の変数は,名称をマクロ定義するシンボル(DEFINE_BIT関数の第1パラメータ)
とし,対象のビットのみが1で,他のすべてのビットが0になるように初期化す
る.また,const修飾子を付加する.例えば,TCB中のenatexフィールドのビッ
トオフセット値等を求める場合には,次のような定義を追加する(tskctxbの初
期値は,ターゲット依存なので注意すること).
----------------------------------------
const TCB TCB_enatex = {
{ NULL, NULL }, /* task_queue */
NULL, /* p_tinib */
0U, /* tstat */
#ifdef TOPPERS_SUPPORT_MUTEX
0U, /* bpriority */
#endif /* TOPPERS_SUPPORT_MUTEX */
0U, /* priority */
false, /* acqeue */
false, /* wupque */
true, /* enatex */
0U, /* texptn */
NULL, /* p_winifo */
#ifdef TOPPERS_SUPPORT_MUTEX
{ NULL, NULL }, /* mutex_queue */
#endif /* TOPPERS_SUPPORT_MUTEX */
#ifdef TOPPERS_SUPPORT_OVRTIM
0U, /* leftotm */
#endif /* TOPPERS_SUPPORT_OVRTIM */
{ NULL, NULL } /* tskctxb */
};
----------------------------------------
さらに,コンフィギュレータが,構造体のサイズ(上の例ではsizeof_TCB)に
値を設定するために,target_def.csv(または,同等の役割を持つファイル)
に次の例のような行を追加する.
----------------------------------------
sizeof_TCB,sizeof(TCB)
----------------------------------------
ただし,前述した通り,kernel/kernel_def.csvに含まれている記述は,
target_def.csv(または,同等の役割を持つファイル)に追加する必要はない.
最後に,target_cfg1_out.h(または,そこからインクルードされるファイル)
に,offset.hを生成する仕組みが正しく動作していることを確認するための次
の記述を追加する.
----------------------------------------
const uint8_t MAGIC_1 = 0x12;
const uint16_t MAGIC_2 = 0x1234;
const uint32_t MAGIC_4 = 0x12345678;
----------------------------------------
2.5.2 makeoffset.cとgenoffsetを用いる方法
makeoffset.cは,どのオフセット値をoffset.hに生成するかを指定するファイ
ルで,ターゲット依存部で用意する.genoffsetは,makeoffset.cをコンパイル
して得られるアセンブリソースファイルから,offset.hを生成するスクリプト
である.genoffsetは,GNU開発環境にのみ対応している.
makeoffset.cを記述する場合には,既存のターゲット依存部に含まれる
makeoffset.cを修正するのが近道である.標準的なmakeoffset.cは,以下の6つ
の部分で構成されている.なお,makeoffset.cを新たに記述した際には,
offset.hに妥当な定義が生成されていることを確認すべきである.
(1) 必要なファイルのインクルード
オフセット値を求めたいフィールドを含む構造体を定義するヘッダファイルを
インクルードする.TCB中のフィールドのオフセット値を求めたい場合には,以
下の3行を含めればよい.
#include "kernel_impl.h"
#include "task.h"
#include "sil.h"
(2) オフセット値出力用マクロの定義
構造体中のフィールドのオフセット値の定義を生成するために用いるマクロ
(OFFSET_DEFとOFFSET_DEF2)の定義.これらのマクロの定義は,修正する必要
がない.
(3) オフセット値出力用関数の定義
構造体中のフィールドのオフセット値の定義を生成するための関数
(makeoffset)の定義.オフセット値のマクロ定義を生成したいフィールド毎
に,次のいずれかのマクロを記述する.
(2-5-2-1) OFFSET_DEF(TYPE, FIELD)
TYPEに構造体のデータ型名,FIELDにその構造体中のフィールドを指定すると,
TYPE_FIELDという名前のシンボルに,そのフィールドのオフセット値をマクロ
定義する記述を生成する.
(2-5-2-2) OFFSET_DEF2(TYPE, FIELD, FIELDNAME)
TYPEに構造体のデータ型名,FIELDにその構造体中のフィールドを指定すると,
TYPE_FIELDNAMEという名前のシンボルに,そのフィールドのオフセット値をマ
クロ定義する記述を生成する.構造体に含まれる構造体中のフィールドのオフ
セット値を求めたい場合には,こちらのマクロを使用する.
(4) エンディアンを参照するための関数の定義
SILで定義されたエンディアンを参照するための関数(sil_endian)の定義.こ
の関数の定義は,修正する必要がない.
(5) ビットオフセット値出力のための参照定義
初期値を持った変数定義に対して,コンパイラが生成するアセンブリ命令を参
照するための変数(BIT_REF_4,BIT_REF_2,BIT_REF_1)の定義.これらの定義
は,ほとんどの場合に修正する必要がない.ただし,uint8_t型のサポートされ
ていないターゲットでは,BIT_REF_1の定義は削除する必要がある.また,ポイ
ンタが64ビットのターゲット等では,BIT_REF_8の定義を追加しなければならな
いと思われる.
(6) ビットオフセット値出力用変数の定義
ビットのオフセット値,ビット位置,ビットマスクの定義を生成するためのデー
タ型の定義.これらの定義を生成したいビットフィールド毎に,以下の説明す
る変数を定義する.
構造体のデータ型名がTYPE,その構造体中のビットフィールド名がFIELDの場合
に,データ型がTYPEで,変数名がBIT_xy_TYPE_FIELDの変数を定義する.また,
その変数を,対象のビットのみが1で,他のすべてのビットが0になるように初
期化する.ここで,xはエンディアンを指定する文字で,B(ビッグエンディア
ン)またはL(リトルエンディアン)を指定する.またyには,ビットのオフセッ
ト,ビット位置,ビットマスクを,8ビット単位(バイト単位)で求める場合に
はBを,16ビット単位で求める場合にはHを,32ビット単位で求める場合にはWを
指定する.
これにより,TYPE_FIELDという名前のシンボルにそのビットのオフセット,
TYPE_FIELD_bitという名前のシンボルにビット位置,TYPE_FIELD_maskという名
前のシンボルにビットマスクをマクロ定義する記述を生成する.なお,ビット
位置は,LSBを0とした値(ビットリトルエンディアンを想定)を求める.
2.6 リンク方法の設定
(2-6-1) LDSCRIPT リンカスクリプトのファイル名
開発環境に標準のリンカスクリプトが使用できない場合には,ターゲット依存
部でリンカスクリプトを用意し,そのファイル名をこの変数に定義する.
(2-6-2) TEXT_START_ADDRESS テキストセクションの先頭番地
(2-6-3) DATA_START_ADDRESS データセクションの先頭番地
各セクションの先頭番地の指定が必要な場合には,これらの変数に先頭番地を
定義する.
(2-6-4) START_OBJS 先頭にリンクすべきモジュール名
(2-6-5) END_OBJS 最後にリンクすべきモジュール名
ターゲットによっては,ロードモジュールの先頭と最後にリンクすべきモジュー
ルを,ターゲット依存部で用意する必要がある.多くの場合,スタートアップ
モジュールをロードモジュールの先頭にリンクする必要がある.
ロードモジュールの先頭にリンクすべきプログラムがある場合には,Makefile
のターゲット依存部において,そのオブジェクトファイル名をSTART_OBJSに定
義し,それに対するコンパイルルールと依存関係作成ルールを定義する.ロー
ドモジュールの最後にリンクすべきモジュールがある場合には,そのオブジェ
クトファイル名をEND_OBJSに定義し,それに対するコンパイルルールと依存関
係作成ルールを定義する.また,標準のスタートアップモジュール(crt0.o)
をリンクしないように,LDFLAGSに-nostdlibを追加する必要がある.さら
に,-nostdlibをつけることで標準ライブラリがリンクされなくなるため,
LIBSに-lgccを追加しなければならない.
例えば,スタートアップモジュールのソースファイルがstart.Sの場合には,
Makefileのターゲット依存部に次のような記述を入れるとよい.
----------------------------------------
# スタートアップモジュールのオブジェクトファイル名
START_OBJS = start.o
# スタートアップモジュールのコンパイルルール
$(START_OBJS): %.o: %.S
$(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
# スタートアップモジュールの依存関係作成ルール
$(START_OBJS:.o=.d): %.d: %.S
@$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
-O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
# リンカに対するオプション
LDFLAGS := -nostdlib $(LDFLAGS)
LIBS := $(LIBS) -lgcc
----------------------------------------
また,GNU開発環境で,コンパイラに標準のcrtbegin.oとcrtend.oを用いる場合
には,Makefile のターゲット依存部に次のような記述を入れるとよい.
----------------------------------------
# オブジェクトファイル名
START_OBJS = $(shell $(CC) -print-file-name=crtbegin.o)
END_OBJS = $(shell $(CC) -print-file-name=crtend.o)
# 依存関係作成ルール
$(START_OBJS:.o=.d): %.d:
$(END_OBJS:.o=.d): %.d:
# リンカに対するオプション
LDFLAGS := -nostdlib $(LDFLAGS)
LIBS := $(LIBS) -lgcc
----------------------------------------
この場合,これらのファイルをコンパイルすることはないため,コンパイルルー
ルは不要である.また,依存関係作成ルールはダミーでよい(依存関係作成ルー
ルがないとエラーになる).
(2-6-6) HIDDEN_OBJS 指定しなくてもリンクされるモジュール名
ロードモジュールにリンクすべきモジュールを,リンカに対するパラメータで
はなく,リンカスクリプト中に(例えば,GNU開発環境のリンカスクリプトの
STARTUPを使って)記述する場合には,そのオブジェクトファイル名を,
(START_OBJSまたはEND_OBJSではなく)HIDDEN_OBJSに定義し,それに対するコ
ンパイルルールと依存関係作成ルールを定義する.HIDDEN_OBJSに定義したモ
ジュールは,リンカに対するパラメータからは除外される.LIBSとLDFLAGSにつ
いては,START_OBJSまたはEND_OBJSを用いる場合と同様である.
例えば,スタートアップモジュールのソースファイルがstart.Sで,start.oを
リンクすることをリンカスクリプト中に記述する場合には,Makefileのターゲッ
ト依存部に次のような記述を入れるとよい.
----------------------------------------
# スタートアップモジュールのオブジェクトファイル名
HIDDEN_OBJS = start.o
# スタートアップモジュールのコンパイルルール
$(HIDDEN_OBJS): %.o: %.S
$(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
# スタートアップモジュールの依存関係作成ルール
$(HIDDEN_OBJS:.o=.d): %.d: %.S
@$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
-O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
# リンカに対するオプション
LDFLAGS := -nostdlib $(LDFLAGS)
LIBS := $(LIBS) -lgcc
----------------------------------------
2.7 依存関係の定義
コンフィギュレータの各パスに対して,ターゲット依存のファイルへの依存関
係を定義する.具体的には,パス1,パス2,パス3が依存するファイルを,それ
ぞれcfg1_out.c,kernel_cfg.timestamp,$(OBJFILE)に対する依存関係の形で
記述する.
ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
下の記述を含める必要がある.
----------------------------------------
cfg1_out.c: $(TARGETDIR)/target_def.csv
kernel_cfg.timestamp: $(TARGETDIR)/target.tf
$(OBJFILE): $(TARGETDIR)/target_check.tf
----------------------------------------
2.8 その他の設定
(2-8-1) CLEAN_FILES cleanにより削除するファイル名
cleanにより削除するファイルをターゲット依存部で追加したい場合には,ファ
イル名をこの変数に追加定義する.
(2-8-2) REALCLEAN_FILES realcleanにより削除するファイル名
realcleanにより削除するファイルをターゲット依存部で追加したい場合には,
ファイル名をこの変数に追加定義する.
3.TOPPERS共通定義のターゲット依存部
TOPPERS共通定義(t_stddef.h)のターゲット依存部は,target_stddef.hまた
はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存
部で用意されるヘッダファイルなど)に含める.
3.1 ターゲット識別マクロ
アプリケーションやシステムサービスでターゲットを識別するために,
"TOPPERS_"にシステム略称を大文字にした文字列を連結したもの(例えば,
"TOPPERS_DVE68K")をマクロ定義する.
また,ターゲット依存部からプロセッサ依存部やチップ依存部を切り分けた場
合には,"TOPPERS_"に依存部略称を大文字にした文字列を連結したもの(例え
ば,"TOPPERS_M68K")をマクロ定義する.
3.2 整数型の最大値・最小値・ビット数
(3-2-1) INT_MAX intに格納できる最大値(C90準拠)
(3-2-2) INT_MIN intに格納できる最小値(C90準拠)
(3-2-3) UINT_MAX unsigned intに格納できる最大値(C90準拠)
(3-2-4) LONG_MAX longに格納できる最大値(C90準拠)
(3-2-5) LONG_MIN longに格納できる最小値(C90準拠)
(3-2-6) ULONG_MAX unsigned longに格納できる最大値(C90準拠)
(3-2-7) CHAR_BIT char型のビット数(C90準拠)
整数型の最大値・最小値・ビット数を,これらのシンボルにマクロに定義する.
これらのマクロは,C90に準拠したものである.開発環境にC90に準拠した
limits.hが用意されている場合には,これらのマクロを定義することに代えて,
limits.hをインクルードすればよい.
3.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ
(3-3-1) int8_t 符号付き8ビット整数(オプション,C99準拠)
(3-3-2) uint8_t 符号無し8ビット整数(オプション,C99準拠)
(3-3-3) int16_t 符号付き16ビット整数(C99準拠)
(3-3-4) uint16_t 符号無し16ビット整数(C99準拠)
(3-3-5) int32_t 符号付き32ビット整数(C99準拠)
(3-3-6) uint32_t 符号無し32ビット整数(C99準拠)
(3-3-7) int64_t 符号付き64ビット整数(オプション,C99準拠)
(3-3-8) uint64_t 符号無し64ビット整数(オプション,C99準拠)
(3-3-9) int128_t 符号付き128ビット整数(オプション,C99準拠)
(3-3-10) uint128_t 符号無し128ビット整数(オプション,C99準拠)
(3-3-11) int_least8_t 8ビット以上の符号付き整数(C99準拠)
(3-3-12) uint_least8_t 8ビット以上の符号無し整数(C99準拠)
(3-3-13) intptr_t ポインタを格納できるサイズの符号付き整数(C99準拠)
(3-3-14) uintptr_t ポインタを格納できるサイズの符号無し整数(C99準拠)
(3-3-15) INT8_MAX int8_tに格納できる最大値(オプション,C99準拠)
(3-3-16) INT8_MIN int8_tに格納できる最小値(オプション,C99準拠)
(3-3-17) UINT8_MAX uint8_tに格納できる最大値(オプション,C99準拠)
(3-3-18) INT16_MAX int16_tに格納できる最大値(C99準拠)
(3-3-19) INT16_MIN int16_tに格納できる最小値(C99準拠)
(3-3-20) UINT16_MAX uint16_tに格納できる最大値(C99準拠)
(3-3-21) INT32_MAX int32_tに格納できる最大値(C99準拠)
(3-3-22) INT32_MIN int32_tに格納できる最小値(C99準拠)
(3-3-23) UINT32_MAX uint32_tに格納できる最大値(C99準拠)
(3-3-24) INT64_MAX int64_tに格納できる最大値(オプション,C99準拠)
(3-3-25) INT64_MIN int64_tに格納できる最小値(オプション,C99準拠)
(3-3-26) UINT64_MAX uint64_tに格納できる最大値(オプション,C99準拠)
(3-3-27) INT128_MAX int128_tに格納できる最大値(オプション,C99準拠)
(3-3-28) INT128_MIN int128_tに格納できる最小値(オプション,C99準拠)
(3-3-29) UINT128_MAX uint128_tに格納できる最大値(オプション,C99準拠)
(3-3-30) INT_LEAST8_MAX int_least8_tに格納できる最大値(C99準拠)
(3-3-31) INT_LEAST8_MIN int_least8_tに格納できる最小値(C99準拠)
(3-3-32) UINT_LEAST8_MAX uint_least8_tに格納できる最大値(C99準拠)
(3-3-33) INT8_C(val) int_least8_t型の定数を作るマクロ(C99準拠)
(3-3-34) UINT8_C(val) uint_least8_t型の定数を作るマクロ(C99準拠)
(3-3-35) INT16_C(val) int16_t型の定数を作るマクロ(C99準拠)
(3-3-36) UINT16_C(val) uint16_t型の定数を作るマクロ(C99準拠)
(3-3-37) INT32_C(val) int32_t型の定数を作るマクロ(C99準拠)
(3-3-38) UINT32_C(val) uint32_t型の定数を作るマクロ(C99準拠)
(3-3-39) INT64_C(val) int64_t型の定数を作るマクロ(オプション,C99準拠)
(3-3-40) UINT64_C(val) uint64_t型の定数を作るマクロ(オプション,C99準拠)
(3-3-41) INT128_C(val) int128_t型の定数を作るマクロ(オプション,C99準拠)
(3-3-42) UINT128_C(val) uint128_t型の定数を作るマクロ(オプション,C99準拠)
指定されたサイズの整数型を,これらのシンボルに型定義する.また,データ
型に格納できる最大値・最小値と,整数定数を作るマクロを,これらのシンボ
ルにマクロ定義する.
これらのデータ型およびマクロは,C99に準拠したものである.開発環境にC99
に準拠したstdint.hが用意されている場合には,これらのデータ型およびマク
ロを定義することに代えて,stdint.hをインクルードすればよい.
上でオプションと記述したものは,該当するデータ型がコンパイラでサポート
されている場合にのみ定義することを示す.
3.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ
(3-4-1) float32_t IEEE754準拠の32ビット単精度浮動小数点数(オプ
ション)
(3-4-2) double64_t IEEE754準拠の64ビット倍精度浮動小数点数(オプ
ション)
(3-4-3) FLOAT32_MIN float32_tに格納できる最小の正規化された正の浮
動小数点数(オプション)
(3-4-4) FLOAT32_MAX float32_tに格納できる表現可能な最大の有限浮動
小数点数(オプション)
(3-4-5) DOUBLE64_MIN double64_tに格納できる最小の正規化された正の浮
動小数点数(オプション)
(3-4-6) DOUBLE64_MAX double64_tに格納できる表現可能な最大の有限浮動
小数点数(オプション)
指定されたサイズ・表現形式の浮動小数点型を,これらのシンボルに型定義す
る.また,データ型に格納できる最大値・最小値を,これらのシンボルにマク
ロ定義する.
いずれも,該当するデータ型がコンパイラでサポートされている場合にのみ定
義する.
3.5 コンパイラの拡張機能のためのマクロ定義
コンパイラの拡張機能を用いるためのマクロとして,必要に応じて,以下のマ
クロの定義を含める.
(3-5-1) inline(オプション,デフォルトは未定義)
(3-5-2) Inline(オプション,デフォルトはstatic inline)
インライン関数であることを示す指定.Inlineは,コンパイル単位にローカル
なインライン関数であることを示す.