小编Son*_*tom的帖子

NIOS II - 从软件重置 FPGA(重新加载 FPGA 配置,而不仅仅是重置处理器)

语境

我正在编写在 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)

fpga reset uclinux intel-fpga nios

5
推荐指数
1
解决办法
1938
查看次数

在嵌入式Linux上使用C++ Std Lib时出现异常的段错误

这是我试图在嵌入式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)

... …

c++ linux segmentation-fault libstdc++ microblaze

5
推荐指数
1
解决办法
459
查看次数