zoukankan      html  css  js  c++  java
  • lk中内联调用的dsb()

    lk中内联调用的dsb()

     

    比如lk的uart_dm_init()函数就调用了dsb()

    /* Configure the uart clock */
           clock_config_uart_dm(id);
           dsb();
     
           /*Configure GPIO to provide connectivity between UART block
              product ports and chip pads */
           gpio_config_uart_dm(id);
           dsb();

    dsb的在lkarcharmincludearchDefines.h中定义,如下:

    #if ARM_ISA_ARMV7
    #define dsb() __asm__ volatile("dsb" : : : "memory");
    #define dmb() __asm__ volatile("dmb" : : : "memory");
    #define isb() __asm__ volatile("isb" : : : "memory");
    #elif ARM_ISA_ARMV6
    #define dsb() __asm__ volatile ("mcrp15, 0, %0, c7, c10, 4" : : "r" (0): "memory");
    #define dmb() __asm__ volatile ("mcrp15, 0, %0, c7, c10, 5" : : "r" (0): "memory");
    #define isb() __asm__ volatile ("mcrp15, 0, %0, c7, c5,  4" : :"r" (0): "memory");
    #endif

    这里是内联汇编里的dsb指令,这是gcc的inline asssemble,主要功能是数据同步屏障,Datasynchronization barrier。

     

    memory is an instruction to GCC that (sortof) says that the inline asm sequence has side effects on global memory, andhence not just effects on local variables need to be taken into account.

    这都是 gcc的 inlineassemble

     

     

    相关链接:

    ARM嵌入式开发中的GCC内联汇编(ARM GCC Inline Assembler Cookbook)

    http://blog.csdn.net/linglongqiongge/article/details/51678588

     

  • 相关阅读:
    扑克牌顺子
    反转字符串
    左旋转字符串
    和为S的两个数
    C++中substr()详解
    STL库中的equal_range()
    和为S的连续正序列
    数组中只出现一次的数
    二叉树的深度
    mysql找安装路经,更改密码
  • 原文地址:https://www.cnblogs.com/liang123/p/6325206.html
Copyright © 2011-2022 走看看