SylixOS ARM BSP第三編【bspInit.c】
2671 ワード
このブログはSylixOS ARM BSPの連載第3編で、主にbspInitを紹介している.cファイルの具体的な実装.
bspInit.cはBSPオペレーティングシステムの初期化部分コードであり、通常startupによって初期化する.Sは、基本プロセッサのパラメータを初期化後に呼び出す、以下、S 3 C 2440 Aプロセッサを例に、ブロック毎にbspInitについて説明する.cコード.
SylixOS ARM BSP第2編でstartupに言及する.S初期化が完了すると、オペレーティングシステムを初期化し、マルチタスクスケジューリングを開始するbspInit()関数が呼び出されます.
コードで定義されているcKernelHeapとcSystemHeapはSylixOSカーネルスタックとシステムスタックのメモリ位置(cKernelHeapとcSystemHeap配列はクリアされる必要はありません)であり、ここでstatic char数字によって開拓されます.section(.noinit)中_section()はsys/compilerにプロトタイプされたマクロです.hで定義:
指定されたセグメントに定義されたオブジェクトを配置することを示します.section(.noinit)は、cKernelHeapとcSystemHeapの配列が配置することを示す.noinitセグメント(指定されていない場合は.bssセグメント)は、アセンブリ内のSECTION()操作と同様です.
.noinitセグメントはstartupでは必要ありません.Sには似ていません.bssセグメントは同様にクリアされるので、このような方法はシステムの起動時間を速めることができる.
halModeInit()はターゲットマシンモード初期化関数であり、現在は空の関数であり、ユーザーが自分のコードを追加する必要がある場合は、オペレーティングシステムの初期化前に呼び出されます.
DebugChannelInit()オペレーティングシステム内部ではbspDebugMsg()を内部デバッグ情報印刷インタフェースとして使用しており、debugChannelInit()はこの印刷インタフェースを初期化し、bspDebugMsg()関数は以降のbspLib.c博文で詳しく説明する.
API_KernelStartParam()はシステムカーネル関数で、オペレーティングシステムの起動パラメータを設定します.起動パラメータは文字列で、フォーマットは【パラメータ名=パラメータ値】です.複数のパラメータの間にスペースがあります.SylixOSで現在サポートされている起動パラメータは次のとおりです.
パラメータ名
デフォルト
説明
ncpus
1
CPU数、例えばシングルコアプロセッサncpus=1マルチコアプロセッサncpus=CPU数、注意:ncpusはLW_より大きくないCFG_MAX_PROCESSORS
dlog
no
OSがbspDebugMsg()関数でデバッグ情報を印刷できるかどうか、dlog=yesは許可、dlog=noは許可しない
derror
yes
オペレーティングシステムがbspDebugMsg()関数を通じてエラー情報を印刷することを許可するかどうか、パラメータはdlogと同じである.
kfpu
no
OSカーネルでハード浮動小数点演算器を使用できるかどうか、このパラメータはnoであることを強くお勧めします.
heapchk
yes
オペレーティングシステムがすべてのメモリスタック操作に対してメモリアクセス境界チェックを許可するかどうか、推奨パラメータはyes
varea
0xC0000000
システムの仮想メモリ空間の開始点を示す、仮想空間の配置は後のbspMapになる.h博文で詳しく説明する.
vsize
0x40000000
hz
100
hhz
100
irate
5
hpsec
1
(未完、続き)
転載先:http://hanhui03.blog.51cto.com
bspInit.cはBSPオペレーティングシステムの初期化部分コードであり、通常startupによって初期化する.Sは、基本プロセッサのパラメータを初期化後に呼び出す、以下、S 3 C 2440 Aプロセッサを例に、ブロック毎にbspInitについて説明する.cコード.
SylixOS ARM BSP第2編でstartupに言及する.S初期化が完了すると、オペレーティングシステムを初期化し、マルチタスクスケジューリングを開始するbspInit()関数が呼び出されます.
int bspInit (void)
{
static __section(.noinit) CHAR cKernelHeap[6 * LW_CFG_MB_SIZE];
static __section(.noinit) CHAR cSystemHeap[6 * LW_CFG_MB_SIZE];
halModeInit();
debugChannelInit(0);
API_KernelStartParam("ncpus=1 kdlog=no kderror=yes kfpu=no heapchk=yes");
API_KernelStart(usrStartup, cKernelHeap,sizeof(cKernelHeap),
cSystemHeap,sizeof(cSystemHeap));
return (-1);
}
コードで定義されているcKernelHeapとcSystemHeapはSylixOSカーネルスタックとシステムスタックのメモリ位置(cKernelHeapとcSystemHeap配列はクリアされる必要はありません)であり、ここでstatic char数字によって開拓されます.section(.noinit)中_section()はsys/compilerにプロトタイプされたマクロです.hで定義:
#ifdef BSD /* bsd system use __attribute__ ((__section__(S))) not #S,
so compiler bsd source MUST defined BSD */
# define __section(S) __attribute__ ((__section__(S)))
#else
# define __section(S) __attribute__ ((__section__(#S)))
#endif
指定されたセグメントに定義されたオブジェクトを配置することを示します.section(.noinit)は、cKernelHeapとcSystemHeapの配列が配置することを示す.noinitセグメント(指定されていない場合は.bssセグメント)は、アセンブリ内のSECTION()操作と同様です.
.noinitセグメントはstartupでは必要ありません.Sには似ていません.bssセグメントは同様にクリアされるので、このような方法はシステムの起動時間を速めることができる.
halModeInit()はターゲットマシンモード初期化関数であり、現在は空の関数であり、ユーザーが自分のコードを追加する必要がある場合は、オペレーティングシステムの初期化前に呼び出されます.
DebugChannelInit()オペレーティングシステム内部ではbspDebugMsg()を内部デバッグ情報印刷インタフェースとして使用しており、debugChannelInit()はこの印刷インタフェースを初期化し、bspDebugMsg()関数は以降のbspLib.c博文で詳しく説明する.
API_KernelStartParam()はシステムカーネル関数で、オペレーティングシステムの起動パラメータを設定します.起動パラメータは文字列で、フォーマットは【パラメータ名=パラメータ値】です.複数のパラメータの間にスペースがあります.SylixOSで現在サポートされている起動パラメータは次のとおりです.
パラメータ名
デフォルト
説明
ncpus
1
CPU数、例えばシングルコアプロセッサncpus=1マルチコアプロセッサncpus=CPU数、注意:ncpusはLW_より大きくないCFG_MAX_PROCESSORS
dlog
no
OSがbspDebugMsg()関数でデバッグ情報を印刷できるかどうか、dlog=yesは許可、dlog=noは許可しない
derror
yes
オペレーティングシステムがbspDebugMsg()関数を通じてエラー情報を印刷することを許可するかどうか、パラメータはdlogと同じである.
kfpu
no
OSカーネルでハード浮動小数点演算器を使用できるかどうか、このパラメータはnoであることを強くお勧めします.
heapchk
yes
オペレーティングシステムがすべてのメモリスタック操作に対してメモリアクセス境界チェックを許可するかどうか、推奨パラメータはyes
varea
0xC0000000
システムの仮想メモリ空間の開始点を示す、仮想空間の配置は後のbspMapになる.h博文で詳しく説明する.
vsize
0x40000000
hz
100
hhz
100
irate
5
hpsec
1
(未完、続き)
転載先:http://hanhui03.blog.51cto.com