绕过Nios II处理器中的数据缓存



我有以下C源文件,需要删除一些代码,并添加一些代码以绕过Nios_2_r2c处理器上的数据缓存。我不知道该怎么做。

文件:switches.c

#include "system.h"
#include "pio_regs.h"
#include "bsu_macros.h"
#include "switches.h"
static struct pio_regs *SW = (struct pio_regs *)SWITCH_BASE;
static REGISTER SH_SW;
bits get_RUN ( void ) {
    SH_SW = SW->data;
    return getbit(SH_SW, 17);
}

文件:ledr.c

#include "system.h"
#include "pio_regs.h"
#include "bsu_macros.h"
#include "ledr.h"
static struct pio_regs *LEDR = (struct pio_regs *)LEDR_BASE;
static REGISTER SH_LEDR;
void LEDR_Init ( void ) {
    SH_LEDR = 0;
    LEDR->data = 0;
}
void show_RUN ( bits RUN ) {
    SH_LEDR = putbit (SH_LEDR, RUN, 12);
    LEDR->data = SH_LEDR;
}

使用I/O读写内联汇编得到它:

文件:switches.c

#include "system.h"
#include "pio_regs.h"
#include "bsu_macros.h"
#include "switches.h"
static struct pio_regs *SW = (struct pio_regs *)SWITCH_BASE;
static REGISTER SH_SW;
bits get_RUN ( void ) {
    //SH_SW = SW->data;
    __asm("ldwio %0, %1" : "=r"(SH_SW) : "m"(SW->data));
    return getbit(SH_SW, 17);
}

文件:ledr.c

#include "system.h"
#include "pio_regs.h"
#include "bsu_macros.h"
#include "ledr.h" 
static struct pio_regs *LEDR = (struct pio_regs *)LEDR_BASE;
static REGISTER SH_LEDR;
void LEDR_Init ( void ) {
    SH_LEDR = 0;
    //LEDR->data = 0;
    __asm("stwio %0, %1" : "=r"(SH_LEDR) : "m"(SW->data));
}
void show_RUN ( bits RUN ) {
    SH_LEDR = putbit (SH_LEDR, RUN, 12);
    //LEDR->data = SH_LEDR;
    __asm("stwio %0, %1" : "=r"(SH_SW) : "m"(SW->data));
}

您可以使用-mno-cache-volatile并将变量声明为volatile。实际上,通过读写寄存器实现的mmio必须始终是易失的。

  • -mno-cache-volatile
  • -mcache-volatile

    易失性内存访问使用加载和存储指令的I/O变体绕过缓存。默认设置是不绕过缓存。

https://gcc.gnu.org/onlinedocs/gcc/Nios-II-Options.html

另一个选项是通过-mbypass-cache

绕过缓存看

  • C/c++中的内存映射寄存器
  • 使用volatile寄存器
  • 为什么C中需要volatile ?
  • 使用内存映射I/O管理缓存
  • NIOS II缓存旁路

相关内容

  • 没有找到相关文章

最新更新