语境
我正在编写在 NIOS II 处理器上的 uClinux 中运行的代码。FPGA 是 Stratix II。FPGA 设计是由不再在公司的其他人完成的,我不是固件设计师,只是软件程序员。
问题
FPGA 在上电时从闪存器件加载其配置。我已经编写了一个对闪存重新编程的应用程序,但我需要找到一种方法使其重新加载 FPGA 配置,并且我需要通过软件来完成此操作。目前,让 FPGA 重新加载的唯一方法是重新上电,但这在客户的环境中是不可能的。
我正在编写的语言并不真正相关,足以说明我可以轻松地写入已知地址处的硬件寄存器,例如在 Tcl 中:nioswr32 $reg_addr $value
我试图找到的是某种我可以的重置寄存器使用。也许是 JTAG 接口?我找到了对 JTAG_UART 的引用,但显然这只是为了通过 JTAG 提供控制台功能。也许有一个硬件看门狗定时器我可以搞乱?
请注意,我不仅仅是尝试重置 NIOS 处理器。我可以使用 busybox 轻松做到这一点,但这不会重新加载 FPGA 固件。
下面是我的标题的副本system.h
,我相信它是由 SOPC Builder 生成的,因此您可以看到哪些资源可用。
#ifndef __SYSTEM_H_
#define __SYSTEM_H_
/*
DO NOT MODIFY THIS FILE
Changing this file will have subtle consequences
which will almost certainly lead to a nonfunctioning
system. If you do modify this file, be aware that …
Run Code Online (Sandbox Code Playgroud) 这是我试图在嵌入式Linux系统上运行的一些示例测试代码:
#include <iostream>
int main(int argc, char *argv[])
{
char c = 'A';
int i = 7;
std::cout << "Hello World from C++" << std::endl;
std::cout << "c=" << c << std::endl;
std::cout << "i=" << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
嵌入式系统是Microblaze,它是在Xilinx FPGA上运行的32位RISC软核处理器.请不要因为你的许多标准Linux知识仍然适用而被推迟.处理器配置为带有MMU的LSB,而我正在使用的Linux版本(由Xilinx提供的PetaLinux)期望相同.我正在使用提供的GNU编译器; Microblaze似乎在GCC正式支持.
我遇到的问题是,当stdlib需要与整数进行交互时,会出现段错误.这是输出:
Hello World from C++
c=A
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
请注意,char处理得很好.这段代码的C等效也可以正常工作:
#include <stdio.h>
int main(int argc, char *argv[])
{
char c = 'A';
int i = 7;
printf("Hello World from C\n");
printf("c=%c\n", c);
printf("i=%i\n", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
... …