10.145 __strex コンパイラ組み込み関数

__strex コンパイラ組み込み関数を使用すると、C または C++ コードの STREX[size] 命令を使用して、データをメモリにストアできます。

このコンパイラ組み込み関数の使用は廃止される予定です。

コンパイラでは、排他的モニタの状態を保持することを保証しません。コンパイラは、__ldrex 組み込み関数のために生成された LDREX 命令と、__strex 組み込み関数のために生成された STREX 命令の間に、ロード命令とストア命令を生成する可能性があります。メモリアクセスにより、排他的モニタがクリアされることがあるため、__ldrex__strex 組み込み関数を使用するコードは、予期しない動作をする可能性があります。LDREXSTREX 命令が必要である場合、組み込みアセンブリを使用することをお勧めします。

構文

int __strex(unsigned int val, volatile void *ptr)
各項目には以下の意味があります。
val
メモリに書き込む値を指定します。
ptr
メモリに書き込まれるデータのアドレスを指します。書き込まれるデータのサイズを指定するには、パラメータを適切な整数型にキャストします。

表 10-11 __strex コンパイラ組み込み関数がサポートするアクセス幅

命令 ストアされたデータのサイズ ポインタ型
STREXB バイト char *
STREXH ハーフワード short *
STREX ワード int *

戻り値

__strex コンパイラ組み込み関数は、以下を返します。
0
STREX 命令が正しく実行された場合
1
STREX 命令がロックアウトされた場合

エラー

STREX 命令をサポートしないターゲット向けにコンパイルされる場合、コンパイラは __strex コンパイラ組み込み関数を認識しません。使用されたソース言語に応じて、コンパイラは、警告またはエラーを生成します。
  • C コード:警告:#223-D:関数 "__strex" が暗黙に宣言されています
  • C++ コード:エラー:#20:識別子 "__strex" が定義されていません
__strex コンパイラ組み込み関数は、ダブルワードデータへのアクセスをサポートしません。サポートされないアクセス幅を指定すると、コンパイラによってエラーが生成されます。

int foo(void)
{
    int loc=0xff;
    return(!__strex(0x20, (volatile char *)loc));
}
コマンドラインオプション --cpu=6k を使用してこのコードをコンパイルすると、以下のコードが生成されます。
||foo|| PROC
    MOV      r0,#0xff
    MOV      r2,#0x20
    STREXB   r1,r2,[r0]
    CMP      r1,#0
    MOVEQ    r0,#1
    MOVNE    r0,#0
    BX       lr
    ENDP
関連する参考文書
10.123 __ldrex コンパイラ組み込み関数
10.124 __ldrexd コンパイラ組み込み関数
10.146 __strexd コンパイラ組み込み関数
関連情報
STREX
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.