4.7.39. __strex

此内在函数在编译器生成的指令流中插入 STREX{size} 格式的指令。 它允许在 C 或 C++ 代码中使用 STREX 指令将数据存储到内存中。

语法

          int __strex(unsigned int val, volatile void *ptr)
        

其中:

val

是要写入到内存中的值。

ptr

指向要写入到内存中的数据的地址。 要指定所写入的数据大小,请将参数类型转换为相应的整型。

Table 4.10. __strex 内在函数支持的访问宽度 

指令 加载的数据大小 C 类型转换
STREXB 无符号字节 ( char *)
STREXH 无符号半字 ( short int *)
STREX ( int *)

返回值

__strex 内在函数返回以下内容:

0

如果 STREX 指令执行成功

1

如果 STREX 指令已锁定。

错误

为不支持 STREX 指令的目标进行编译时,编译器无法识别 __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]

    RSBS     r0,r1,#1

    MOVCC    r0,#0

    BX       lr

ENDP

另请参阅

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0348AC
Non-Confidential