如何理解U-Boot中的__asm__ __volatile__("": : :"memory")?

首先看GCC是如何定义嵌入式汇编的

asm asm-qualifiers ( AssemblerTemplate
                : OutputOperands
                [ : InputOperands
                [ : Clobbers ] ])
  • asm:嵌入式汇编的关键字,但为了解决在有编译选项‘-std=gnu99’的情况下 ,asm关键字会无效的问题,实际都是使用__asm__。
  • asm-qualifiers:限定符,当是volatile(实际用__volatile__)时,表示不要对嵌入式汇编进行优化。
  • AssemblerTemplate:汇编模板,名称虽然很奇怪,但没有输入输出参数的情况下,其内容就是普通的汇编语句。例如下面的程序:
__asm__(    "mrc    p15, 0, r1, c1, c0, 0\n"    /* read ctrl register   */  
        "orr    r1, r1, #0xc0000000\n"      /* Asynchronous         */  
        "mcr    p15, 0, r1, c1, c0, 0\n"    /* write ctrl register  */  
        );

其中()里面所有的汇编语句都属于AssemblerTemplate的内容。但是,如果需要输入输出参数时,则%0表示第一个参数,%n表示第n个参数。

  • OutputOperands:表示嵌入式汇编的输出参数,和AssemblerTemplate中的%n想对应。
  • InputOperands:表示嵌入式汇编的输入参赛,和AssemblerTemplate中的%n想对应。
  • Clobbers :在嵌入式汇编的执行过程中,除了OutputOperands指定的参数会明确被改变之外,可能还会改变其他的一些寄存器或者内存。当Clobbers为"memory"时,表示告诉编译器,在嵌入式汇编执行的过程中,RAM可能被修改了,需要无效所有的Cache。

因此,__asm__ __volatile__("": : :"memory");其实就是个空嵌入式汇编语句,其中"memory"表示,告诉编译器内存的内容可能被更改了,需要无效所有Cache,并访问实际的内容,而不是Cache。

你可能感兴趣的:(GCC,uboot,ARM体系结构)