ミューテックス

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 と対にして使用してください。

パラメータ:

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 statusuint32_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

コアサービス内で使用: 予約領域

SOLID_InitializeCriticalSection

int SOLID_InitializeCriticalSection(SOLID_CRITICALSECTION_T *t)

クリティカルセクション用変数を初期化します。

パラメータ:
  • t -- 初期化する変数へのアドレス

戻り値:

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をアトミックに行います。

*pValoldVal と一致する場合のみ 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変数へのポインタ

戻り値:

クリア前の値