カーネルのメモリ管理の概要
カーネルのメモリ管理とSOLIDメモリマップの関係
カーネルが管理するメモリ領域とSOLID-IDEメモリマップデザイナで表示されるメモリ領域の関係を下図に示します。
各項目についての詳細は以下のとおりです。
カーネル内部で管理される領域
- 管理テーブル変数
タスクをはじめとするRTOS資源の管理テーブルとして使用される領域です。 アイドル状態 (実行可能なタスクが存在しない状態) にカーネルが使用するスタックもここに含まれます。 領域のサイズは資源の最大数によって変動します。
- リンカで割り当てられるセクション:
静的リンク領域 (
.bss
あるいは COMMON)- メモリマップデザイナで割り当てられる領域:
SOLID (
SOLID_CORE
属性)
各資源の最大数は
kernel_cfg.c
で静的に定義された資源の数と動的生成 (オプション) 資源の最大数の合計となります。 (静的および動的資源最大数の設定及び記述方法については カーネル起動パラメータの設定 を参照ください。)各資源1個あたりで必要となる管理テーブルのメモリサイズについては、参考資料として以下の表 (CSVファイル) が格納されていますので参照ください。
solid-os\rtos\toppers_asp3\info\table_footprint_resource_cb.csv
- カーネルメモリプール
カーネルの内部でメモリ領域を動的に確保する際に使用されます。 プール領域のサイズを変更する方法については カーネルメモリプールのサイズを変更するには を参照ください。
- リンカで割り当てられるセクション:
静的リンク領域 (
.bss
あるいはCOMMON)- メモリマップデザイナで割り当てられる領域:
SOLID (
SOLID_CORE
属性)
- 自動確保されるバッファ領域
RTOS資源に関してカーネル内部で管理領域を割り当てる必要がある場合、 カーネルメモリプールから引き当てられます。 カーネル内部で管理領域を割り当てる条件や割り当てられる領域のサイズは資源やサービスコールのパラメータ、
kernel_cfg.c
の設定により変動します。 目安となるメモリ容量について、参考資料として以下の表 (CSVファイル) が格納されていますので参照ください。solid-os\rtos\toppers_asp3\info\table_footprint_resource_heap.csv
- タスクスタック
各タスクが使用するスタック領域です。(タスク生成時のスタック先頭アドレスとしてユーザー変数のアドレスを渡した場合を除く)
- リンカで割り当てられるセクション:
(SOLIDで包括的に確保するため個別の指定なし)
- メモリマップデザイナで割り当てられる領域:
OSSTACK (
SOLID_RESERVE
属性)
カーネルメモリプールのサイズを変更するには
カーネルメモリプールのサイズを変更したい場合、以下のソースコードに定義されている定数 KMM_SIZE
を変更してアプリケーションをビルドしてください。
修正するファイル: solid-os\rtos\toppers_asp3\asp3\config\kernel_cb_store.c
/*
* Memory Area Allocated by Kernel
*/
#define KMM_SIZE (4096/* perferred stack size */ * 16)
static MB_T _kernel_memory[TOPPERS_COUNT_SZ(KMM_SIZE, sizeof(MB_T))];
const size_t _kernel_mpksz = TOPPERS_ROUND_SZ(KMM_SIZE, sizeof(MB_T));
MB_T *const _kernel_mpk = _kernel_memory;