SOPC開發常見問題及解決辦法集錦
一、Symbol 'NULL' could not be resolved
近期在評估使用NIOS II處理器進行項目的開發,我使用的軟件是Quartus II 13.0的版本,一路下來,在Qsys系統中搭建NIOS II片上系統,在Quartus II中建立工程文件等等過程,沒有太多的問題,這里暫且不表。只是在NIOS II Software build tools for Eclipse中進行軟件開發時,一個非常讓人不解的問題就是:我在工程向導中創建一個Hello World的模版工程,然后編譯下載運行都沒問題。然后關閉NIOS II Software build tools for Eclipse軟件,再次打開時,結果就冒出一大堆錯誤,錯誤描述如下:
在alt_sys_init.c這個文件中,報錯“Symbol 'NULL' could not be resolved”,此報錯主要集中在分配設備存儲(Allocate the device storage)這一部分,例如,我的系統中報錯如下所示:
提示我NULL未定義。可是NULL明明是在stddef.h這樣一個標准頭文件中明確定義了的,怎么還會發生這種情況呢?
另外,由於本系統中使用到了UART IP,所以系統在自動生成時也提供了對應的驅動,打開一個驅動程序“altera_avalon_uart_write.c”,發現同樣有報錯的地方,這里主要提示:“Symbol 'O_NONBLOCK' could not be resolved”,其它文件中也有類似的提示,這就讓人很是納悶了。O_NONBLOCK這個宏定義明明是在” sys/_default_fcntl.h”這個文件中定義了的,為什么總是說找不到呢?
參考網上的方法,說是需要手動添加包頭文件包含路徑,懷着試一試的心態,我打開了bsp工程的選項對話框(選中XXX_bsp工程,單擊右鍵,選中properties),在打開的對話框中,切換到C/C++ general選項下的paths and Symbols選項欄,選擇GUN C,在里面添加了三個路徑
/hello_bsp/HAL/inc/os
/hello_bsp/HAL/inc/priv
/hello_bsp/HAL/inc/sys
如下圖所示:
添加完成之后點擊Apply,此時會彈出如下對話框:
點擊YES即可,然后點擊OK關閉設置窗口。
此時對XXX_bsp工程執行Clean操作,然后build。待build完成之后,再次打開前面提到的報錯的若干文件,發現沒有了報錯信息,關閉NIOS II Software build tools for Eclipse軟件,然后再打開,都沒有再出現這種報錯信息,因此問題成功解決。
二、NIOS II CPU復位異常
近期在用nios ii做項目時,發現一個奇怪的現象,在NIOS II EDS軟件中編寫好的代碼,燒寫到芯片中,第一次能夠正常運行,但是當我按下板卡上的復位鍵之后,系統卻卡死了,再也運行不起來,除非重新下載程序。經過分析系統可知,系統的硬件設計和Qsys系統中NIOS II CPU系統的搭建都是沒有任何問題的。那么為什么會存在這樣的問題呢,這里我先簡單介紹下我的系統:
我的系統主要由NIOS II最強板CPU,SDRAM、預留系統定時器、預留時間戳定時器、system ID、EPCS控制器以及JTAG_UART組成。具體如下圖所示:
在Qsys環境中,我一開始將CPU的復位向量(Reset Vector)設定在了EPCS上,然后在NIOS II EDS中建立了軟件工程,編譯,下載運行都沒有問題,但是並沒有將fpga配置文件和代碼固化到EPCS中去,因此復位時存在問題是肯定的。后來為了調試方便,在Qsys系統中將CPU的復位向量也修改指向了SDRAM,然后在NIOS II EDS軟件中,重新生成了BSP之后,軟件的編譯,下載運行都沒有問題,只是每當我按下板卡上的復位鍵之后,系統卻卡死了,再也運行不起來。
記起去年做畢業設計時,曾經為在含有EPCS的系統中無法下載程序的問題苦惱過,當時下載程序時,每次都在進度為64%時報如下的錯誤,“Nios II ‘Launching New_configuration’ has ecountered a problem.Dowenloading Elf Process failed.”相信這個報錯也是大家最深惡痛絕的(注,此圖是我從網上下載的,自己做系統已經很久不出這個問題了,想弄張這樣的圖片只能百度了):
在網上找了一大堆問題,有說是SDRAM相位不對的,這個我以前也確實遇見過,不過自從我將SDRAM的時鍾相移設定為-90度后,就基本沒遇到過這個問題了。還有說是硬件本身有問題的,這里不排除此種情況,但是我的系統中卻並非如此。最終是在新浪博客還是百度空間中的某位前輩的文章中找到的答案我忘記了。當時忘了記下博客地址了,只是將內容復制出來,存了一個word文檔。現在這篇文檔已經能夠在百度文庫中直接檢索到了,尊重他人版權,我這里就只發文章在文庫中的地址了:
他的解決方案就是在BSP editor中修改了兩個與bootloader位置相關的選項,將allow_code_at_reset和enable_alt_load兩個選項的勾選取消了,如下圖:
該文章中介紹,當創建不帶EPCS控制器的NIOS II系統時,在NIOS II EDS中創建工程時,bsp editor中這兩項是勾選上的。當創建了帶EPCS控制器的NIOS II系統時,在NIOS II EDS中創建工程時,bsp editor中這兩項是沒有勾選上的。由此可知,當復位向量為SDRAM時,這兩個選項應該勾選上。具體的原因見該文中作者在Altera提供的相關手冊中找到原始解釋。
當我在系統中將此兩項勾選上后,再次生成bsp,然后編譯、下載,處理器就能夠正常執行復位了。
三、SOPC開發易錯點歸納
1、 在需要最終將程序固化到EPCS的系統中,需要添加EPCS/EPCQx1 Serial Flash Control。該控制器的reset信號一定要與jtag debug module reset信號(cpu模塊中)相連,另外,最好其他所有模塊的reset信號都與jtag debug module reset信號連接上,否則,在最終通過Flash Programmer固化程序時,會出錯。如下圖所示:
2、 epcs的Avalon Memory Mapped端口需要與CPU的data_master和instruction_master均進行連接。如下圖所示:
3、 EPCS的external信號需要導出到頂層(針對Cyclone III和Cyclone IV器件),以便進行引腳分配,如下圖所示:
這里,導出到頂層后具體怎么分配引腳,在Altera的《Embedded Peripheral IP User Guide》中有相關介紹,
引腳分配完成后,需要在Quartus II中依次點擊【Assigments】-> 【Device】,在彈出的界面中選擇“Device and Pin Options”, 在Dual-Purpose Pins中設置DCLK、Data[0]、Data[1]/ASDO、FLASH_nCE/nCSO的Value為“Use as regular I/O”(雙擊值,然后在下拉菜單中選擇)。否則Quartus II進行全編譯會報如下錯誤:
4、CPU的復位向量設置為EPCS,CPU的異常向量設置為內存(on_chip_memory或SDRAM),如下圖所示:
四、拔掉下載器或者關閉NIOS II EDS軟件,開發板上的系統即停止運行
問題原因
這是因為NIOS II系統中使用了JTAG UART,而在NIOS II系統中,JTAG UART的驅動是阻塞的,而且,該串口是使用JTAG模擬的,因此,NIOS II通過JTAG UART發送數據實際是將數據送入了JTAG的FIFO中,需要電腦端使用軟件(如Eclipse中的Console)來讀取數據,如果數據不被讀走,則NIOS II中的程序會一直在這里等待數據被讀走,才能發送下一個數據,因此卡在該處無法繼續運行,就出現死機的現象。
解決建議
實際調試時建議使用RS232串口,不要使用JTAG UART。
五、編譯NIOS軟件工程提示” Permission denied”
在編譯一個由其他電腦創建的NIOS II軟件工程時,提示:” Fatal error: can’t create obj/../../xxxxxxx.o, Permission denied”,如圖所示:
問題原因
不同電腦對該文件夾的權限設置不一樣,因此當文件被復制過來后,當前用戶環境下沒有權限對該文件進行編譯,因此報錯。
解決建議
首先關會NIOS II IDE軟件,然后將該文件夾取得管理員所有權,再打開軟件,編譯就不會有問題了。
如有更多問題,歡迎加入芯航線 FPGA 技術支持群交流學習:一群 472607506(已滿) 二群 615381411
小梅哥
芯航線電子工作室