μT-Kernel/SMの機能

この章では、μT-Kernel/SM(System Manager)で提供している機能の詳細について説明を行う。

注意全般的な注意・補足事項
 

  • μT-Kernel/SMの仕様で定義されているAPIには、tk_~の名称を持つものと、それ以外の名称を持つものがある。tk_~の名称を持つAPIは、サブシステム管理機能の拡張SVCを使って実装することを想定したAPIであり、それ以外の名称を持つAPIは、ライブラリ関数(インライン関数を含む)またはC言語のマクロで実装することを想定したAPIである。ただし、μT-Kernelの仕様でこれらのAPIの実装方法を規定しているわけではなく、別の実装方法を使っても構わない。また、ライブラリまたはマクロであっても、間接的に拡張SVCやシステムコールを呼び出す場合がある。

  • 常に発生する可能性のあるエラー E_PAR, E_MACV, E_NOMEM などは、特に説明を必要とする場合以外は省略している。

  • μT-Kernel/SM APIは、特に明記されているものを除き、タスク独立部およびディスパッチ禁止中・割込み禁止中状態から呼び出すことはできない(E_CTX)。

  • μT-Kernel/SM APIは、特に明記されているものを除き、μT-Kernel/OSのシステムコールの呼出可能な保護レベルより低い保護レベル(TSVCLimit より低い保護レベル)から呼び出すことはできない(E_OACV)。

  • μT-Kernel/SM APIは、特に明記されているものを除き、再入可能(reentrant)である。ただし、内部で排他制御を行っている場合がある。

システムメモリ管理機能

システムメモリ管理機能は、μT-Kernelが動的に割り当てるすべてのメモリ(システムメモリ)を管理するための機能である。μT-Kernel内部で使用しているメモリやタスクのスタック、メッセージバッファ、メモリプールなどもここから割り当てる。

システムメモリ管理機能は、システムメモリを細分化して管理するメモリ割当てライブラリからなる。

システムメモリ管理機能は、μT-Kernelの内部で利用するほか、アプリケーションやサブシステム、デバイスドライバなどからも利用可能である。

メモリ割当てライブラリ

メモリ割当てライブラリは、C言語標準ライブラリの malloccallocreallocfree と同等の機能が提供される。

これらのメモリは、すべて TSVCLimit で指定された保護レベルのメモリとして割り当てられる。

Kmalloc - メモリの割当て

C言語インタフェース

#include <tk/tkernel.h>

void* Kmalloc(size_t size);

パラメータ

size_t size Size割り当てるメモリサイズ(バイト数)

リターンパラメータ

void* addr Memory Start Address割り当てたメモリの先頭アドレス

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_MEMLIB メモリ割当てライブラリのサポート

解説

size で指定したバイト数のメモリを割り当て、その先頭アドレスを addr に返す。

指定したサイズのメモリの割当てができなかった場合や、size に0が指定された場合は、addrNULL が返る。

Kmalloc を含むメモリ割当てライブラリのAPIは、タスク独立部およびディスパッチ禁止中、割込み禁止中に呼び出すことはできない。呼び出した場合の動作は、システムダウンの可能性も含めて不定であり、呼出時の状態を保証するのは、呼出側の責任である。

補足事項

size には任意の値を指定できるが、管理領域の確保や、割り当てるメモリアドレスのアラインメントの調整といった理由により、内部的には、size で指定したバイト数よりも大きなメモリが割り当てられる場合がある。たとえば、割当て可能なメモリサイズの最低が16バイトで、アラインメントが8バイト単位という実装の場合には、size に16バイト未満の値を指定した場合でも、内部的には16バイトのメモリが割り当てられる。また、size に20バイトの値を指定した場合でも、内部的には24バイトのメモリが割り当てられる。

Kcalloc - メモリの割当てとクリア

C言語インタフェース

#include <tk/tkernel.h>

void* Kcalloc(size_t nmemb, size_t size);

パラメータ

size_t nmemb Number of Memory Blocks割り当てるメモリブロックの個数
size_t size Size割り当てるメモリブロックのサイズ(バイト数)

リターンパラメータ

void* addr Memory Start Address割り当てたメモリの先頭アドレス

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_MEMLIB メモリ割当てライブラリのサポート

解説

size で指定したバイト数のメモリブロックを、nmemb で指定された個数だけ連続して割り当て、0クリアしてから、その先頭アドレスを addr に返す。メモリ割当ての動作は、sizenmemb を乗じたバイト数のメモリブロック1個を割り当てるのと同じである。

指定した個数のメモリブロックの割当てができなかった場合や、nmemb または size に0が指定された場合は、addrNULL が返る。

Kcalloc を含むメモリ割当てライブラリのAPIは、タスク独立部およびディスパッチ禁止中、割込み禁止中に呼び出すことはできない。呼び出した場合の動作は、システムダウンの可能性も含めて不定であり、呼出時の状態を保証するのは、呼出側の責任である。

補足事項

内部的には、sizenmemb を乗じたバイト数よりも大きなメモリが割り当てられる場合がある。詳細は Kmalloc の補足事項を参照のこと。

Krealloc - メモリの再割当て

C言語インタフェース

#include <tk/tkernel.h>

void* Krealloc(void *ptr, size_t size);

パラメータ

void* ptr Pointer to Memory再割当て対象のメモリアドレス
size_t size Size再割当て後のメモリサイズ(バイト数)

リターンパラメータ

void* addr Memory Start Address再割当てされたメモリの先頭アドレス

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_MEMLIB メモリ割当てライブラリのサポート

解説

ptr で指定した割当て済のメモリのサイズを、size で指定されたサイズに変更する。その際にメモリの再割当てを行い、再割当て後のメモリの先頭アドレスを addr に返す。

サイズ変更をともなうメモリの再割当てにより、一般にはメモリの先頭アドレスが移動し、addrptr と異なった値になる。ただし、その場合でも、再割当ての対象となったメモリの内容は保存される。このため、Krealloc の処理の中でメモリ内容のコピーを行う。また、再割当てにより不要になったメモリは解放される。

ptr には、KmallocKcallocKrealloc で割り当てられたメモリの先頭アドレスを指定する必要がある。ptr の正当性は呼出側で保証しなければならない。

ptrNULL を指定した場合は、新しいメモリの割当てのみを行う。この場合の動作は Kmalloc と同一である。

指定したサイズのメモリの再割当てができなかった場合や、size に0が指定された場合は、addrNULL が返る。このとき、ptrNULL 以外が指定されていれば、ptr のメモリの解放だけを行う。この場合の動作は Kfree と同一である。

Krealloc を含むメモリ割当てライブラリのAPIは、タスク独立部およびディスパッチ禁止中、割込み禁止中に呼び出すことはできない。呼び出した場合の動作は、システムダウンの可能性も含めて不定であり、呼出時の状態を保証するのは、呼出側の責任である。

補足事項

再割当てによりメモリサイズが小さくなる場合や、ptr で指定されるメモリの周辺に未割当てのメモリが残っている場合など、状況によっては、addr に返るメモリアドレスが ptr と同一となることがある。

内部的には、sizeで指定したバイト数よりも大きなメモリが割り当てられる場合がある。詳細は Kmalloc の補足事項を参照のこと。

Kfree - メモリの解放

C言語インタフェース

#include <tk/tkernel.h>

void Kfree(void *ptr);

パラメータ

void* ptr Pointer to Memory解放するメモリの先頭アドレス

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_MEMLIB メモリ割当てライブラリのサポート

解説

ptr で指定したメモリを解放する。

ptr には、KmallocKcallocKrealloc で割り当てられたメモリの先頭アドレスを指定する必要がある。ptr の正当性は呼出側で保証しなければならない。

Kfree を含むメモリ割当てライブラリのAPIは、タスク独立部およびディスパッチ禁止中、割込み禁止中に呼び出すことはできない。呼び出した場合の動作は、システムダウンの可能性も含めて不定であり、呼出時の状態を保証するのは、呼出側の責任である。