ミューテックス¶
API¶
ミューテックス関連のAPIの定義は、 solid_mutex.h にあります。
#include "solid_mutex.h"
SOLID_MUTEX_DisInt¶
-
void SOLID_MUTEX_DisInt(void)¶
IRQ割り込みを禁止します。
SOLID_MUTEX_EnaInt¶
-
void SOLID_MUTEX_EnaInt(void)¶
IRQ割り込みを許可します。
SOLID_MUTEX_PushInt¶
-
SOLID_REGISTER SOLID_MUTEX_PushInt(void)¶
IRQ割り込みを禁止にします。
この関数は割り込み禁止の処理のネストを許可するため、現在の状態を返り値として 戻します。
SOLID_MUTEX_PopIntと対にして使用してください。- 戻り値:
現在の状態(CPSR(AArch32), PSTATE(AArch64))
SOLID_MUTEX_PopInt¶
-
void SOLID_MUTEX_PopInt(SOLID_REGISTER status)¶
statusが割り込み許可状態だった場合、IRQ割り込みを許可します。
SOLID_MUTEX_PushIntと対にして使用してください。- パラメータ:
status --
SOLID_MUTEX_PushIntの返り値
SOLID_MUTEX_DisFIQ¶
-
void SOLID_MUTEX_DisFIQ(void)¶
FIQ割り込みを禁止します。
SOLID_MUTEX_EnaFIQ¶
-
void SOLID_MUTEX_EnaFIQ(void)¶
FIQ割り込みを許可します。
SOLID_MUTEX_CanInt¶
-
int SOLID_MUTEX_CanInt(void)¶
IRQ割り込みが許可されている状態かどうかを確認します。
- 戻り値:
0以外: 許可状態
0: 禁止状態
SOLID_CRITICALSECTION_T¶
-
typedef struct _SOLID_CRITICALSECTION_T SOLID_CRITICALSECTION_T¶
-
struct _SOLID_CRITICALSECTION_T¶
説明
クリティカルセクション用構造体
構造体のメンバ構成はビルド構成によって異なります。下記はSMP構成時の定義で、 非SMP構成では
SOLID_REGISTER statusとuint32_t countのみとなります。 いずれもコアサービスが内部的に使用するため、ユーザが直接メンバを操作する必要は ありません。定義
/* SMP構成時 */ typedef struct _SOLID_CRITICALSECTION_T { uint32_t lock; uint32_t count; SOLID_REGISTER status; void *reserved; } SOLID_CRITICALSECTION_T; /* 非SMP構成時 */ typedef struct _SOLID_CRITICALSECTION_T { SOLID_REGISTER status; uint32_t count; } SOLID_CRITICALSECTION_T;
メンバー
-
uint32_t lock¶
コアサービス内で使用: 占有CPU(SMP時のみ)
-
uint32_t count¶
コアサービス内で使用: ネスト回数(SMP時のみ)
-
SOLID_REGISTER status¶
コアサービス内で使用: ロック時の状態(CPSR)
-
void *reserved¶
コアサービス内で使用: 予約領域
-
uint32_t lock¶
SOLID_InitializeCriticalSection¶
-
int SOLID_InitializeCriticalSection(SOLID_CRITICALSECTION_T *t)¶
クリティカルセクション用変数を初期化します。
- パラメータ:
t -- 初期化する変数へのアドレス
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
SOLID_EnterCriticalSection¶
-
int SOLID_EnterCriticalSection(SOLID_CRITICALSECTION_T *t)¶
クリティカルセクションに入ります。
他のコンテキストがクリティカルセクションに入っている場合、開放されるまで 待ち状態になります。
排他制御が必要な処理が終了したら、すぐに
SOLID_LeaveCriticalSectionを呼んで クリティカルセクションを開放してください。- パラメータ:
t -- クリティカルセクション用変数へのアドレス
- 戻り値:
SOLID_ERR_OK: クリティカルセクションに入った。それ以外: エラー
SOLID_TryEnterCriticalSection¶
-
int SOLID_TryEnterCriticalSection(SOLID_CRITICALSECTION_T *t)¶
クリティカルセクションに入ります。
他のコンテキストがクリティカルセクションに入っている場合、クリティカルセクション に入らず即時戻ります。
排他制御が必要な処理が終了したら、すぐに
SOLID_LeaveCriticalSectionを呼んで クリティカルセクションを開放してください。- パラメータ:
t -- クリティカルセクション用変数へのアドレス
- 戻り値:
SOLID_ERR_OK: クリティカルセクションに入った。SOLID_ERR_BUSY: 他のコンテキストがクリティカルセクションに入っている。それ以外: エラー
SOLID_LeaveCriticalSection¶
-
int SOLID_LeaveCriticalSection(SOLID_CRITICALSECTION_T *t)¶
クリティカルセクションを開放します。
- パラメータ:
t -- クリティカルセクション用変数へのアドレス
- 戻り値:
SOLID_ERR_OK: クリティカルセクションを開放した。SOLID_ERR_NOTUSED: クリティカルセクションに入っていない。それ以外: エラー
SOLID_ATOMIC_CAW32¶
-
int SOLID_ATOMIC_CAW32(uint32_t *pVal, uint32_t oldVal, uint32_t newVal)¶
32bitのCompare and Swapをアトミックに行います。
*pValがoldValと一致する場合のみnewValを書き込みます。- パラメータ:
pVal -- 対象の32bit変数へのポインタ
oldVal -- 比較する値
newVal -- 一致した場合に書き込む値
- 戻り値:
0: 書き込み成功
0以外: 書き込み失敗(値が一致しなかった、または競合した)
SOLID_ATOMIC_OR32¶
-
void SOLID_ATOMIC_OR32(uint32_t *pVal, uint32_t mask)¶
32bit変数に対して
maskとのビットORをアトミックに行います。- パラメータ:
pVal -- 対象の32bit変数へのポインタ
mask -- ORするビットマスク
SOLID_ATOMIC_AND32¶
-
void SOLID_ATOMIC_AND32(uint32_t *pVal, uint32_t mask)¶
32bit変数に対して
maskとのビットANDをアトミックに行います。- パラメータ:
pVal -- 対象の32bit変数へのポインタ
mask -- ANDするビットマスク
SOLID_ATOMIC_CLR32¶
-
uint32_t SOLID_ATOMIC_CLR32(uint32_t *pVal)¶
32bit変数を0クリアし、クリア前の値を返します。この操作はアトミックに行われます。
- パラメータ:
pVal -- 対象の32bit変数へのポインタ
- 戻り値:
クリア前の値