0

Nios_2_r2c プロセッサのデータ キャッシュをバイパスするために、いくつかのコードを削除し、いくつかのコードを追加する必要がある次の C ソース ファイルがあります。これを行う方法がわかりません。

ファイル: switch.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の読み取りと書き込みを使用してインラインアセンブリで取得しました:

ファイル: switch.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));
}
4

1 に答える 1

1

変数を として使用-mno-cache-volatileおよび宣言できますvolatile。実際、一部のレジスタの読み取り/書き込みによって実現される MMIO は、常に揮発性でなければなりません。

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

    揮発性メモリ アクセスは、ロードおよびストア命令の I/O バリアントを使用してキャッシュをバイパスします。デフォルトでは、キャッシュをバイパスしません。

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

別のオプションは、常にキャッシュをバイパスすることです-mbypass-cache

見る

于 2014-08-24T17:44:22.287 に答える