【发布时间】:2013-04-04 20:24:11
【问题描述】:
我有以下 C 源文件需要删除一些代码并添加一些代码以绕过 Nios_2_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;
}
通过使用 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));
}
【问题讨论】:
-
这可能有助于概述您查看过哪些资源以及它们如何没有或正在帮助您...
-
哎呀,你似乎是唯一一个(在互联网上)问这个问题的人。恭喜!顺便说一句,我假设您有这本书 altera.com/literature/hb/nios2/n2cpu_nii5v1.pdf 请参阅第 2-14 页了解您正在尝试做什么。
-
感谢 KevinD 哈哈。我看过的资源讨论了一些方法,但没有提供示例。就像使用 bit-31 方法一样。我知道更改第 31 位(MSB)将绕过缓存,但他们从未展示如何在 C 中执行此操作的示例。或者使用此 Nios 上不存在的一些宏,因为我们没有使用 HAL跨度>
-
您可能被 Altera 支持卡住了——他们必须提供应该如何完成的示例。顺便说一句,他们的所有示例代码似乎都是汇编,也许存在特定于该处理器的 gcc 组并且可以帮助您查询?
-
我用内联汇编解决了它