解决NIOS II工程移动在磁盘上位置后project无法编译问题

说明:本文档于2017年3月4日由小梅哥更新部分内容,主要是增加了讲解以Quartus II13.0为代表的经典版本和以15.1为代表的更新版本之间,解决问题的一些小的差异。

如果用户只是想快速解决问题,不想分析产生问题的原因并和我一起探寻解决问题的思路,可以直接跳到6.4节解决方案步骤总结:6.4 解决方案步骤总结。(点击蓝色字体即可到达)

针对目录改变时,Nios II project无法编译的问题,网上有多种解决方法,不过都操作相对繁琐,这里,小梅哥进过探索,针对11.0及以后的版本,找到了一种简单可靠的解决办法,整个过程只需要简单的四步操作即可搞定,分别为:切换工作空间(workspace),移除旧版工程,修改bsp文件,重新导入(import)工程。

6.1 更改NIOS II Project目录原因

引用网上木易前辈的话,“我们常会有各种理由会改变原来project的目录名称或目录位置”例如:

1. 为了管理方便,可能将原来在d:\project\的所有project移到e:\project\下

2. 同事将project整个目录压缩给我,因为我并不知道该project放在同事计算机什么工作目录下,所以我将压缩文件解压缩到我自己的工作目录下

3. 从网络上下载整包范例程序的压缩文件后,因为我并不知道原本范例程序所存放的目录,所以我将压缩文件解压缩到我自己的工作目录下

4. 从书上光盘复制范例程序到硬盘,因为我并不知道原本范例程序所存放的目录,所以我将范例程序复制到我自己的工作目录下

5. 新的project与旧的project类似,想从旧的project去做修改即可,开了一个新的目录,将旧的project所有档案复制到新的目录下

6. 为了管理方便,想改变原本project的目录名称

6.2 更改NIOS II Project目录引发的问题

Quartus II的工程在更改了路径后是不会存在问题的,我们可以直接编译更改下载,而在NIOS II EDS中的工程却没这么简单,Nios II EDS是用Eclipse去改的,用的是Eclipse的workspace概念,很类似Visual Studio的*.sln概念,但又不完全一样。Eclipse允许你在一个workspace下,去管理多个project,workspace记住的 是project的绝对路径,所以当你Nios II project目录名称改变,或者目录位置改变,该workspace自然就找不到了。

或者,如果你的新工程是从老工程复制过来的,那么一切表面看起来不会出现任何问题,所有的软件工程仍然可以“正常打开”,我们依旧可以编译,重新生产bsp文件,下载。然而,这种方式存在更大的风险,因为这样,你修改的还是原来路径下的文件,因此,这样就有极大的风险使得你在希望更改新的软件工程的时候,把原本的工程给改了。很多朋友表示NIOS II开发中存在各种各样的问题,例如无法下载elf文件,下载后软件不能执行或者执行报错。经过这段时间的辅导答疑,发现他们出问题大部分也都是这个原因。

6.3 解决方案详解

因此,为了让各位NIOS II用户快速上手,避免遇到这个问题而耽误太多的时间,小梅哥这里介绍一种最简单粗暴的解决办法。整个过程只需要简单的四步操作即可搞定,分别为:切换工作空间(workplace),移除旧版工程,修改bsp文件,重新导入(import)工程。

这里,我将我电脑中E:\easy_sopc\NiosOnlyExp\03_pio_int这个文件夹拷贝到桌面(C:\Users\Administrator\Desktop\03_pio_int)上,以符合更改路径这一前提,然后,打开其中的Quartus II工程“CoreCourse_GHRD.qpf”,工程打开后,选择tools->Nios II Software Build Tools For Eclipse。

然后在弹出的工作空间选择对话框中,可以看到,工作空间还是上次的工作空间路径,

这里,我们将工作空间切换到C:\Users\Administrator\Desktop\03_pio_int,如下图所示:

然后选择OK就会打开工程,打开后我们可以看到,软件自动加载了一个软件工程和一个bsp工程,该工程名字与复制前的工程(E:\easy_sopc\NiosOnlyExp\03_pio_int\software)中的软件工程名字一致(注意,如果用户磁盘上旧位置不存在该工程,例如该工程是从其他电脑拷贝过来的,工程将显示蓝色,无法打开,这个虽然会影响我们后续一步一步分析问题原因,但是不影响我们解决问题,如果各位自己电脑上无法打开,可以找一个原本存在的工程测试,或者跳过分析问题步骤,直接看解决方案总结)。

这时候,我们鼠标右键选中key_int_bsp,选择NIOS II -> BSP Editor

在弹出的BSP设置界面中我们可以看到,BSP target direction还是E:\easy_sopc\NiosOnlyExp\03_pio_int\software\key_int_bsp,即复制前的路径。

因此可知,如果此时我们在当前工程的Qsys中更改了NIOS II系统的架构或者增删了东西,重新生产Qsys文件,然后我们回到Eclipse中选择generate BSP时,软件会根据新的Qsys信息重新生产bsp文件,而这个bsp文件还是保存在之前的E:\easy_sopc\NiosOnlyExp\03_pio_int\software\key_int_bsp中,因此就导致原本的复制之前的工程内容被更改,即本来我们是想把整个工程复制到另一个地方进行单独修改的,然而却实质上把原路径下的工程文件给更改了,到最后导致原版和复制后的工程都被改变。

为了解决这个问题,接下来我们将新打开的工作空间中已经存在的两个工程移除。选中已经存在的工程和工程对应的bsp,右键选择Delete:

在弹出的对话框中,点击OK。不过大家一定要注意的是,千万不要勾选上面的那个“Delete project contents on disk(cannot be undone)”,因为这个是删除软件工程的源文件,如果选择了这个,那么在删除时就会将原本没有复制之前的路径下的软件源工程给删除掉,那么原版工程就被彻底破坏掉了,我们所需要做的,只是把这两个工程从工作空间中移除,而不是将原工程删掉,这点大家要切记。

移除了工程之后,我们回到新复制的工程下的key_int_bsp文件夹下(C:\Users\Administrator\Desktop\03_pio_int\software\key_int_bsp),找到settings.bsp文件,使用任意一个文本编辑器打开:

注意,不同版本的Quartus II软件该文件稍有差别。对于Quartus II13.0版本, BSP文件中两个位置记录了工程绝对路径,而对于15.1或以上,则只有一个位置记录绝对路径,另一个位置已经改进为相对路径了(相对路径是相对当前工程,因此无需修改)(其他版本我暂时未检验)。

首先我们看一个13.0版本的工程

该文件的7和9两行都是使用的绝对位置记录的,因此在Quartus II13.0版本的软件中需要修改这两个位置都为新的路径,修改后如下图所示:

而对于15.1版本的工程,打开文件后我们可以看到,该文件下的第7行左右,BspGeneratedLocation指定的还是复制前的路径,第9行已经改进为采用相对路径了:

于是,这里只需将第7行这个地方更改为我们复制后的新路径C:\Users\Administrator\Desktop\03_pio_int\software\key_int_bsp,第9行不变即可更改后的文件内容如下所示:

然后保存文件,回到NIOS II Eclipse中,选择File -> Import

在弹出的窗口中,选择General下的Existing Projects into Workspace:

在弹出的窗口中,选择Select root directiory,点击Browse,定位到Workspace目录(这里也就是Quartus II工程目录)C:\Users\Administrator\Desktop\03_pio_int

可以看到,软件会自动找到该目录下存在的软件工程,然后点击finish即可将工程导入进来。导入进来后,再次进入BSP Editor,发现BSP target direction就已经是现在的新路径了。

为了区分开这样更改后是否还会对未复制前的工程造成影响,这里我将未复制前的工程剪切到了另一个地方放着,这样如果在重新编译的时候还是要对未复制前的工程进行操作,那么因为原工程已经不在了,就会报警告或则报错。而事实上,当我再次编译时并没有报任何警告和错误。修改C代码后,重新编译生产elf文件,下载到芯航线FPGA开发板上,也能够正常的运行。打开原版工程(已经将原版工程拷贝回原路径了),还是之前的内容,编译下载也没问题。因此该问题得以完美解决。

6.4 解决方案步骤总结

好了,说了这么多,各种推理和验证,导致真正有用的操作步骤被弱化了,不容易区分,这里,我再总结下:

6.4.1 切换工作空间(workspace)

切换工作空间前:

切换工作空间后:

6.4.2 移除旧版工程

注意:千万不要勾选上面的那个“Delete project contents on disk(cannot be undone)”,

6.4.3 修改bsp文件

在新复制的工程下的key_int_bsp文件夹下(C:\Users\Administrator\Desktop\03_pio_int\software\key_int_bsp),找到settings.bsp文件,使用任意一个文本编辑器打开:

第7行左右,将BspGeneratedLocation指定路径由原版路径改为更改后的新路径:

13.0版本

更改前:

更改后

15.1及以上版本

更改前

更改后

然后保存文件。

6.4.4 重新导入(import)工程

NIOS II Eclipse中,选择File -> Import

在弹出的窗口中,选择General下的Existing Projects into Workspace:

在弹出的窗口中,选择Select root directiory,点击Browse,定位到Workspace目录(这里也就是Quartus II工程目录)C:\Users\Administrator\Desktop\03_pio_int

点击finish即可将工程导入进来。

接下来就可以放心的更改Qsys系统和软件工程啦。

如有更多问题,欢迎加入芯航线 FPGA 技术支持群交流学习:一群 472607506(已满)  二群  615381411

小梅哥

芯航线电子工作室

【小梅哥SOPC学习笔记】NIOS II工程目录改变时project无法编译问题的更多相关文章

  1. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  2. 【小梅哥SOPC学习笔记】sof与NIOS II的elf固件合并jic得到文件

    sof与NIOS II的elf固件合并jic得到文件 注意,本方法已经有更加简便的方法,小梅哥提供相应的脚本文件,可以一键生成所需文件,脚本请前往芯航线FPGA技术支持群获取. 7.1 为什么需要将S ...

  3. 【小梅哥SOPC学习笔记】SOPC开发常见问题及解决办法集锦

    SOPC开发常见问题及解决办法集锦 一.Symbol 'NULL' could not be resolved 近期在评估使用NIOS II处理器进行项目的开发,我使用的软件是Quartus II 1 ...

  4. 【小梅哥SOPC学习笔记】Altera SOPC嵌入式系统设计教程

    Altera SOPC嵌入式系统设计教程 第1章 概述 SOPC(System On Programmable Chip,可编程的片上系统)是Altera公司提出来的一种灵活.高效的SOC解决方案.它 ...

  5. 【小梅哥SOPC学习笔记】切换NIOS II CPU的主内存后软件中需要注意的几点设置

    切换NIOS II CPU的主内存后软件中需要注意的几点设置 有时候,我们可能面对这样一种情况: 1. 我们创建一个SOPC系统,并在QSYS中设置NIOS II的复位地址和异常地址都指向SRAM: ...

  6. 【小梅哥SOPC学习笔记】给NIOS II CPU增加看门狗定时器并使用

    给NIOS II CPU增加看门狗定时器并使用 配置看门狗定时器: 1. 设置计时溢出时间为1秒 2. 计数器位宽为32位 3. 勾选No Start/Stop control bits 4. 勾选F ...

  7. 【小梅哥SOPC学习笔记】系统时钟的使用

    给NIOS II CPU添加一颗澎湃的心——系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...

  8. 【小梅哥SOPC学习笔记】设置Eclipse在编译(build)前自动保存源代码文件

    设置Eclipse在编译(build)前自动保存源代码文件 Eclipse 常用设置之让Eclipse在编译(build)前自动保存源代码文件 一.让Eclipse在编译(build)前自动保存源代码 ...

  9. Django学习笔记 Django的工程目录

    mysite├── manage.py 管理项目:包括数据库建立.服务器运行.测试……└── mysite    ├── __init__.py     ├── settings.py 配置文件:应用 ...

随机推荐

  1. SQL Server 2008系统信息查询常用命令 查看表大小、记录数等

    1.返回所有数据库信息(数据库名,创建日期,存储路径等).   use master; GO select * from dbo.sysdatabases 2.返回当前数据库所有对象(可根据type字 ...

  2. Java 定义常量

    转自:http://www.softservice.org.cn/html/zjbk/2012-8/7685.html 方法一采用接口(Interface)的中变量默认为static final的特性 ...

  3. springcloud(三) eureka集群

    上一节讲到user微服务和order微服务和eureka注册中心一起使用,那么问题来了如何注册中心挂了怎么办?ok, 注册中心集群就来了. 原理图: 注意euraka 之间是通过复制(replicat ...

  4. 浏览器及CURL代理设置

    需要代理的请求 代理服务器及端口 120.197.233.205 80 firefox为例浏览器代理设置:(浏览器端也可以通过foxyproxy插件方便设置) 选项->高级->网络-> ...

  5. Netty心跳之IdleStateHandler

    Netty提供了对心跳机制的天然支持,心跳可以检测远程端是否存活,或者活跃 今天我们就一起初识一下Netty4的心跳机制 Netty4.0提供了一个类,名为IdleStateHandler,这个类可以 ...

  6. mongodb主从复制 副本集(六)

    主从复制副本集 8888.conf dbpath = D:\software\MongoDBDATA\07\8888 #主数据库地址port = 8888 #主数据库端口号bind_ip = 127. ...

  7. prettytable模块(格式化打印内容)

    1.查看系统是否已经安装prettytable模块 2.下载prettytable模块 登陆:https://pypi.python.org/pypi/PrettyTable 3.安装PrettyTa ...

  8. css style study

    <img style="float:none;display:block;margin:0px auto" src="images/aa.jpg"> ...

  9. 解读linux中用户密码规则及忘记root口令的破解(思路)

    linux当中,用户名和密码表对应关系放在/etc/passwd中,如: root:x:0:0:root:/root:/bin/bash 格式代表意义分别为 用户名:密码:用户id:组id:用户描述 ...

  10. Spring Boot @ControllerAdvice+@ExceptionHandler处理controller异常

    需求: 1.spring boot 项目restful 风格统一放回json 2.不在controller写try catch代码块简洁controller层 3.对异常做统一处理,同时处理@Vali ...