Обход кэша данных в процессоре Nios II

У меня есть следующие исходные файлы C, из которых необходимо удалить некоторый код и добавить некоторый код для обхода кеша данных на процессоре Nios

#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;
}
r2c. Я понятия не имею, как это сделать.

Файл: 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;
}

Получил это со встроенной сборкой, используя чтение и запись ввода-вывода:

Файл: 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));
}

person Jason McKindly    schedule 04.04.2013    source источник
comment
Это может помочь в общих чертах, какие ресурсы вы просматривали и как они не помогают или помогают вам...   -  person Jordan Dea-Mattson    schedule 05.04.2013
comment
Да, вы, кажется, единственный человек (в Интернете), который задает этот вопрос. Поздравляем! Кстати, я предполагаю, что у вас есть эта книга altera.com/literature/hb/nios2/ n2cpu_nii5v1.pdf См. стр. 2-14 для описания того, что вы пытаетесь сделать.   -  person KevinDTimm    schedule 05.04.2013
comment
Спасибо, KevinD, лол. Ресурсы, на которые я смотрел, рассказывают о некоторых методах, но не содержат примеров. Например, с использованием метода бит-31. Я знаю, что изменение 31-го бита (старшего бита) позволит обойти кеш, но они никогда не показывают пример того, как это сделать на C. Или с использованием некоторых макросов, которых нет на этом Nios, потому что мы не используем HAL   -  person Jason McKindly    schedule 05.04.2013
comment
Вы, вероятно, застряли с поддержкой Altera - у них должны быть примеры того, как это должно быть сделано. Кстати, кажется, что весь их примерный код - это сборка, может быть, существует группа gcc, специфичная для этого процессора, и она может помочь с вашим запросом?   -  person KevinDTimm    schedule 05.04.2013
comment
Я решил это с помощью встроенной сборки   -  person Jason McKindly    schedule 05.04.2013


Ответы (1)


Вы можете использовать -mno-cache-volatile и объявить переменную как volatile. На самом деле MMIO, которые достигаются чтением/записью некоторых регистров, должны всегда быть изменчивыми.

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

    Доступ к временной памяти в обход кэша с использованием вариантов ввода-вывода инструкций загрузки и сохранения. По умолчанию не обходить кеш.

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

Другой вариант — всегда обходить кеш с помощью -mbypass-cache.

Видеть

person phuclv    schedule 24.08.2014