惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
Google DeepMind News
Google DeepMind News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Proofpoint News Feed
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog
U
Unit 42
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
G
Google Developers Blog
I
InfoQ
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
Jina AI
Jina AI
量子位
宝玉的分享
宝玉的分享
The Cloudflare Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 聂微东
Last Week in AI
Last Week in AI
WordPress大学
WordPress大学
美团技术团队
The Hacker News
The Hacker News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tailwind CSS Blog
博客园 - 司徒正美
博客园 - 叶小钗
Hugging Face - Blog
Hugging Face - Blog
P
Palo Alto Networks Blog
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
博客园 - 【当耐特】
Spread Privacy
Spread Privacy
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
Vercel News
Vercel News
Martin Fowler
Martin Fowler
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Forbes - Security
Forbes - Security
Attack and Defense Labs
Attack and Defense Labs
Google DeepMind News
Google DeepMind News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog
P
Privacy International News Feed
G
GRAHAM CLULEY
The Last Watchdog
The Last Watchdog
C
Cyber Attacks, Cyber Crime and Cyber Security
AI
AI
V2EX - 技术
V2EX - 技术

博客园 - 真 OO无双

(轉貼) Bit Twiddling Hacks (SOC) (Verilog) (C) (筆記) 如何移除VirtualBox所遺留下的驅動程式? (SOC) (VirtualBox) (筆記) always block內省略else所代表的電路 (SOC) (Verilog) (原創) 如何在Qsys Subsystem使用Interrupt? (SOC) (Nios II) (Qsys) (原創) Qsys或RTL做修改後,Nios II SBT該如何面對新的硬體? (SOC) (Nios II) (Qsys) (原創) Qsys Generation Tab的Simulation設定的意義 (SOC) (Nios II) (Qsys) (筆記) 如何寫入binary file某個byte連續n byte的值? (C/C++) (C) (筆記) 如何寫入binary file某個byte的值? (C/C++) (C) (筆記) 如何讀取binary file某個byte連續n byte的值? (C/C++) (C) (筆記) 如何讀取binary file某個byte的值? (C/C++) (C) (原創) Altera Technology Roadshow 2011 Taipei (SOC) (Quartus II) (Nios II) (Qsys) (原創) 如何在安裝SELinux的環境執行Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (筆記) 如何得知Quartus II最新版到底修改了哪些東西? (SOC) (Quartus II) (Nios II) (SOPC Builder) (Qsys) (筆記) Qsys resource整理 (SOC) (Nios II) (Qsys) (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox) (筆記) 如何在RedHat Linux安裝VirtualBox Guest Additions? (SOC) (Linux) (RedHat) (VirtualBox) (筆記) 常用設定暫存器值的編程技巧 (SOC) (C/C++) (C) (Verilog) (原創) Quartus II安裝新觀念:如何將Quartus II安裝在VirtualBox內? (SOC) (Quartus II) (VirtualBox) (筆記) $dispaly()、$strobe()、$monitor() 、$fwrite()與blocking / nonblocking的關係 (SOC) (Verilog) (Debussy) (Verdi)
(原創) 如何解決目錄改變時,Nios II project無法編譯的問題? (SOC) (Nios II) (DE2-70)
真 OO无双 · 2011-12-21 · via 博客园 - 真 OO无双

Abstract
若我們從網路上下載範例程式,或者從書上的光碟將範例程式複製到硬碟時,只要是Quartus II版本正確,都可以正常地開啟Quartus II project並且編譯之,但Nios II project卻常常雖然能開啟,卻無法正常編譯,本文討論其root cause並提出解決方式。

Introduction
使用環境:Windows XP SP3 + VirtualBox 4.1.2 + Quartus II 11.0

本文將討論以下主題:

1.為什麼會需要改變目錄名稱或目錄位置?

2.改變目錄名稱或目錄位置,在Nios II project會遇到什麼問題?

3.Root cause與解決方法。

4.使用Blank Project方法所面臨的問題。

1.為什麼會需要改變目錄名稱或目錄位置?

我們常會有各種理由會改變原來project的目錄名稱或目錄位置:

1.為了管理方便,可能將原來在d:\project\的所有project移到e:\project\下

2.同事將project整個目錄壓縮給我,因為我並不知道該project放在同事電腦什麼工作目錄下,所以我將壓縮檔解壓縮到我自己的工作目錄下

3.從網路上下載整包範例程式的壓縮檔後,因為我並不知道原本範例程式所存放的目錄,所以我將壓縮檔解壓縮到我自己的工作目錄下

4.從書上光碟複製範例程式到硬碟,因為我並不知道原本範例程式所存放的目錄,所以我將範例程式複製到我自己的工作目錄下

5.新的project與舊的project類似,想從舊的project去做修改即可,開了一個新的目錄,將舊的project所有檔案複製到新的目錄下

6.為了管理方便,想改變原本project的目錄名稱

以上的情形,若是純粹Quartus II project,只要Quartus II版本正確,開啟*.qpf檔即可順利開啟,並且正常編譯,唯一有問題的是Programmer的*.cdf檔可能因為路徑不對無法寫入,只是重新指定*.sof與*.pof的位置即可。

Quartus II的*.qpf project概念類似Visual C++ 6的*.dsw或者Visual Studio的*.sln,整個project內的檔案是相對路徑,所以改變專案名稱或者改變目錄位置都沒有關係,只要檔案相對位置沒有改變,整個project就可以正常運作。

但是Nios II project就沒這麼單純了!!

Nios II SBT是用Eclipse去改的,用的是Eclipse的workspace概念,很類似Visual Studio的*.sln概念,但又不完全一樣。Eclipse允許你在一個workspace下,去管理多個project,workspace記住的是project的絕對路徑,所以當你Nios II project目錄名稱改變,或者目錄位置改變,該workspace自然就找不到了。

依照Eclipse workspace哲學的正規解法,此時你應該將目錄改變的Nios II project重新Import到你的workspace下。但事實上真的如此嗎?

2.改變目錄名稱或目錄位置,在Nios II project會遇到什麼問題?

我們實際做個實驗,如下圖所示,原本DE2_70_SOPC_golden_mini是一個在Quartus II與Nios II SBT都完全正常的project。

nios2_path_00

我們現在將目錄名稱改變,從DE2_70_SOPC_golden_mini改成DE2_70_SOPC_golden_mini2

nios2_path_01

大家都知到改變目錄名稱或目錄位置不會影響Quartus II project的開啟與編譯,所以就略過不討論,現在將焦點放在Nois II project部分。

開啟Nios II SBT,將workspace目錄切換到新的目錄DE2_70_SOPC_golden_mini2

nios2_path_02

開啟後顯示更改目錄名稱之前的2個project:hello_worldhello_world_bsp,由於現在目錄名稱已經改變,所以只能看到project名稱,卻完全無法開啟。

nios2_path_03

由於2個project已經無法開啟,我們將這2個project從workspace中刪除之。

nios2_path_04

刪除完後,整個workspace完全沒有任何project。

nios2_path_05

根據Eclipse哲學的正規解法因為目錄已經改變,我們必須將2個project使用import的方式載入到新的workspace。

nios2_path_06

由於之前是使用Nios II SBT產生makefile的project,所以在此選擇Import Nios II Software Build Tools Project

nios2_path_07

首先將hello_world project import進來,值得注意的是:要將Clean project when importing打勾,也就是在import project完時,馬上執行make clean,將之前所留下的object file全部清除。

nios2_path_08

import完成後,顯示了以下的warning,告訴我們project想include舊的專案路徑的目錄,但因為目錄名稱改變,所以include失敗。這是第1個問題。

nios2_path_09

接下繼續import hello_world_bsp,也記得將Clean project when importing打勾。

nios2_path_10

import完成後,並沒有顯示任何錯誤訊息與warning。

nios2_path_11

若在hello_world_bsp執行Nios II –> Generate BSP,會出現以下錯誤訊息,表示找不到*.sopcinfo。這是第2個問題。

nios2_path_12

若在hello_world_bsp執行Nios II –> BSP Editor會出現以下錯誤訊息,表示找不到*.sopcinfo。這是第3個問題。

nios2_path_13

若實際Build App project(hello_world)與BSP project,雖然仍可出現*.elf與*.a,但會出現以下錯誤訊息,表示Makefile找不到*.sopcinfo。這是第4個問題。

nios2_path_005

nios2_path_006

總結以上實驗,我們發現若改變目錄名稱或者目錄位置,在Nios II project會出現以下4個問題:

1.App project(hello_world)會出現include path not found warning。
2.BSP project(hello_world_bsp)會無法執行Generate BSP。
3.BSP project(hello_world_bsp)會無法執行BSP Editor。
4.Build App project(hello_world)與BSP project(hello_world_bsp)會出現Makefile找不到SOPC File的warning。

3.Root cause與解決方法。 

App project (hello_world) :include path not found warning的Root cause

在hello_world的Properties的C/C++ General –> Paths and Symbols的GNC C與GNC C++,我們可以發現Include directories的目錄錯了,抓的都是修改前的目錄名稱,且這些目錄名稱還無法刪除或者修改,因為這是Eclipse自動抓的,這是第1個問題的root cause。

nios2_path_003

nios2_path_004

App project (hello_world) :include path not found warning的Solution

Step 1:App project (hello_world)的properties

nios2_path_007

Step 2:C/C++ Build –> Discovery Options的Cygwin C Compier,按下Clear清除目前所抓的include path。

nios2_path_008

提示include path即將清除,將在Build時重新抓取include path,按『OK』繼續。

nios2_path_009

Step 4:C/C++ Build –> Discovery Options的Cygwin C++ Compier,按下Clear清除目前所抓的include path。

nios2_path_010

提示include path即將清除,將在Build時重新抓取include path,按『OK』繼續。

nios2_path_011

Step 5:檢查目前App project (hello_world)的include path

C/C++ General –> Paths and Symbols的Includes的GNC C,確定已經清除所有的include paths

nios2_path_012

C/C++ General –> Paths and Symbols的Includes的GNC C++,確定已經清除所有的include paths

nios2_path_013

原本App project (hello_world)的warnings也都不見了。

nios2_path_014

看到這裡,或許你會說:『不是應該要include新目錄的BSP project路徑才對嗎?』沒錯,如同Step 3與Step 4的提示所言,最後只要重新Build App project (hello_world),就會重新discover include path,這我們等BSP project也解決後再一起重新Build。

BSP project (hello_world_bsp)無法Generate BSP的Root cause

首先了解Nios II SBT的Generate BSP到底做了什麼事情,根據[3] Nios II Software Build Tools Reference的p.15-8的nios2-bsp-generate-files與[4] Nios II Software Build Tools的p.4-30的Regenerating Your BSP所述,Generate BSP會根據BSP project的settings.bsp去尋找*.sopcinfo,再根據目前的*.sopcinfo去產生最新的drivers與HAL目錄所需要的檔案以及重新產生Makefile。

打開settings.bsp,會發現BspGeneratedLocation與SopcDesignFile所記錄的路徑都是改變目錄名稱之前的路徑,因此在Generate BSP時會找不到*.sopcinfo而導致執行錯誤。這是第2個問題的root cause。

nios2_path_015

BSP project (hello_world_bsp)無法Generate BSP的Solution

Step 1:修改BspGeneratedLocation與SopcDesignFile的路徑

nios2_path_016

修改完存檔時會出現以下錯誤訊息,主要是BspGeneratedTimStamp使用了中文時間,按下『Save as UTF-8』格式存檔即可。

nios2_path_26

Step 2:重新Generate BSP

可順利執行Generate BSP沒有任何錯誤訊息。

nios2_path_018

BSP project (hello_world_bsp)無法執行BSP Editor的Root cause

BSP Editor主要的目的在於修改settings.bsp一些只與BSP project相關的設定,BSP Editor無法執行,主要原因也是因為找不到*.sopcinfo。這是第3個問題的root cause。

BSP project (hello_world_bsp)無法執行BSP Editor的Solution

在之前的步驟已經修改過settings.bsp的*.sopcinfo路徑,所以也一併解決了這個問題,不必再做其他修改。

重新執行BSP Editor,可正常執行沒有任何錯誤訊息。

nios2_path_019

Build App project (hello_world)與BSP project (hello_world_bsp)會出現Makefile找不到SOPC File的warning的Root cause

App project (hello_world)與BSP project (hello_world_bsp)在Build時,事實上就是執行Make動作,所以需要參考Makefile,會出現warning主要是因為Makefile找不到*.sopcinfo。這是第4個問題的root cause。

Build App project (hello_world)與BSP project (hello_world_bsp)會出現Makefile找不到SOPC File的warning的Solution

理論上應該要去修改Makefile,不過由於執行Generate BSP時,nios2-bsp-generate-files已經根據修改過的settings.bsp更新過Makefile,所以我們不須再手動修改Makefile了。

重新Build BSP project (hello_world_bsp),可順利Build沒有任何錯誤訊息。

nios2_path_020

最後重新Build App project (hello_world),也可順利Build沒有任何錯誤訊息。

nios2_path_021

還記得在App project (hello_world) :include path not found warning的Solution時,我們只清除了App project所include的錯誤路徑,但卻還沒有將正確地修正include路徑。

在Build完後App project (hello_world)後,馬上觀察hello_world的Properties的C/C++ General –> Paths and Symbols的GNC C與GNC C++,會發現正確的include路徑都回來了。

nios2_path_022

nios2_path_023

之前的洋洋灑灑,只是因為要邊解釋root cause邊介紹solution,其實整個步驟很簡單,只要5個步驟即可。

nios2_path_36

4.使用Blank Project方法所面臨的問題 

Nios II project只要改變路徑就無法編譯的問題,其實從我使用Quartus II 6.0時就已經發現了,應該說Nios II要使用Eclipse,就注定會有這個workspace的問題,很多人的解法(包括我自己)都與[2] 张亚峰[笔记].为何在Nios II SBTE中,直接拖放到工程文件夹的文件,编译会出错?一樣,都是重新開1個blank project,然後重新將所需要的*.c, *.cpp拖放進新建的blank project,最後在手動去修改Makefile,這樣的解法的確是可以避開include paths錯誤與*.sopcinfo路徑錯誤的問題,不過settings.bsp與Makefile都是新的,所以必須手動去檢查Makefile是否與原project一樣,然後手動修改Makefile。

在[1] Getting Started with the Graphical User Interface的p.2-11的User Source Management有以下一段文字:

nios2_path_35

簡單的說,就是既然你用了Nios II SBT,就不建議手動去改Makefile,應該採用GUI或者Command line script的方式,由tools去更改你的Makefile,而不該手動去更改你的Makefile。本文採用的方式,雖然知道Makefile有問題,但依照Nios II SBT的邏輯,使用了Nios II SBT的GUI方式與流程去修改Makefile,完全沒有手動去修改Makefile,這樣可確定Makefile的正確性,也省去了一一比對原本Makefile的功夫。

完整程式碼下載
DE2_70_SOPC_golden_mini2.7z

Conclusion
這篇博文中的解法,是參考了Altera的官方資料所做出的總結,並經過無數次的實驗所歸納的心得, 因為這是我困擾好幾年的問題,假如你也為Nios II project路徑問題而困擾,可以參考本文的解法。

See Also
(原創) Qsys或RTL做修改後,Nios II SBT該如何面對新的硬體? (SOC) (Nios II) (Qsys)

Reference
[1] Getting Started with the Graphical User Interface
[2] 张亚峰[笔记].为何在Nios II SBTE中,直接拖放到工程文件夹的文件,编译会出错?
[3] Nios II Software Build Tools Reference
[4] Nios II Software Build Tools

全文完。