<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_真 OO无双 之 真乱舞书</title><subtitle type="text">寫程式是很快樂的一件事 Since Sep.15,2006</subtitle><id>http://feed.cnblogs.com/blog/u/21379/rss</id><updated>2012-02-04T09:57:38Z</updated><author><name>真 OO无双</name><uri>http://www.cnblogs.com/oomusou/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/oomusou/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/21379/rss"/><entry><id>http://www.cnblogs.com/oomusou/archive/2012/02/04/virtual_box_remove_driver.html</id><title type="text">(筆記) 如何移除VirtualBox所遺留下的驅動程式? (SOC) (VirtualBox)</title><summary type="text">有時儘管依照正常程序移除了VirtualBox，但是在裝置管理員還是會看到遺留下來無法移除的驅動程式，本文討論如何手動移除這些無法移除的驅動程式。</summary><published>2012-02-04T09:55:00Z</published><updated>2012-02-04T09:55:00Z</updated><author><name>真 OO无双</name><uri>http://www.cnblogs.com/oomusou/</uri></author><link rel="alternate" href="http://www.cnblogs.com/oomusou/archive/2012/02/04/virtual_box_remove_driver.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/oomusou/archive/2012/02/04/virtual_box_remove_driver.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Abstract&lt;br /&gt;&lt;/strong&gt;有時儘管依照正常程序移除了VirtualBox，但是在裝置管理員還是會看到遺留下來無法移除的驅動程式，本文討論如何手動移除這些無法移除的驅動程式。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Introduction&lt;br /&gt;使用環境：Windows XP XP3 + VirtualBox 4.1.2&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Symptom&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如下圖是當VirtualBox正常移除後，卻在裝置管理員所遺留下來的驅動程式：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="vb_remove01" src="http://images.cnblogs.com/cnblogs_com/oomusou/201202/201202041754524814.gif" alt="vb_remove01" width="807" height="620" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;若在裝置管理員手動移除這些驅動程式，會出現以下錯誤訊息而無法移除。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="vb_remove02" src="http://images.cnblogs.com/cnblogs_com/oomusou/201202/2012020417545619.gif" alt="vb_remove02" width="578" height="191" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Root Cause &amp;amp; Solution&lt;br /&gt;Step 1：裝置例項識別碼&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;選擇所要移除的驅動程式，滑鼠右鍵 &amp;ndash;&amp;gt; 內容 &amp;ndash;&amp;gt; 詳細資料&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="vb_remove03" src="http://images.cnblogs.com/cnblogs_com/oomusou/201202/20120204175457675.gif" alt="vb_remove03" width="404" height="426" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Step 2：手動在登錄編輯程式刪除註冊機碼&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;開啟登入編輯程式，在以下位置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum找到如上的註冊機碼&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="vb_remove04" src="http://images.cnblogs.com/cnblogs_com/oomusou/201202/201202041754594428.gif" alt="vb_remove04" width="807" height="620" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;此時若你直接刪除此註冊機碼，會出現無法刪除的錯誤訊息，主要是因為我們沒有權限去刪除之，這也是我們無法從裝置管理員去刪除此驅動程式的root cause。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Step 3：改變註冊機碼的權限&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;選擇要刪除的註冊機碼，滑鼠右鍵 &amp;ndash;&amp;gt; 使用權限&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="vb_remove05" src="http://images.cnblogs.com/cnblogs_com/oomusou/201202/201202041755003447.gif" alt="vb_remove05" width="367" height="422" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;將Everyone加入的『完全控制』變成『允許』。&lt;/p&gt;&#xD;
&lt;p&gt;或許你會擔心這樣的權限適當嗎? 反正這個註冊機碼馬上就要被刪除，所以讓Everyone完全控制也沒有關係。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Step 4：刪除註冊機碼&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="vb_remove06" src="http://images.cnblogs.com/cnblogs_com/oomusou/201202/201202041755015498.gif" alt="vb_remove06" width="507" height="191" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Step 5：到裝置管理員確認&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;原本無法移除的驅動程式已經正常移除了&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="vb_remove067" src="http://images.cnblogs.com/cnblogs_com/oomusou/201202/201202041755029218.gif" alt="vb_remove067" width="807" height="620" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;這是參考Microsoft的官方解法&lt;a href="http://blogs.technet.com/b/csstwplatform/archive/2010/05/12/windows-driver-uninstallation-failed-in-windows-xp.aspx" target="_blank"&gt;Windows Driver uninstallation Failed in Windows XP&lt;/a&gt;，不只適用在VirtualBox，其他驅動程式若無法解除，也可以使用這種方式。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://blogs.technet.com/b/csstwplatform/archive/2010/05/12/windows-driver-uninstallation-failed-in-windows-xp.aspx" target="_blank"&gt;Windows Driver uninstallation Failed in Windows XP&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/oomusou/aggbug/2338151.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/oomusou/archive/2012/02/04/virtual_box_remove_driver.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/oomusou/archive/2012/01/29/verilog_else.html</id><title type="text">(筆記) always block內省略else所代表的電路 (SOC) (Verilog)</title><summary type="text">在Verilog中，always block可以用來代表Flip-Flop, Combination Logic與Latch，本文比較在不寫else下，always block所代表的電路。</summary><published>2012-01-29T10:45:00Z</published><updated>2012-01-29T10:45:00Z</updated><author><name>真 OO无双</name><uri>http://www.cnblogs.com/oomusou/</uri></author><link rel="alternate" href="http://www.cnblogs.com/oomusou/archive/2012/01/29/verilog_else.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/oomusou/archive/2012/01/29/verilog_else.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;br /&gt;在Verilog中，always block可以用來代表Flip-Flop, Combination Logic與Latch，本文比較在不寫else下，always block所代表的電路。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;br /&gt;在C語言裡，省略else只是代表不處理而；已但在Verilog裡，省略else所代表的是不同的電路。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;always&lt;/span&gt;@(a &lt;span style="color: #0000ff;"&gt;or&lt;/span&gt; b &lt;span style="color: #0000ff;"&gt;or&lt;/span&gt; en)&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (en)&lt;br /&gt;    c = a &amp;amp; b;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在combination logic中省略else，由於必須在~en保留原本的值，所以會產生latch。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="or00" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201292027184722.gif" alt="or00" width="288" height="138" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;always&lt;/span&gt;@(clk)&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (en)&lt;br /&gt;    c &amp;lt;= a &amp;amp; b;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;雖然也必須在~en保留原本的值，但由於flip-flop就有記憶的功能，所以不會產生latch。if將產生mux，並將flip-flop的值拉回給mux。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="or01" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201292027214006.gif" alt="or01" width="360" height="186" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;在Verilog中，雖然只是小小的差異，但結果卻有天大的差異。&lt;/p&gt;&#xD;
&lt;p&gt;全文完。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/oomusou/aggbug/2331388.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/oomusou/archive/2012/01/29/verilog_else.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/oomusou/archive/2012/01/18/qsys_tristate_bridge.html</id><title type="text">(原創) 如何使用Tri-state Conduit Bridge連接Flash與SSRAM? (SOC) (Nios II) (Qsys) (NEEK)</title><summary type="text">在實務上為了節省FPGA的pin腳，我們常會將Flash與SSRAM的address與data共用，在Qsys中必須使用Tri-state Conduit Bridge, Tri-state Conduit Pin Sharer與Generic Tristate Controller與Flash與SSRAM連在一起，和SOPC Builder只使用Tri-state Bridge不同。</summary><published>2012-01-17T23:23:00Z</published><updated>2012-01-17T23:23:00Z</updated><author><name>真 OO无双</name><uri>http://www.cnblogs.com/oomusou/</uri></author><link rel="alternate" href="http://www.cnblogs.com/oomusou/archive/2012/01/18/qsys_tristate_bridge.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/oomusou/archive/2012/01/18/qsys_tristate_bridge.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;br&gt;在實務上為了節省FPGA的pin腳，我們常會將Flash與SSRAM的address與data共用，在Qsys中必須使用Tri-state Conduit Bridge, Tri-state Conduit Pin Sharer與Generic Tristate Controller與Flash與SSRAM連在一起，和SOPC Builder只使用Tri-state Bridge不同。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Introduction&lt;br&gt;使用環境：Windows XP SP3 + VirtualBox 4.1.2 + Quartus II 11.0 + NEEK&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;本文將討論以下主題：&lt;/p&gt; &lt;p&gt;1.Flash與SSRAM共用address與data的設計&lt;/p&gt; &lt;p&gt;2.如何在Qsys使用Tri-state Conduit Bridge與Tri-state Conduit Pin Sharer？&lt;/p&gt; &lt;p&gt;3.Address與Data floating問題與解決方法&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;br&gt;[1] &lt;a href="http://www.altera.com/products/devkits/altera/kit-cyc3-embedded.html" target="_blank"&gt;Nios II Embedded Evaluation Kit (NEEK)&lt;/a&gt;&lt;br&gt;[2] &lt;a href="http://www.altera.com/literature/tt/tt_nios2_system_architect.pdf" target="_blank"&gt;Nios II System Architect Design Tutorial&lt;/a&gt;&lt;br&gt;[3] &lt;a href="http://www.cnblogs.com/oomusou/admin/www.altera.com/literature/hb/qts/qsys_interconnect.pdf" target="_blank"&gt;Qsys Interconnect&lt;/a&gt;&lt;br&gt;[4] &lt;a href="http://www.altera.com/literature/ug/ug_avalon_tc.pdf" target="_blank"&gt;Avalon Tri-State Conduit Components User Guide&lt;/a&gt;&lt;br&gt;[5] &lt;a href="http://www.altera.com/literature/an/an632.pdf" target="_blank"&gt;SOPC Builder to Qsys Migration Guidelines&lt;/a&gt;&lt;/p&gt; &lt;p&gt;未完，待續。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/oomusou/aggbug/2325157.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/oomusou/archive/2012/01/18/qsys_tristate_bridge.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/oomusou/archive/2012/01/04/subsystem_interrupt.html</id><title type="text">(原創) 如何在Qsys Subsystem使用Interrupt? (SOC) (Nios II) (Qsys)</title><summary type="text">Qsys其中之一的賣點就是允許你建立hierarchical的subsystem。在SOC設計中，通常我們會將慢速的周邊使用較慢的clock而自成一個系統，在Qsys中允許我們將這些較慢的周邊包成一個peripheral subsystem，而不是像SOPC Builder一樣只能有一個system。當我們使用subsystem的架構時，該如何讓subsystem內IP使用interrupt的方式與Nios II溝通呢?</summary><published>2012-01-04T15:12:00Z</published><updated>2012-01-04T15:12:00Z</updated><author><name>真 OO无双</name><uri>http://www.cnblogs.com/oomusou/</uri></author><link rel="alternate" href="http://www.cnblogs.com/oomusou/archive/2012/01/04/subsystem_interrupt.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/oomusou/archive/2012/01/04/subsystem_interrupt.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;br /&gt;Qsys其中之一的賣點就是允許你建立hierarchical的subsystem。在SOC設計中，通常我們會將慢速的周邊使用較慢的clock而自成一個系統，在Qsys中允許我們將這些較慢的周邊包成一個peripheral subsystem，而不是像SOPC Builder一樣只能有一個system。當我們使用subsystem的架構時，該如何讓subsystem內IP使用interrupt的方式與Nios II溝通呢?&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Introduction&lt;br /&gt;使用環境：Windows XP SP3 + VirtualBox 4.1.2 + Quartus II 11.0&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本文將討論以下主題：&lt;/p&gt;&#xD;
&lt;p&gt;1.如何使用IRQ Bridge連接subsystem的IRQ export到Nios II Processor?&lt;/p&gt;&#xD;
&lt;p&gt;2.如何避開Nios II SBT目前無法自動產生IRQ number常數在system.h的bug?&lt;/p&gt;&#xD;
&lt;p&gt;3.如何在App project使用Interrupt?&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.如何使用IRQ Bridge連接subsystem的IRQ export到Nios II Processor?&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;根據[1] &lt;a href="http://www.altera.com/literature/hb/qts/qsys_interconnect.pdf" target="_blank"&gt;Qsys Interconnect&lt;/a&gt; p.7-27 &lt;strong&gt;IRQ Bridge&lt;/strong&gt;章節的建議，若要在subsystem使用interrupt，必須在包含Nios II的CPU subsystem使用IRQ Bridge接收Peripheral subsystem所export出來的IRQ，然後才連到Nios II Processor。至於下圖中的Merlin IRQ Mapper則並不是必需的，若你在CPU subsystem中也有IP要使用interrupt，這必須再包一層Merlin IRQ Mapper；若你在CPU subsystem沒有IP要使用interrupt，只有Peripheral subsystem使用interrupt，可以直接只使用IRQ Bridge連接到Nios II Processor。&lt;/p&gt;&#xD;
&lt;p&gt;常見的錯誤(也是我第一次的錯誤)是直接將Peripheral subsystem所export的IRQ直接連到Nios II Processor，這樣Qsys與Quartus II編譯都沒有任何錯誤，Nios II也沒有錯誤，不過Nios II的C code將收不到來自Peripheral subsystem的interrupt。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="irq000" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201042354236820.gif" alt="irq000" width="734" height="540" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2.如何避開Nios II SBT目前無法自動產生IRQ number常數在system.h的bug?&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;除此之外，在[2] &lt;a href="http://www.altera.com/literature/rn/archives/rn_qts_110.pdf" target="_blank"&gt;Quartus II 11.0 Release Notes&lt;/a&gt;的p.15已經承認在Quartus II 11.0有以下的bug。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="irq001" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201042354293651.gif" alt="irq001" width="747" height="125" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;簡單的說，就是若你在subsystem中使用interrupt，當你使用Generate BSP時，Nios II SBT根據*.sopcinfo在system.h所產生相對應的IRQ number常數，永遠都是-1，並無法反應出目前硬體架構中真正的IRQ number。且經過實測，這個問題在Quartus II 11.1也依然存在。&lt;/p&gt;&#xD;
&lt;p&gt;如圖所示，我們對push button使用interrupt，但在system.h的PERIPHERAL_SYSTEM_BUTTON_PIO_IRQ常數卻是-1，與在Qsys上的IRQ number不同。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="irq002" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201052216194777.gif" alt="irq002" width="807" height="620" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;這會造成什麼影響呢?只要你的App project使用到有使用interrupt的IP，編譯就會產生錯誤，如下圖我們在system timer有使用interrupt，所以一編譯就產生錯誤無法繼續。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="irq003" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201052216339289.gif" alt="irq003" width="807" height="620" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;詳細錯誤訊息如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;Error: Interrupt not connected for peripheral_system_timer_0. The system clock driver requires an interrupt to be connected. Please select an IRQ for this device in SOPC builder.&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;root cause就是system.h的IRQ number都是-1，所以App project找不到該IP的IRQ number而無法編譯。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Solution&lt;br /&gt;&lt;/strong&gt;既然在system.h的IRQ number都是-1，我們只好重新自己在system.h手動定義IRQ number。根據[3] &lt;a href="http://www.alterawiki.com/wiki/New_Qsys_Issues#Interrupts" target="_blank"&gt;Altera Wiki : New Qsys Issues for Interrupts&lt;/a&gt;的建議&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="irq014" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201052333158485.gif" alt="irq014" width="781" height="197" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;當然你可以直接去修改system.h，但別忘了BSP project的所有檔案最好不要手動修改，應該交由Nios II SBT或者command line script去修改才對，因為每當你執行Generate BSP或者BSP Editor時，Nios II SBT都會重新產生system.h，也就是你做的所有修改都會被覆蓋掉。所以[3] &lt;a href="http://www.alterawiki.com/wiki/New_Qsys_Issues#Interrupts" target="_blank"&gt;Altera Wiki : New Qsys Issues for Interrupts&lt;/a&gt; 的解法雖然可行，但並不完美。&lt;/p&gt;&#xD;
&lt;p&gt;根據 [2] &lt;a href="http://www.altera.com/literature/rn/archives/rn_qts_110.pdf" target="_blank"&gt;Quartus II 11.0 Release Notes&lt;/a&gt;的建議&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="irq001" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201042354293651.gif" alt="irq001" width="747" height="125" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;看起來是要我們自己另開一個my_system.h，然後將system.h所有內容複製到system.h，自己在my_system.h加上IRQ number常數，並且App project也使用my_system.h，這樣Generate BSP與BSP Editor就不會改到我的my_system.h了。&lt;/p&gt;&#xD;
&lt;p&gt;這樣看似理想，但卻衍生另外一個問題：BSP project有大量的檔案都include "system.h"，你必須手動一一的改成include "my_system.h"，這也是個大工程。所以[2] &lt;a href="http://www.altera.com/literature/rn/archives/rn_qts_110.pdf" target="_blank"&gt;Quartus II 11.0 Release Notes&lt;/a&gt; 看似也不盡理想。&lt;/p&gt;&#xD;
&lt;p&gt;我在此提供一個小技巧對付Nios II SBT目前這個bug。&lt;/p&gt;&#xD;
&lt;p&gt;在system.h的尾部自己加上IP IRQ number的定義如下圖，先執行#undef取消這個常數的定義，再用#define重新這個常數，因為若同一個常數在system.h重複#define，會產生warning，若使用#undef就完全沒有warning。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="irq005" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201052244451593.gif" alt="irq005" width="807" height="620" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然後將這些#undef與#define另存一個文字檔，每當你執行Generate BSP或者BSP Editor時，system.h就會被Nios II SBT重新產生蓋掉你原先的設定，&lt;strong&gt;&lt;span style="color: #008080;"&gt;再將這些#undef與#define貼到system.h的最下方。如此就只需修改system.h，其他BSP檔案都不用做任何修改。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如此修改重新編譯後，就可順利Build Project，沒有任何錯誤。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="irq006" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/20120105224450607.gif" alt="irq006" width="807" height="620" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.如何在App project使用Interrupt?&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;根據[4] &lt;a href="http://www.altera.com/literature/hb/nios2/n2sw_nii52006.pdf" target="_blank"&gt;Exception Handling&lt;/a&gt; p.8-16與p.8-17的建議，我們將App project寫成如下的code使用interrupt。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;nios2_onchip_leg_push_button.c / C&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #008000;"&gt;(C) OOMusou 2011 &lt;/span&gt;&lt;span style="color: #008000; text-decoration: underline;"&gt;http://oomusou.cnblogs.com&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #008000;"&gt;Filename    : nios2_onchip_led_push_button.c&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #008000;"&gt;Compiler    : Nios II SBT 11.0&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #008000;"&gt;Description : test led, push_button &amp;amp; interrupt in subsystem&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #008000;"&gt;Release     : Jan.06,2012 1.0&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; #include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;system.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; #include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;alt_types.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; #include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;sys/alt_irq.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; #include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;altera_avalon_pio_regs.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;volatile&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; edge_capture;&lt;br /&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; #ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT&lt;br /&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; handle_key_interrupts(&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; *context) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; handle_key_interrupts(&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; *context, alt_u32 id) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;volatile&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; *edge_capture_ptr = (&lt;span style="color: #0000ff;"&gt;volatile&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;*)context;&lt;br /&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;   *edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(PERIPHERAL_SYSTEM_BUTTON_PIO_BASE);&lt;br /&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;   IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PERIPHERAL_SYSTEM_BUTTON_PIO_BASE, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (edge_capture == &lt;span style="color: #800080;"&gt;0x01&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;     printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;key 1 pressed!\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt;     IOWR(PERIPHERAL_SYSTEM_LED_PIO_BASE, &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0xFE&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt;     edge_capture = &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt;   }&lt;br /&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (edge_capture == &lt;span style="color: #800080;"&gt;0x02&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt;     printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;key 2 pressed\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt;     IOWR(PERIPHERAL_SYSTEM_LED_PIO_BASE, &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0xFD&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt;     edge_capture = &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt;   }&lt;br /&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (edge_capture == &lt;span style="color: #800080;"&gt;0x04&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt;     printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;key 3 pressed\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt;     IOWR(PERIPHERAL_SYSTEM_LED_PIO_BASE, &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0xFB&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt;     edge_capture = &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt;   }&lt;br /&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (edge_capture == &lt;span style="color: #800080;"&gt;0x08&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt;     printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;key 4 pressed\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt;     IOWR(PERIPHERAL_SYSTEM_LED_PIO_BASE, &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0xF7&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt;     edge_capture = &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;47&lt;/span&gt;   }&lt;br /&gt;&lt;span style="color: #008080;"&gt;48&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (edge_capture == &lt;span style="color: #800080;"&gt;0x10&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;49&lt;/span&gt;     printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;key 5 pressed\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;50&lt;/span&gt;     IOWR(PERIPHERAL_SYSTEM_LED_PIO_BASE, &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0xEF&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;51&lt;/span&gt;     edge_capture = &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;52&lt;/span&gt;   }&lt;br /&gt;&lt;span style="color: #008080;"&gt;53&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (edge_capture == &lt;span style="color: #800080;"&gt;0x20&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;54&lt;/span&gt;     printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;key 6 pressed\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;55&lt;/span&gt;     IOWR(PERIPHERAL_SYSTEM_LED_PIO_BASE, &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0xDF&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;56&lt;/span&gt;     edge_capture = &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;57&lt;/span&gt;   }&lt;br /&gt;&lt;span style="color: #008080;"&gt;58&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (edge_capture == &lt;span style="color: #800080;"&gt;0x40&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;59&lt;/span&gt;     printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;key 7 pressed\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;60&lt;/span&gt;     IOWR(PERIPHERAL_SYSTEM_LED_PIO_BASE, &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0xBF&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;61&lt;/span&gt;     edge_capture = &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;62&lt;/span&gt;   }&lt;br /&gt;&lt;span style="color: #008080;"&gt;63&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (edge_capture == &lt;span style="color: #800080;"&gt;0x80&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;64&lt;/span&gt;     printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;key 8 pressed\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;65&lt;/span&gt;     IOWR(PERIPHERAL_SYSTEM_LED_PIO_BASE, &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0x7F&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;66&lt;/span&gt;     edge_capture = &lt;span style="color: #800080;"&gt;0x00&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;67&lt;/span&gt;   }&lt;br /&gt;&lt;span style="color: #008080;"&gt;68&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;69&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;70&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;71&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; init_key() {&lt;br /&gt;&lt;span style="color: #008080;"&gt;72&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; *edge_capture_ptr = (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; *)&amp;amp;edge_capture;&lt;br /&gt;&lt;span style="color: #008080;"&gt;73&lt;/span&gt;   IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PERIPHERAL_SYSTEM_BUTTON_PIO_BASE, &lt;span style="color: #800080;"&gt;0xFF&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;74&lt;/span&gt;   IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PERIPHERAL_SYSTEM_BUTTON_PIO_BASE, &lt;span style="color: #800080;"&gt;0x0&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;75&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;76&lt;/span&gt; #ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT&lt;br /&gt;&lt;span style="color: #008080;"&gt;77&lt;/span&gt;   alt_ic_isr_register(PERIPHERAL_SYSTEM_BUTTON_PIO_IRQ_INTERRUPT_CONTROLLER_ID,&lt;br /&gt;&lt;span style="color: #008080;"&gt;78&lt;/span&gt;                       PERIPHERAL_SYSTEM_BUTTON_PIO_IRQ,&lt;br /&gt;&lt;span style="color: #008080;"&gt;79&lt;/span&gt;                       handle_key_interrupts,&lt;br /&gt;&lt;span style="color: #008080;"&gt;80&lt;/span&gt;                       edge_capture_ptr,&lt;br /&gt;&lt;span style="color: #008080;"&gt;81&lt;/span&gt;                       &lt;span style="color: #800080;"&gt;0x0&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;82&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;83&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;84&lt;/span&gt;   alt_irq_register(PERIPHERAL_SYSTEM_BUTTON_PIO_IRQ,&lt;br /&gt;&lt;span style="color: #008080;"&gt;85&lt;/span&gt;                    edge_capture_ptr,&lt;br /&gt;&lt;span style="color: #008080;"&gt;86&lt;/span&gt;                    handle_key_interrupts);&lt;br /&gt;&lt;span style="color: #008080;"&gt;87&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;88&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;89&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;90&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;91&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main() {&lt;br /&gt;&lt;span style="color: #008080;"&gt;92&lt;/span&gt;   printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Nios II + Onchip + LED + Push Button Test!\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;93&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;94&lt;/span&gt;   init_key();&lt;br /&gt;&lt;span style="color: #008080;"&gt;95&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;96&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;97&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;98&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;99&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;以上的code我不打算一行一行講解，詳細請參考[4] &lt;a href="http://www.altera.com/literature/hb/nios2/n2sw_nii52006.pdf" target="_blank"&gt;Exception Handling&lt;/a&gt; p.8-16與p.8-17，我要強調的是，&lt;strong&gt;&lt;span style="color: #008080;"&gt;一般在使用interrupt時，Altera都會建議你使用新的alt_ic_isr_register()，而不要使用舊的alt_irq_register()，並且說未來Nios II SBT版本將只支援alt_ic_isr_register()&lt;/span&gt;&lt;/strong&gt;，若在只有一層Qsys的system下，可以使用alt_ic_isr_register()沒有問題，但在具有Qsys subsystem下使用interrupt時，若使用alt_ic_isr_register()將會造成編譯錯誤，會說找不到alt_ic_isr_register()，為什麼會這樣呢?&lt;/p&gt;&#xD;
&lt;p&gt;在一般只有一層Qsys system，在system.h可以看到&lt;strong&gt;&lt;span style="color: #008080;"&gt;#define ALT_ENHANCED_INTERRUPT_API_PRESENT&lt;/span&gt;&lt;/strong&gt;，如下圖所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="irq007" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201052244578943.gif" alt="irq007" width="807" height="620" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;但在使用Qsys subsystem的system.h下，看不到&lt;strong&gt;&lt;span style="color: #008080;"&gt;#define ALT_ENHANCED_INTERRUPT_API_PRESENT&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="irq008" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201052320193404.gif" alt="irq008" width="807" height="620" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在BSP的&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;sys/alt_irq.h / C&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008080;"&gt;  1&lt;/span&gt; #ifndef __ALT_IRQ_H__&lt;br /&gt;&lt;span style="color: #008080;"&gt;  2&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __ALT_IRQ_H__&lt;br /&gt;&lt;span style="color: #008080;"&gt;  3&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;  4&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*****************************************************************************&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  5&lt;/span&gt; &lt;span style="color: #008000;"&gt;*                                                                             *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  6&lt;/span&gt; &lt;span style="color: #008000;"&gt;* License Agreement                                                           *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  7&lt;/span&gt; &lt;span style="color: #008000;"&gt;*                                                                             *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  8&lt;/span&gt; &lt;span style="color: #008000;"&gt;* Copyright (c) 2009 Altera Corporation, San Jose, California, USA.           *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  9&lt;/span&gt; &lt;span style="color: #008000;"&gt;* All rights reserved.                                                        *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 10&lt;/span&gt; &lt;span style="color: #008000;"&gt;*                                                                             *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 11&lt;/span&gt; &lt;span style="color: #008000;"&gt;* Permission is hereby granted, free of charge, to any person obtaining a     *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 12&lt;/span&gt; &lt;span style="color: #008000;"&gt;* copy of this software and associated documentation files (the "Software"),  *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 13&lt;/span&gt; &lt;span style="color: #008000;"&gt;* to deal in the Software without restriction, including without limitation   *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 14&lt;/span&gt; &lt;span style="color: #008000;"&gt;* the rights to use, copy, modify, merge, publish, distribute, sublicense,    *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 15&lt;/span&gt; &lt;span style="color: #008000;"&gt;* and/or sell copies of the Software, and to permit persons to whom the       *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 16&lt;/span&gt; &lt;span style="color: #008000;"&gt;* Software is furnished to do so, subject to the following conditions:        *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 17&lt;/span&gt; &lt;span style="color: #008000;"&gt;*                                                                             *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 18&lt;/span&gt; &lt;span style="color: #008000;"&gt;* The above copyright notice and this permission notice shall be included in  *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 19&lt;/span&gt; &lt;span style="color: #008000;"&gt;* all copies or substantial portions of the Software.                         *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 20&lt;/span&gt; &lt;span style="color: #008000;"&gt;*                                                                             *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 21&lt;/span&gt; &lt;span style="color: #008000;"&gt;* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 22&lt;/span&gt; &lt;span style="color: #008000;"&gt;* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,    *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 23&lt;/span&gt; &lt;span style="color: #008000;"&gt;* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 24&lt;/span&gt; &lt;span style="color: #008000;"&gt;* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 25&lt;/span&gt; &lt;span style="color: #008000;"&gt;* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 26&lt;/span&gt; &lt;span style="color: #008000;"&gt;* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER         *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 27&lt;/span&gt; &lt;span style="color: #008000;"&gt;* DEALINGS IN THE SOFTWARE.                                                   *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 28&lt;/span&gt; &lt;span style="color: #008000;"&gt;*                                                                             *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 29&lt;/span&gt; &lt;span style="color: #008000;"&gt;* This agreement shall be governed in all respects by the laws of the State   *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 30&lt;/span&gt; &lt;span style="color: #008000;"&gt;* of California and by the laws of the United States of America.              *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 31&lt;/span&gt; &lt;span style="color: #008000;"&gt;*                                                                             *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 32&lt;/span&gt; &lt;span style="color: #008000;"&gt;*****************************************************************************&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 33&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 34&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 35&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_irq.h is the Nios II specific implementation of the interrupt controller &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 36&lt;/span&gt; &lt;span style="color: #008000;"&gt; * interface.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 37&lt;/span&gt; &lt;span style="color: #008000;"&gt; *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 38&lt;/span&gt; &lt;span style="color: #008000;"&gt; * Nios II includes optional support for an external interrupt controller. &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 39&lt;/span&gt; &lt;span style="color: #008000;"&gt; * When an external controller is present, the "Enhanced" interrupt API&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 40&lt;/span&gt; &lt;span style="color: #008000;"&gt; * must be used to manage individual interrupts. The enhanced API also&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 41&lt;/span&gt; &lt;span style="color: #008000;"&gt; * supports the processor's internal interrupt controller. Certain API&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 42&lt;/span&gt; &lt;span style="color: #008000;"&gt; * members are accessible from either the "legacy" or "enhanced" interrpt&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 43&lt;/span&gt; &lt;span style="color: #008000;"&gt; * API. &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 44&lt;/span&gt; &lt;span style="color: #008000;"&gt; *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 45&lt;/span&gt; &lt;span style="color: #008000;"&gt; * Regardless of which API is in use, this file should be included by&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 46&lt;/span&gt; &lt;span style="color: #008000;"&gt; * application code and device drivers that register ISRs or manage interrpts.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 47&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 48&lt;/span&gt; #include &amp;lt;errno.h&amp;gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 49&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 50&lt;/span&gt; #include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;nios2.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 51&lt;/span&gt; #include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;alt_types.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 52&lt;/span&gt; #include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;system.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 53&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 54&lt;/span&gt; #ifdef __cplusplus&lt;br /&gt;&lt;span style="color: #008080;"&gt; 55&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;C&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 56&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 57&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; /* __cplusplus */&lt;br /&gt;&lt;span style="color: #008080;"&gt; 58&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 59&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 60&lt;/span&gt; &lt;span style="color: #008000;"&gt; * Macros used by alt_irq_enabled&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 61&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 62&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; ALT_IRQ_ENABLED  1&lt;br /&gt;&lt;span style="color: #008080;"&gt; 63&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; ALT_IRQ_DISABLED 0  &lt;br /&gt;&lt;span style="color: #008080;"&gt; 64&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 65&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 66&lt;/span&gt; &lt;span style="color: #008000;"&gt; * Number of available interrupts in internal interrupt controller.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 67&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 68&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; ALT_NIRQ NIOS2_NIRQ&lt;br /&gt;&lt;span style="color: #008080;"&gt; 69&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 70&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 71&lt;/span&gt; &lt;span style="color: #008000;"&gt; * Used by alt_irq_disable_all() and alt_irq_enable_all().&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 72&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 73&lt;/span&gt; typedef &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; alt_irq_context;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 74&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 75&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; ISR Prototype &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 76&lt;/span&gt; #ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT&lt;br /&gt;&lt;span style="color: #008080;"&gt; 77&lt;/span&gt; typedef &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; (*alt_isr_func)(&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;* isr_context);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 78&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 79&lt;/span&gt; typedef &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; (*alt_isr_func)(&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;* isr_context, alt_u32 id);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 80&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 81&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 82&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 83&lt;/span&gt; &lt;span style="color: #008000;"&gt; * The following protypes and routines are supported by both&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 84&lt;/span&gt; &lt;span style="color: #008000;"&gt; * the enhanced and legacy interrupt APIs&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 85&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 86&lt;/span&gt;  &lt;br /&gt;&lt;span style="color: #008080;"&gt; 87&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 88&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_irq_enabled can be called to determine if the processor's global&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 89&lt;/span&gt; &lt;span style="color: #008000;"&gt; * interrupt enable is asserted. The return value is zero if interrupts &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 90&lt;/span&gt; &lt;span style="color: #008000;"&gt; * are disabled, and non-zero otherwise.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 91&lt;/span&gt; &lt;span style="color: #008000;"&gt; *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 92&lt;/span&gt; &lt;span style="color: #008000;"&gt; * Whether the internal or external interrupt controller is present, &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 93&lt;/span&gt; &lt;span style="color: #008000;"&gt; * individual interrupts may still be disabled. Use the other API to query&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 94&lt;/span&gt; &lt;span style="color: #008000;"&gt; * a specific interrupt. &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 95&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 96&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; ALT_INLINE &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; ALT_ALWAYS_INLINE alt_irq_enabled (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080;"&gt; 97&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 98&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; status;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 99&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt;   NIOS2_READ_STATUS (status);&lt;br /&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; status &amp;amp; NIOS2_STATUS_PIE_MSK; &lt;br /&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;104&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;105&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;106&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_irq_disable_all() &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;107&lt;/span&gt; &lt;span style="color: #008000;"&gt; *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;108&lt;/span&gt; &lt;span style="color: #008000;"&gt; * This routine inhibits all interrupts by negating the status register PIE &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;109&lt;/span&gt; &lt;span style="color: #008000;"&gt; * bit. It returns the previous contents of the CPU status register (IRQ &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;110&lt;/span&gt; &lt;span style="color: #008000;"&gt; * context) which can be used to restore the status register PIE bit to its &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;111&lt;/span&gt; &lt;span style="color: #008000;"&gt; * state before this routine was called.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;112&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;113&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; ALT_INLINE alt_irq_context ALT_ALWAYS_INLINE &lt;br /&gt;&lt;span style="color: #008080;"&gt;114&lt;/span&gt;        alt_irq_disable_all (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080;"&gt;115&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt;116&lt;/span&gt;   alt_irq_context context;&lt;br /&gt;&lt;span style="color: #008080;"&gt;117&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;118&lt;/span&gt;   NIOS2_READ_STATUS (context);&lt;br /&gt;&lt;span style="color: #008080;"&gt;119&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;120&lt;/span&gt;   NIOS2_WRITE_STATUS (context &amp;amp; ~NIOS2_STATUS_PIE_MSK);&lt;br /&gt;&lt;span style="color: #008080;"&gt;121&lt;/span&gt;   &lt;br /&gt;&lt;span style="color: #008080;"&gt;122&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; context;&lt;br /&gt;&lt;span style="color: #008080;"&gt;123&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;124&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;125&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;126&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_irq_enable_all() &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;127&lt;/span&gt; &lt;span style="color: #008000;"&gt; *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;128&lt;/span&gt; &lt;span style="color: #008000;"&gt; * Enable all interrupts that were previously disabled by alt_irq_disable_all()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;129&lt;/span&gt; &lt;span style="color: #008000;"&gt; *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;130&lt;/span&gt; &lt;span style="color: #008000;"&gt; * This routine accepts a context to restore the CPU status register PIE bit&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;131&lt;/span&gt; &lt;span style="color: #008000;"&gt; * to the state prior to a call to alt_irq_disable_all().&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;132&lt;/span&gt; &lt;span style="color: #008000;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;133&lt;/span&gt; &lt;span style="color: #008000;"&gt; * In the case of nested calls to alt_irq_disable_all()/alt_irq_enable_all(), &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;134&lt;/span&gt; &lt;span style="color: #008000;"&gt; * this means that alt_irq_enable_all() does not necessarily re-enable&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;135&lt;/span&gt; &lt;span style="color: #008000;"&gt; * interrupts.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;136&lt;/span&gt; &lt;span style="color: #008000;"&gt; *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;137&lt;/span&gt; &lt;span style="color: #008000;"&gt; * This routine will perform a read-modify-write sequence to restore only&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;138&lt;/span&gt; &lt;span style="color: #008000;"&gt; * status.PIE if the processor is configured with options that add additional &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;139&lt;/span&gt; &lt;span style="color: #008000;"&gt; * writeable status register bits. These include the MMU, MPU, the enhanced &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;140&lt;/span&gt; &lt;span style="color: #008000;"&gt; * interrupt controller port, and shadow registers. Otherwise, as a performance&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;141&lt;/span&gt; &lt;span style="color: #008000;"&gt; * enhancement, status is overwritten with the prior context. &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;142&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;143&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; ALT_INLINE &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; ALT_ALWAYS_INLINE &lt;br /&gt;&lt;span style="color: #008080;"&gt;144&lt;/span&gt;        alt_irq_enable_all (alt_irq_context context)&lt;br /&gt;&lt;span style="color: #008080;"&gt;145&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt;146&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#if&lt;/span&gt; (NIOS2_NUM_OF_SHADOW_REG_SETS &amp;gt; 0) || (defined NIOS2_EIC_PRESENT) || \&lt;br /&gt;&lt;span style="color: #008080;"&gt;147&lt;/span&gt;     (defined NIOS2_MMU_PRESENT) || (defined NIOS2_MPU_PRESENT)&lt;br /&gt;&lt;span style="color: #008080;"&gt;148&lt;/span&gt;   alt_irq_context status;&lt;br /&gt;&lt;span style="color: #008080;"&gt;149&lt;/span&gt;   &lt;br /&gt;&lt;span style="color: #008080;"&gt;150&lt;/span&gt;   NIOS2_READ_STATUS (status);&lt;br /&gt;&lt;span style="color: #008080;"&gt;151&lt;/span&gt;   &lt;br /&gt;&lt;span style="color: #008080;"&gt;152&lt;/span&gt;   status &amp;amp;= ~NIOS2_STATUS_PIE_MSK;&lt;br /&gt;&lt;span style="color: #008080;"&gt;153&lt;/span&gt;   status |= (context &amp;amp; NIOS2_STATUS_PIE_MSK);&lt;br /&gt;&lt;span style="color: #008080;"&gt;154&lt;/span&gt;   &lt;br /&gt;&lt;span style="color: #008080;"&gt;155&lt;/span&gt;   NIOS2_WRITE_STATUS (status);&lt;br /&gt;&lt;span style="color: #008080;"&gt;156&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;157&lt;/span&gt;   NIOS2_WRITE_STATUS (context);&lt;br /&gt;&lt;span style="color: #008080;"&gt;158&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;159&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;160&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;161&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;162&lt;/span&gt; &lt;span style="color: #008000;"&gt; * The function alt_irq_init() is defined within the auto-generated file&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;163&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_sys_init.c. This function calls the initilization macros for all&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;164&lt;/span&gt; &lt;span style="color: #008000;"&gt; * interrupt controllers in the system at config time, before any other&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;165&lt;/span&gt; &lt;span style="color: #008000;"&gt; * non-interrupt controller driver is initialized.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;166&lt;/span&gt; &lt;span style="color: #008000;"&gt; *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;167&lt;/span&gt; &lt;span style="color: #008000;"&gt; * The "base" parameter is ignored and only present for backwards-compatibility.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;168&lt;/span&gt; &lt;span style="color: #008000;"&gt; * It is recommended that NULL is passed in for the "base" parameter.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;169&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;170&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; alt_irq_init (&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;* &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;171&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;172&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;173&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_irq_cpu_enable_interrupts() enables the CPU to start taking interrupts.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;174&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;175&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; ALT_INLINE &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; ALT_ALWAYS_INLINE &lt;br /&gt;&lt;span style="color: #008080;"&gt;176&lt;/span&gt;        alt_irq_cpu_enable_interrupts ()&lt;br /&gt;&lt;span style="color: #008080;"&gt;177&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt;178&lt;/span&gt;     NIOS2_WRITE_STATUS(NIOS2_STATUS_PIE_MSK&lt;br /&gt;&lt;span style="color: #008080;"&gt;179&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#if&lt;/span&gt; defined(NIOS2_EIC_PRESENT) &amp;amp;&amp;amp; (NIOS2_NUM_OF_SHADOW_REG_SETS &amp;gt; 0)&lt;br /&gt;&lt;span style="color: #008080;"&gt;180&lt;/span&gt;     | NIOS2_STATUS_RSIE_MSK&lt;br /&gt;&lt;span style="color: #008080;"&gt;181&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: #008080;"&gt;182&lt;/span&gt;       );&lt;br /&gt;&lt;span style="color: #008080;"&gt;183&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;184&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;185&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;186&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;187&lt;/span&gt; &lt;span style="color: #008000;"&gt; * Prototypes for the enhanced interrupt API.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;188&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;189&lt;/span&gt; #ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT&lt;br /&gt;&lt;span style="color: #008080;"&gt;190&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;191&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_ic_isr_register() can be used to register an interrupt handler. If the&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;192&lt;/span&gt; &lt;span style="color: #008000;"&gt; * function is succesful, then the requested interrupt will be enabled upon &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;193&lt;/span&gt; &lt;span style="color: #008000;"&gt; * return.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;194&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;195&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; alt_ic_isr_register(alt_u32 ic_id,&lt;br /&gt;&lt;span style="color: #008080;"&gt;196&lt;/span&gt;                         alt_u32 irq,&lt;br /&gt;&lt;span style="color: #008080;"&gt;197&lt;/span&gt;                         alt_isr_func isr,&lt;br /&gt;&lt;span style="color: #008080;"&gt;198&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; *isr_context,&lt;br /&gt;&lt;span style="color: #008080;"&gt;199&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; *flags);&lt;br /&gt;&lt;span style="color: #008080;"&gt;200&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;201&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;202&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_ic_irq_enable() and alt_ic_irq_disable() enable/disable a specific &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;203&lt;/span&gt; &lt;span style="color: #008000;"&gt; * interrupt by using IRQ port and interrupt controller instance.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;204&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;205&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; alt_ic_irq_enable (alt_u32 ic_id, alt_u32 irq);&lt;br /&gt;&lt;span style="color: #008080;"&gt;206&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; alt_ic_irq_disable(alt_u32 ic_id, alt_u32 irq);        &lt;br /&gt;&lt;span style="color: #008080;"&gt;207&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;208&lt;/span&gt;  &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;209&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_ic_irq_enabled() indicates whether a specific interrupt, as&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;210&lt;/span&gt; &lt;span style="color: #008000;"&gt; * specified by IRQ port and interrupt controller instance is enabled.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;211&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;        &lt;br /&gt;&lt;span style="color: #008080;"&gt;212&lt;/span&gt; alt_u32 alt_ic_irq_enabled(alt_u32 ic_id, alt_u32 irq);&lt;br /&gt;&lt;span style="color: #008080;"&gt;213&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;214&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#else&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;215&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;216&lt;/span&gt; &lt;span style="color: #008000;"&gt; * Prototypes for the legacy interrupt API.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;217&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;218&lt;/span&gt; #include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;priv/alt_legacy_irq.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;219&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;220&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;221&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;222&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;223&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_irq_pending() returns a bit list of the current pending interrupts.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;224&lt;/span&gt; &lt;span style="color: #008000;"&gt; * This is used by alt_irq_handler() to determine which registered interrupt&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;225&lt;/span&gt; &lt;span style="color: #008000;"&gt; * handlers should be called.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;226&lt;/span&gt; &lt;span style="color: #008000;"&gt; *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;227&lt;/span&gt; &lt;span style="color: #008000;"&gt; * This routine is only available for the Nios II internal interrupt&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;228&lt;/span&gt; &lt;span style="color: #008000;"&gt; * controller.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;229&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;230&lt;/span&gt; #ifndef NIOS2_EIC_PRESENT&lt;br /&gt;&lt;span style="color: #008080;"&gt;231&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; ALT_INLINE alt_u32 ALT_ALWAYS_INLINE alt_irq_pending (&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080;"&gt;232&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt;233&lt;/span&gt;   alt_u32 active;&lt;br /&gt;&lt;span style="color: #008080;"&gt;234&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;235&lt;/span&gt;   NIOS2_READ_IPENDING (active);&lt;br /&gt;&lt;span style="color: #008080;"&gt;236&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;237&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; active;&lt;br /&gt;&lt;span style="color: #008080;"&gt;238&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;239&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;240&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;241&lt;/span&gt; #ifdef __cplusplus&lt;br /&gt;&lt;span style="color: #008080;"&gt;242&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;243&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; /* __cplusplus */&lt;br /&gt;&lt;span style="color: #008080;"&gt;244&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;245&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; /* __ALT_IRQ_H__ */&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;186行&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #008000;"&gt; * Prototypes for the enhanced interrupt API.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; #ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT&lt;br /&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_ic_isr_register() can be used to register an interrupt handler. If the&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #008000;"&gt; * function is succesful, then the requested interrupt will be enabled upon &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #008000;"&gt; * return.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; alt_ic_isr_register(alt_u32 ic_id,&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;                         alt_u32 irq,&lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;                         alt_isr_func isr,&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; *isr_context,&lt;br /&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; *flags);&lt;br /&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_ic_irq_enable() and alt_ic_irq_disable() enable/disable a specific &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #008000;"&gt; * interrupt by using IRQ port and interrupt controller instance.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; alt_ic_irq_enable (alt_u32 ic_id, alt_u32 irq);&lt;br /&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; alt_ic_irq_disable(alt_u32 ic_id, alt_u32 irq);        &lt;br /&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;  &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_ic_irq_enabled() indicates whether a specific interrupt, as&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #008000;"&gt; * specified by IRQ port and interrupt controller instance is enabled.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;        &lt;br /&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; alt_u32 alt_ic_irq_enabled(alt_u32 ic_id, alt_u32 irq);&lt;br /&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#else&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;span style="color: #008000;"&gt; * Prototypes for the legacy interrupt API.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt; #include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;priv/alt_legacy_irq.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; &lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;我們可以發現，當system.h有定義&lt;strong&gt;ALT_ENHANCED_INTERRUPT_API_PRESENT&lt;/strong&gt;常數時，就有alt_ic_isr_register()可用，若沒定義，則&lt;strong&gt;#inlclude priv/alt_legacy_irq.h&lt;/strong&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;alt_legacy_irq.h / C&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008080;"&gt;  1&lt;/span&gt; #ifndef __ALT_LEGACY_IRQ_H__&lt;br /&gt;&lt;span style="color: #008080;"&gt;  2&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt; __ALT_LEGACY_IRQ_H__&lt;br /&gt;&lt;span style="color: #008080;"&gt;  3&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;  4&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*****************************************************************************&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  5&lt;/span&gt; &lt;span style="color: #008000;"&gt;*                                                                             *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  6&lt;/span&gt; &lt;span style="color: #008000;"&gt;* License Agreement                                                           *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  7&lt;/span&gt; &lt;span style="color: #008000;"&gt;*                                                                             *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  8&lt;/span&gt; &lt;span style="color: #008000;"&gt;* Copyright (c) 2009 Altera Corporation, San Jose, California, USA.           *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  9&lt;/span&gt; &lt;span style="color: #008000;"&gt;* All rights reserved.                                                        *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 10&lt;/span&gt; &lt;span style="color: #008000;"&gt;*                                                                             *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 11&lt;/span&gt; &lt;span style="color: #008000;"&gt;* Permission is hereby granted, free of charge, to any person obtaining a     *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 12&lt;/span&gt; &lt;span style="color: #008000;"&gt;* copy of this software and associated documentation files (the "Software"),  *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 13&lt;/span&gt; &lt;span style="color: #008000;"&gt;* to deal in the Software without restriction, including without limitation   *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 14&lt;/span&gt; &lt;span style="color: #008000;"&gt;* the rights to use, copy, modify, merge, publish, distribute, sublicense,    *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 15&lt;/span&gt; &lt;span style="color: #008000;"&gt;* and/or sell copies of the Software, and to permit persons to whom the       *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 16&lt;/span&gt; &lt;span style="color: #008000;"&gt;* Software is furnished to do so, subject to the following conditions:        *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 17&lt;/span&gt; &lt;span style="color: #008000;"&gt;*                                                                             *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 18&lt;/span&gt; &lt;span style="color: #008000;"&gt;* The above copyright notice and this permission notice shall be included in  *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 19&lt;/span&gt; &lt;span style="color: #008000;"&gt;* all copies or substantial portions of the Software.                         *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 20&lt;/span&gt; &lt;span style="color: #008000;"&gt;*                                                                             *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 21&lt;/span&gt; &lt;span style="color: #008000;"&gt;* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 22&lt;/span&gt; &lt;span style="color: #008000;"&gt;* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,    *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 23&lt;/span&gt; &lt;span style="color: #008000;"&gt;* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 24&lt;/span&gt; &lt;span style="color: #008000;"&gt;* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER      *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 25&lt;/span&gt; &lt;span style="color: #008000;"&gt;* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 26&lt;/span&gt; &lt;span style="color: #008000;"&gt;* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER         *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 27&lt;/span&gt; &lt;span style="color: #008000;"&gt;* DEALINGS IN THE SOFTWARE.                                                   *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 28&lt;/span&gt; &lt;span style="color: #008000;"&gt;*                                                                             *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 29&lt;/span&gt; &lt;span style="color: #008000;"&gt;* This agreement shall be governed in all respects by the laws of the State   *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 30&lt;/span&gt; &lt;span style="color: #008000;"&gt;* of California and by the laws of the United States of America.              *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 31&lt;/span&gt; &lt;span style="color: #008000;"&gt;*                                                                             *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 32&lt;/span&gt; &lt;span style="color: #008000;"&gt;*****************************************************************************&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 33&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 34&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 35&lt;/span&gt; &lt;span style="color: #008000;"&gt; * This file provides prototypes and inline implementations of certain routines&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 36&lt;/span&gt; &lt;span style="color: #008000;"&gt; * used by the legacy interrupt API. Do not include this in your driver or &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 37&lt;/span&gt; &lt;span style="color: #008000;"&gt; * application source files, use "sys/alt_irq.h" instead to access the proper&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 38&lt;/span&gt; &lt;span style="color: #008000;"&gt; * public API.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 39&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 40&lt;/span&gt;  &lt;br /&gt;&lt;span style="color: #008080;"&gt; 41&lt;/span&gt; #include &amp;lt;errno.h&amp;gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 42&lt;/span&gt; #include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;system.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 43&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 44&lt;/span&gt; #ifndef NIOS2_EIC_PRESENT&lt;br /&gt;&lt;span style="color: #008080;"&gt; 45&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 46&lt;/span&gt; #include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;nios2.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 47&lt;/span&gt; #include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;alt_types.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 48&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 49&lt;/span&gt; #include &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;sys/alt_irq.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 50&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 51&lt;/span&gt; #ifdef __cplusplus&lt;br /&gt;&lt;span style="color: #008080;"&gt; 52&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;C&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 53&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 54&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; /* __cplusplus */&lt;br /&gt;&lt;span style="color: #008080;"&gt; 55&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 56&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 57&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_irq_register() can be used to register an interrupt handler. If the &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 58&lt;/span&gt; &lt;span style="color: #008000;"&gt; * function is succesful, then the requested interrupt will be enabled upon &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 59&lt;/span&gt; &lt;span style="color: #008000;"&gt; * return.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 60&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 61&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; alt_irq_register (alt_u32 id, &lt;br /&gt;&lt;span style="color: #008080;"&gt; 62&lt;/span&gt;                              &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;*   context, &lt;br /&gt;&lt;span style="color: #008080;"&gt; 63&lt;/span&gt;                              alt_isr_func handler);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 64&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 65&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 66&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_irq_disable() disables the individual interrupt indicated by "id".&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 67&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 68&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; ALT_INLINE &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; ALT_ALWAYS_INLINE alt_irq_disable (alt_u32 id)&lt;br /&gt;&lt;span style="color: #008080;"&gt; 69&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 70&lt;/span&gt;   alt_irq_context  status;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 71&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;volatile&lt;/span&gt; alt_u32 alt_irq_active;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 72&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 73&lt;/span&gt;   status = alt_irq_disable_all ();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 74&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 75&lt;/span&gt;   alt_irq_active &amp;amp;= ~(&lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;lt;&amp;lt; id);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 76&lt;/span&gt;   NIOS2_WRITE_IENABLE (alt_irq_active);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 77&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 78&lt;/span&gt;   alt_irq_enable_all(status);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 79&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 80&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 81&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 82&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 83&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 84&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_irq_enable() enables the individual interrupt indicated by "id".&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 85&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 86&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; ALT_INLINE &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; ALT_ALWAYS_INLINE alt_irq_enable (alt_u32 id)&lt;br /&gt;&lt;span style="color: #008080;"&gt; 87&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 88&lt;/span&gt;   alt_irq_context  status;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 89&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;volatile&lt;/span&gt; alt_u32 alt_irq_active;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 90&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 91&lt;/span&gt;   status = alt_irq_disable_all ();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 92&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 93&lt;/span&gt;   alt_irq_active |= (&lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;lt;&amp;lt; id);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 94&lt;/span&gt;   NIOS2_WRITE_IENABLE (alt_irq_active);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 95&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 96&lt;/span&gt;   alt_irq_enable_all(status);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 97&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 98&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 99&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt; #ifndef ALT_EXCEPTION_STACK&lt;br /&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_irq_initerruptable() should only be called from within an ISR. It is used&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;104&lt;/span&gt; &lt;span style="color: #008000;"&gt; * to allow higer priority interrupts to interrupt the current ISR. The input&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;105&lt;/span&gt; &lt;span style="color: #008000;"&gt; * argument, "priority", is the priority, i.e. interrupt number of the current&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;106&lt;/span&gt; &lt;span style="color: #008000;"&gt; * interrupt.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;107&lt;/span&gt; &lt;span style="color: #008000;"&gt; *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;108&lt;/span&gt; &lt;span style="color: #008000;"&gt; * If this function is called, then the ISR is required to make a call to&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;109&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_irq_non_interruptible() before returning. The input argument to&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;110&lt;/span&gt; &lt;span style="color: #008000;"&gt; * alt_irq_non_interruptible() is the return value from alt_irq_interruptible().&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;111&lt;/span&gt; &lt;span style="color: #008000;"&gt; *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;112&lt;/span&gt; &lt;span style="color: #008000;"&gt; * Care should be taken when using this pair of functions, since they increasing&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;113&lt;/span&gt; &lt;span style="color: #008000;"&gt; * the system overhead associated with interrupt handling.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;114&lt;/span&gt; &lt;span style="color: #008000;"&gt; *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;115&lt;/span&gt; &lt;span style="color: #008000;"&gt; * If you are using an exception stack then nested interrupts won't work, so&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;116&lt;/span&gt; &lt;span style="color: #008000;"&gt; * these functions are not available in that case.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;117&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;118&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; ALT_INLINE alt_u32 ALT_ALWAYS_INLINE alt_irq_interruptible (alt_u32 priority)&lt;br /&gt;&lt;span style="color: #008080;"&gt;119&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt;120&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;volatile&lt;/span&gt; alt_u32 alt_priority_mask;&lt;br /&gt;&lt;span style="color: #008080;"&gt;121&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;volatile&lt;/span&gt; alt_u32 alt_irq_active;&lt;br /&gt;&lt;span style="color: #008080;"&gt;122&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;123&lt;/span&gt;   alt_u32 old_priority;&lt;br /&gt;&lt;span style="color: #008080;"&gt;124&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;125&lt;/span&gt;   old_priority      = alt_priority_mask;&lt;br /&gt;&lt;span style="color: #008080;"&gt;126&lt;/span&gt;   alt_priority_mask = (&lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;lt;&amp;lt; priority) - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;127&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;128&lt;/span&gt;   NIOS2_WRITE_IENABLE (alt_irq_active &amp;amp; alt_priority_mask);&lt;br /&gt;&lt;span style="color: #008080;"&gt;129&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;130&lt;/span&gt;   NIOS2_WRITE_STATUS (&lt;span style="color: #800080;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;131&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;132&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; old_priority; &lt;br /&gt;&lt;span style="color: #008080;"&gt;133&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;134&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;135&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;136&lt;/span&gt; &lt;span style="color: #008000;"&gt; * See Comments above for alt_irq_interruptible() for an explanation of the use of this&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;137&lt;/span&gt; &lt;span style="color: #008000;"&gt; * function.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;138&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;139&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; ALT_INLINE &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; ALT_ALWAYS_INLINE alt_irq_non_interruptible (alt_u32 mask)&lt;br /&gt;&lt;span style="color: #008080;"&gt;140&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt;141&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;volatile&lt;/span&gt; alt_u32 alt_priority_mask;&lt;br /&gt;&lt;span style="color: #008080;"&gt;142&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;volatile&lt;/span&gt; alt_u32 alt_irq_active;&lt;br /&gt;&lt;span style="color: #008080;"&gt;143&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;144&lt;/span&gt;   NIOS2_WRITE_STATUS (&lt;span style="color: #800080;"&gt;0&lt;/span&gt;);  &lt;br /&gt;&lt;span style="color: #008080;"&gt;145&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;146&lt;/span&gt;   alt_priority_mask = mask;&lt;br /&gt;&lt;span style="color: #008080;"&gt;147&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;148&lt;/span&gt;   NIOS2_WRITE_IENABLE (mask &amp;amp; alt_irq_active);  &lt;br /&gt;&lt;span style="color: #008080;"&gt;149&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;150&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; /* ALT_EXCEPTION_STACK */&lt;br /&gt;&lt;span style="color: #008080;"&gt;151&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;152&lt;/span&gt; #ifdef __cplusplus&lt;br /&gt;&lt;span style="color: #008080;"&gt;153&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;154&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; /* __cplusplus */&lt;br /&gt;&lt;span style="color: #008080;"&gt;155&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;156&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; /* NIOS2_EIC_PRESENT */&lt;br /&gt;&lt;span style="color: #008080;"&gt;157&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;158&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; /* __ALT_LEGACY_IRQ_H__ */&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;61行&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; alt_irq_register (alt_u32 id, &lt;br /&gt;                             &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;*   context, &lt;br /&gt;                             alt_isr_func handler);&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;則是我們所用舊的alt_irq_register()。&lt;/p&gt;&#xD;
&lt;p&gt;至於ISR的prototype新舊不一樣，trace的方式也一樣，就不再贅述。&lt;/p&gt;&#xD;
&lt;p&gt;至於為什麼目前在subsystem的interrupt只能使用舊的ISR register方式，我並不清楚，或許Quartus II未來版本會有所改變。&lt;/p&gt;&#xD;
&lt;p&gt;使用以上方法後，就可正確的在App project收到subsystem的interrupt了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="irq011" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201052357357972.gif" alt="irq011" width="807" height="620" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;我們在本文看到了Qsys與SOPC Builder在subsystem與interrupt的處理有很大的差異，也看到了目前Qsys與Nios II SBT尚有些bug待修正。目前Quartus II 11.0與Quartus II 11.1都還有system.h的bug，相信未來的版本一定會修正這個問題。假如你現在要在subsystem使用interrupt，可暫時使用本文的方式當作short term solution。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Reference&lt;br /&gt;&lt;/strong&gt;[1] &lt;a href="http://www.altera.com/literature/hb/qts/qsys_interconnect.pdf" target="_blank"&gt;Qsys Interconnect&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://www.altera.com/literature/rn/archives/rn_qts_110.pdf" target="_blank"&gt;Quartus II 11.0 Release Notes&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://www.alterawiki.com/wiki/New_Qsys_Issues#Interrupts" target="_blank"&gt;Altera Wiki : New Qsys Issues for Interrupts&lt;/a&gt;&lt;br /&gt;[4] &lt;a href="http://www.altera.com/literature/hb/nios2/n2sw_nii52006.pdf" target="_blank"&gt;Exception Handling&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;全文完。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/oomusou/aggbug/2312573.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/oomusou/archive/2012/01/04/subsystem_interrupt.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/oomusou/archive/2012/01/03/revising_bsp.html</id><title type="text">(原創) Qsys或RTL做修改後，Nios II SBT該如何面對新的硬體? (SOC) (Nios II) (Qsys)</title><summary type="text">SOPC最可貴之處就是它的彈性，所以儘管已經建立了Nios II SBT project，你還可以去更改FPGA的RTL或者Qsys的架構與IP，此時Nios II SBT project該做哪些步驟才能反映出更改過的硬體架構呢?是該Generate BSP？還是該BSP Editor?或者該Build Project?其執行順序又是如何呢？</summary><published>2012-01-03T12:51:00Z</published><updated>2012-01-03T12:51:00Z</updated><author><name>真 OO无双</name><uri>http://www.cnblogs.com/oomusou/</uri></author><link rel="alternate" href="http://www.cnblogs.com/oomusou/archive/2012/01/03/revising_bsp.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/oomusou/archive/2012/01/03/revising_bsp.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;br&gt;SOPC最可貴之處就是它的彈性，所以儘管已經建立了Nios II SBT project，你還可以去更改FPGA的RTL或者Qsys的架構與IP，此時Nios II SBT project該做哪些步驟才能反映出更改過的硬體架構呢?是該Generate BSP？還是該BSP Editor?或者該Build Project?其執行順序又是如何呢？&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Introduction&lt;br&gt;使用環境：Windows XP SP3 + VirtualBox 4.1.2 + Quartus II 11.0&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;自從使用Nios II SBT，每次Qsys或者FPGA的RTL做修改後，就一直猶豫到底要只執行Build Project就好?還是要先Clean Project?還是必須先執行Generate BSP?那BSP Editor也要執行嗎?因為有時總會有些不可預期的錯誤產生，一直到我看到[1] &lt;a href="http://www.altera.com/literature/hb/nios2/n2sw_nii52015.pdf" target="_blank"&gt;Nios II Software Build Tools&lt;/a&gt;的p.4-30的&lt;strong&gt;&lt;font color="#008080"&gt;Revising Your BSP&lt;/font&gt;&lt;/strong&gt;章節，所有的疑問才豁然開朗。建議你也完整的看一下[1] &lt;a href="http://www.altera.com/literature/hb/nios2/n2sw_nii52015.pdf" target="_blank"&gt;Nios II Software Build Tools&lt;/a&gt;的&lt;strong&gt;&lt;font color="#008080"&gt;Revising Your BSP&lt;/font&gt;&lt;/strong&gt;章節。本文只是個人理解下的總結，不能取代Altera的官方資料。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Generate BSP&lt;/strong&gt;：其執行流程如下：&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="revise004" border="0" alt="revise004" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201032205404267.gif" width="323" height="500"&gt; &lt;/p&gt; &lt;p&gt;值得注意的是Generate BSP會重新根據*.sopcinfo去產生drivers /HAL，也就是說若你在Qsys移除了某個IP，Generate BSP會自動幫你刪除drivers / HAL相關的檔案，且你之前若手動對drivers / HAL的C code做了修改，Generate BSP也會重新覆蓋過去，所以不建議手動去修改drivers / HAL的C code，應該由Generate BSP自動去產生即可。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;BSP Editor&lt;/strong&gt;：修改settings.bsp的設定，主要是偏韌體方面的設定。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Clean Project&lt;/strong&gt;：相當於make clean，會將所有的object files刪除，由於若你在Qsys刪除某個IP，在Generate BSP會刪除該IP的drivers / HAL檔案，卻不會刪除該IP的object files，因此必須手動用Clean Project刪除。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Build Project&lt;/strong&gt;：相當於make all，會重新根據Makefile編譯所有檔案。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Conclusion&lt;br&gt;&lt;/strong&gt;大部分的人都知道最後是Clean Project與Build Project，這點問題不大，但Generate BSP與BSP Editor該誰先執行呢?&lt;strong&gt;&lt;font color="#008080"&gt;答案是應先執行Generate BSP再執行BSP Editor&lt;/font&gt;&lt;/strong&gt;，因為若先執行BSP Editor，你所做的設定是根據舊*.sopcinfo的settings.bsp所做的設定，並無法反映出最新的硬體，所以必須先執行Generate BSP後，先產生出反應最新硬體的settings.bsp，然後再執行BSP Editor。&lt;/p&gt; &lt;p&gt;總結其流程如下：&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="revise006" border="0" alt="revise006" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201042258147877.gif" width="552" height="482"&gt;&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;See Also&lt;br&gt;&lt;/strong&gt;&lt;a href="http://www.cnblogs.com/oomusou/archive/2011/12/21/nios2_project_moved.html"&gt;(原創) 如何解決目錄改變時，Nios II project無法編譯的問題? (SOC) (Nios II) (DE2-70)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;br&gt;[1] &lt;a href="http://www.altera.com/literature/hb/nios2/n2sw_nii52015.pdf" target="_blank"&gt;Nios II Software Build Tools&lt;/a&gt;&lt;br&gt;[2] &lt;a href="http://www.altera.com/literature/hb/nios2/n2sw_nii52016.pdf" target="_blank"&gt;Nios II Software Build Tools Reference&lt;/a&gt;&lt;/p&gt; &lt;p&gt;全文完。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/oomusou/aggbug/2311309.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/oomusou/archive/2012/01/03/revising_bsp.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/oomusou/archive/2011/12/21/nios2_project_moved.html</id><title type="text">(原創) 如何解決目錄改變時，Nios II project無法編譯的問題? (SOC) (Nios II) (DE2-70)</title><summary type="text">若我們從網路上下載範例程式，或者從書上的光碟將範例程式複製到硬碟時，只要是Quartus II版本正確，都可以正常地開啟Quartus II project並且編譯之，但Nios II project卻常常雖然能開啟，卻無法正常編譯，本文討論其root cause並提出解決方式。</summary><published>2011-12-21T13:48:00Z</published><updated>2011-12-21T13:48:00Z</updated><author><name>真 OO无双</name><uri>http://www.cnblogs.com/oomusou/</uri></author><link rel="alternate" href="http://www.cnblogs.com/oomusou/archive/2011/12/21/nios2_project_moved.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/oomusou/archive/2011/12/21/nios2_project_moved.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;br&gt;若我們從網路上下載範例程式，或者從書上的光碟將範例程式複製到硬碟時，只要是Quartus II版本正確，都可以正常地開啟Quartus II project並且編譯之，但Nios II project卻常常雖然能開啟，卻無法正常編譯，本文討論其root cause並提出解決方式。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Introduction&lt;br&gt;使用環境：Windows XP SP3 + VirtualBox 4.1.2 + Quartus II 11.0&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;本文將討論以下主題：&lt;/p&gt; &lt;p&gt;1.為什麼會需要改變目錄名稱或目錄位置?&lt;/p&gt; &lt;p&gt;2.改變目錄名稱或目錄位置，在Nios II project會遇到什麼問題?&lt;/p&gt; &lt;p&gt;3.Root cause與解決方法。&lt;/p&gt; &lt;p&gt;4.使用Blank Project方法所面臨的問題。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;1.為什麼會需要改變目錄名稱或目錄位置?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;我們常會有各種理由會改變原來project的目錄名稱或目錄位置：&lt;/p&gt; &lt;p&gt;1.為了管理方便，可能將原來在d:\project\的所有project移到e:\project\下&lt;/p&gt; &lt;p&gt;2.同事將project整個目錄壓縮給我，因為我並不知道該project放在同事電腦什麼工作目錄下，所以我將壓縮檔解壓縮到我自己的工作目錄下&lt;/p&gt; &lt;p&gt;3.從網路上下載整包範例程式的壓縮檔後，因為我並不知道原本範例程式所存放的目錄，所以我將壓縮檔解壓縮到我自己的工作目錄下&lt;/p&gt; &lt;p&gt;4.從書上光碟複製範例程式到硬碟，因為我並不知道原本範例程式所存放的目錄，所以我將範例程式複製到我自己的工作目錄下&lt;/p&gt; &lt;p&gt;5.新的project與舊的project類似，想從舊的project去做修改即可，開了一個新的目錄，將舊的project所有檔案複製到新的目錄下&lt;/p&gt; &lt;p&gt;6.為了管理方便，想改變原本project的目錄名稱&lt;/p&gt; &lt;p&gt;以上的情形，若是純粹Quartus II project，只要Quartus II版本正確，開啟*.qpf檔即可順利開啟，並且正常編譯，唯一有問題的是Programmer的*.cdf檔可能因為路徑不對無法寫入，只是重新指定*.sof與*.pof的位置即可。&lt;/p&gt; &lt;p&gt;Quartus II的*.qpf project概念類似Visual C++ 6的*.dsw或者Visual Studio的*.sln，整個project內的檔案是相對路徑，所以改變專案名稱或者改變目錄位置都沒有關係，只要檔案相對位置沒有改變，整個project就可以正常運作。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;span style="color: #008080"&gt;但是Nios II project就沒這麼單純了!!&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Nios II SBT是用Eclipse去改的，用的是Eclipse的workspace概念，很類似Visual Studio的*.sln概念，但又不完全一樣。Eclipse允許你在一個workspace下，去管理多個project，workspace記住的是project的&lt;strong&gt;&lt;span style="color: #008080"&gt;絕對路徑&lt;/span&gt;&lt;/strong&gt;，所以當你Nios II project目錄名稱改變，或者目錄位置改變，該workspace自然就找不到了。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;span style="color: #008080"&gt;依照Eclipse workspace哲學的正規解法，此時你應該將目錄改變的Nios II project重新Import到你的workspace下&lt;/span&gt;&lt;/strong&gt;。但事實上真的如此嗎?&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2.改變目錄名稱或目錄位置，在Nios II project會遇到什麼問題?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;我們實際做個實驗，如下圖所示，原本&lt;strong&gt;&lt;span style="color: #008080"&gt;DE2_70_SOPC_golden_mini&lt;/span&gt;&lt;/strong&gt;是一個在Quartus II與Nios II SBT都完全正常的project。&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_00" border="0" alt="nios2_path_00" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112272230338713.gif" width="807" height="620"&gt;&lt;/p&gt; &lt;p&gt;我們現在將目錄名稱改變，從&lt;strong&gt;&lt;span style="color: #008080"&gt;DE2_70_SOPC_golden_mini&lt;/span&gt;&lt;/strong&gt;改成&lt;strong&gt;&lt;span style="color: #008080"&gt;DE2_70_SOPC_golden_mini2&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_01" border="0" alt="nios2_path_01" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112272230386667.gif" width="807" height="620"&gt;&lt;/p&gt; &lt;p&gt;大家都知到改變目錄名稱或目錄位置不會影響Quartus II project的開啟與編譯，所以就略過不討論，現在將焦點放在Nois II project部分。&lt;/p&gt; &lt;p&gt;開啟Nios II SBT，將workspace目錄切換到新的目錄&lt;strong&gt;&lt;span style="color: #008080"&gt;DE2_70_SOPC_golden_mini2&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_02" border="0" alt="nios2_path_02" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112272315362919.gif" width="613" height="227"&gt;&lt;/p&gt; &lt;p&gt;開啟後顯示更改目錄名稱之前的2個project：&lt;strong&gt;&lt;span style="color: #008080"&gt;hello_world&lt;/span&gt;&lt;/strong&gt;與&lt;span style="color: #008080"&gt;&lt;strong&gt;hello_world_bsp&lt;/strong&gt;&lt;/span&gt;，由於現在目錄名稱已經改變，所以只能看到project名稱，卻完全無法開啟。&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_03" border="0" alt="nios2_path_03" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112272315472896.gif" width="807" height="620"&gt;&lt;/p&gt; &lt;p&gt;由於2個project已經無法開啟，我們將這2個project從workspace中刪除之。&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_04" border="0" alt="nios2_path_04" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/20111227231552459.gif" width="807" height="620"&gt;&lt;/p&gt; &lt;p&gt;刪除完後，整個workspace完全沒有任何project。&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_05" border="0" alt="nios2_path_05" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112272315564759.gif" width="807" height="620"&gt;&lt;/p&gt; &lt;p&gt;根據Eclipse哲學的&lt;strong&gt;&lt;span style="color: #008040"&gt;&lt;span style="color: #008080"&gt;正規解法&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;：&lt;strong&gt;&lt;span style="color: #008080"&gt;因為目錄已經改變，我們必須將2個project使用import的方式載入到新的workspace。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_06" border="0" alt="nios2_path_06" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112272316067485.gif" width="807" height="620"&gt;&lt;/p&gt; &lt;p&gt;由於之前是使用Nios II SBT產生makefile的project，所以在此選擇&lt;strong&gt;&lt;span style="color: #008080"&gt;Import Nios II Software Build Tools Project&lt;/span&gt;&lt;/strong&gt;。&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_07" border="0" alt="nios2_path_07" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112272316111012.gif" width="525" height="547"&gt;&lt;/p&gt; &lt;p&gt;首先將hello_world project import進來，值得注意的是：要將&lt;strong&gt;&lt;span style="color: #008080"&gt;Clean project when importing&lt;/span&gt;&lt;/strong&gt;打勾，也就是在import project完時，馬上執行make clean，將之前所留下的object file全部清除。&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_08" border="0" alt="nios2_path_08" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112272316128112.gif" width="548" height="549"&gt;&lt;/p&gt; &lt;p&gt;import完成後，顯示了以下的warning，告訴我們project想include舊的專案路徑的目錄，但因為目錄名稱改變，所以include失敗。這是第1個問題。&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_09" border="0" alt="nios2_path_09" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112272316182610.gif" width="807" height="620"&gt;&lt;/p&gt; &lt;p&gt;接下繼續import hello_world_bsp，也記得將&lt;span style="color: #008080"&gt;&lt;strong&gt;Clean project when importing&lt;/strong&gt;&lt;/span&gt;打勾。&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_10" border="0" alt="nios2_path_10" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112272316196679.gif" width="640" height="550"&gt;&lt;/p&gt; &lt;p&gt;import完成後，並沒有顯示任何錯誤訊息與warning。&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_11" border="0" alt="nios2_path_11" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112272316327717.gif" width="807" height="620"&gt;&lt;/p&gt; &lt;p&gt;若在hello_world_bsp執行Nios II –&amp;gt; Generate BSP，會出現以下錯誤訊息，表示找不到*.sopcinfo。這是第2個問題。&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_12" border="0" alt="nios2_path_12" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112272316387298.gif" width="370" height="317"&gt;&lt;/p&gt; &lt;p&gt;若在hello_world_bsp執行Nios II –&amp;gt; BSP Editor會出現以下錯誤訊息，表示找不到*.sopcinfo。這是第3個問題。&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_13" border="0" alt="nios2_path_13" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112272316439712.gif" width="807" height="620"&gt;&lt;/p&gt; &lt;p&gt;若實際Build App project(hello_world)與BSP project，雖然仍可出現*.elf與*.a，但會出現以下錯誤訊息，表示Makefile找不到*.sopcinfo。這是第4個問題。&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_005" border="0" alt="nios2_path_005" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011314156355.gif" width="807" height="620"&gt;&lt;/p&gt; &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_006" border="0" alt="nios2_path_006" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011314209415.gif" width="807" height="620"&gt;&lt;/p&gt; &lt;p&gt;總結以上實驗，我們發現若改變目錄名稱或者目錄位置，在Nios II project會出現以下4個問題：&lt;/p&gt; &lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;1.App project(hello_world)會出現include path not found warning。&lt;br&gt;2.BSP project(hello_world_bsp)會無法執行Generate BSP。&lt;br&gt;3.BSP project(hello_world_bsp)會無法執行BSP Editor。&lt;br&gt;4.Build App project(hello_world)與BSP project(hello_world_bsp)會出現Makefile找不到SOPC File的warning。&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.Root cause與解決方法。&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;App project (hello_world) ：include path not found warning的Root cause&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在hello_world的Properties的C/C++ General –&amp;gt; Paths and Symbols的GNC C與GNC C++，我們可以發現Include directories的目錄錯了，抓的都是修改前的目錄名稱，且這些目錄名稱還無法刪除或者修改，因為這是Eclipse自動抓的，這是第1個問題的root cause。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_003" border="0" alt="nios2_path_003" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011314211824.gif" width="1010" height="543"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_004" border="0" alt="nios2_path_004" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011314492789.gif" width="1010" height="543"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;App project (hello_world) ：include path not found warning的Solution&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Step 1：&lt;/strong&gt;&lt;strong&gt;App project (hello_world)的properties&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_007" border="0" alt="nios2_path_007" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011341162351.gif" width="808" height="776"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Step 2：C/C++ Build –&amp;gt; Discovery Options的Cygwin C Compier，按下Clear清除目前所抓的include path。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_008" border="0" alt="nios2_path_008" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011341251327.gif" width="1010" height="650"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;提示include path即將清除，將在Build時重新抓取include path，按『OK』繼續。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_009" border="0" alt="nios2_path_009" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011341261751.gif" width="522" height="131"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Step 4：C/C++ Build –&amp;gt; Discovery Options的Cygwin C++ Compier，按下Clear清除目前所抓的include path。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_010" border="0" alt="nios2_path_010" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011341303830.gif" width="1010" height="650"&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;提示include path即將清除，將在Build時重新抓取include path，按『OK』繼續。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_011" border="0" alt="nios2_path_011" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011341319097.gif" width="522" height="131"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Step 5：檢查目前App project (hello_world)的include path&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;C/C++ General –&amp;gt; Paths and Symbols的Includes的GNC C，確定已經清除所有的include paths&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_012" border="0" alt="nios2_path_012" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011341412118.gif" width="1010" height="650"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;C/C++ General –&amp;gt; Paths and Symbols的Includes的GNC C++，確定已經清除所有的include paths&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_013" border="0" alt="nios2_path_013" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011341428988.gif" width="1010" height="650"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;原本App project (hello_world)的warnings也都不見了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_014" border="0" alt="nios2_path_014" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/20120101134143317.gif" width="807" height="620"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;看到這裡，或許你會說：『不是應該要include新目錄的BSP project路徑才對嗎?』沒錯，如同Step 3與Step 4的提示所言，最後只要重新Build App project (hello_world)，就會重新discover include path，這我們等BSP project也解決後再一起重新Build。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;BSP project (hello_world_bsp)無法Generate BSP的Root cause&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;首先了解Nios II SBT的Generate BSP到底做了什麼事情，根據[3] &lt;a href="http://www.altera.com/literature/hb/nios2/n2sw_nii52016.pdf" target="_blank"&gt;Nios II Software Build Tools Reference&lt;/a&gt;的p.15-8的&lt;strong&gt;&lt;span style="color: #008080"&gt;nios2-bsp-generate-files&lt;/span&gt;&lt;/strong&gt;與[4] &lt;a href="http://www.altera.com/literature/hb/nios2/n2sw_nii52015.pdf" target="_blank"&gt;Nios II Software Build Tools&lt;/a&gt;的p.4-30的&lt;strong&gt;&lt;span style="color: #008080"&gt;Regenerating Your BSP&lt;/span&gt;&lt;/strong&gt;所述，Generate BSP會根據BSP project的settings.bsp去尋找*.sopcinfo，再根據目前的*.sopcinfo去產生最新的drivers與HAL目錄所需要的檔案以及重新產生Makefile。&lt;/p&gt;&#xD;
&lt;p&gt;打開settings.bsp，會發現BspGeneratedLocation與SopcDesignFile所記錄的路徑都是改變目錄名稱之前的路徑，因此在Generate BSP時會找不到*.sopcinfo而導致執行錯誤。這是第2個問題的root cause。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_015" border="0" alt="nios2_path_015" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/20120101144038265.gif" width="807" height="620"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;BSP project (hello_world_bsp)無法Generate BSP的Solution&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Step 1：修改BspGeneratedLocation與SopcDesignFile的路徑&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_016" border="0" alt="nios2_path_016" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011440495762.gif" width="807" height="620"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;修改完存檔時會出現以下錯誤訊息，主要是BspGeneratedTimStamp使用了中文時間，按下『Save as UTF-8』格式存檔即可。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_26" border="0" alt="nios2_path_26" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112300011154126.gif" width="541" height="178"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Step 2：重新Generate BSP&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;可順利執行Generate BSP沒有任何錯誤訊息。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_018" border="0" alt="nios2_path_018" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011441004606.gif" width="806" height="619"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;BSP project (hello_world_bsp)無法執行BSP Editor的Root cause&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;BSP Editor主要的目的在於修改settings.bsp一些只與BSP project相關的設定，BSP Editor無法執行，主要原因也是因為找不到*.sopcinfo。這是第3個問題的root cause。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;BSP project (hello_world_bsp)無法執行BSP Editor的Solution&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在之前的步驟已經修改過settings.bsp的*.sopcinfo路徑，所以也一併解決了這個問題，不必再做其他修改。&lt;/p&gt;&#xD;
&lt;p&gt;重新執行BSP Editor，可正常執行沒有任何錯誤訊息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_019" border="0" alt="nios2_path_019" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011441017016.gif" width="807" height="618"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Build App project (hello_world)與BSP project (hello_world_bsp)會出現Makefile找不到SOPC File的warning的Root cause&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;App project (hello_world)與BSP project (hello_world_bsp)在Build時，事實上就是執行Make動作，所以需要參考Makefile，會出現warning主要是因為Makefile找不到*.sopcinfo。這是第4個問題的root cause。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Build App project (hello_world)與BSP project (hello_world_bsp)會出現Makefile找不到SOPC File的warning的Solution&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;理論上應該要去修改Makefile，不過由於執行Generate BSP時，&lt;strong&gt;&lt;span style="color: #008080"&gt;nios2-bsp-generate-files&lt;/span&gt;&lt;/strong&gt;已經根據修改過的settings.bsp更新過Makefile，所以我們不須再手動修改Makefile了。&lt;/p&gt;&#xD;
&lt;p&gt;重新Build BSP project (hello_world_bsp)，可順利Build沒有任何錯誤訊息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_020" border="0" alt="nios2_path_020" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011441132663.gif" width="807" height="620"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最後重新Build App project (hello_world)，也可順利Build沒有任何錯誤訊息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_021" border="0" alt="nios2_path_021" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011441177217.gif" width="807" height="620"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;還記得在App project (hello_world) ：include path not found warning的Solution時，我們只清除了App project所include的錯誤路徑，但卻還沒有將正確地修正include路徑。&lt;/p&gt;&#xD;
&lt;p&gt;在Build完後App project (hello_world)後，馬上觀察hello_world的Properties的C/C++ General –&amp;gt; Paths and Symbols的GNC C與GNC C++，會發現正確的include路徑都回來了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_022" border="0" alt="nios2_path_022" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011441181786.gif" width="1010" height="650"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_023" border="0" alt="nios2_path_023" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011441229721.gif" width="1010" height="650"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;之前的洋洋灑灑，只是因為要邊解釋root cause邊介紹solution，其實整個步驟很簡單，只要5個步驟即可。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_36" border="0" alt="nios2_path_36" src="http://images.cnblogs.com/cnblogs_com/oomusou/201201/201201011526311017.gif" width="674" height="482"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4.使用Blank Project方法所面臨的問題&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;Nios II project只要改變路徑就無法編譯的問題，其實從我使用Quartus II 6.0時就已經發現了，應該說Nios II要使用Eclipse，就注定會有這個workspace的問題，很多人的解法(包括我自己)都與[2] &lt;a href="http://www.cnblogs.com/yuphone/" target="_blank"&gt;张亚峰&lt;/a&gt;的&lt;a href="http://www.cnblogs.com/yuphone/archive/2011/10/24/2222207.html"&gt;[笔记].为何在Nios II SBTE中，直接拖放到工程文件夹的文件，编译会出错？&lt;/a&gt;一樣，都是重新開1個blank project，然後重新將所需要的*.c, *.cpp拖放進新建的blank project，最後在手動去修改Makefile，這樣的解法的確是可以避開include paths錯誤與*.sopcinfo路徑錯誤的問題，不過settings.bsp與Makefile都是新的，所以必須手動去檢查Makefile是否與原project一樣，然後手動修改Makefile。&lt;/p&gt;&#xD;
&lt;p&gt;在[1] &lt;a href="http://www.altera.com/literature/hb/nios2/n2sw_nii52017.pdf" target="_blank"&gt;Getting Started with the Graphical User Interface&lt;/a&gt;的p.2-11的User Source Management有以下一段文字：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nios2_path_35" border="0" alt="nios2_path_35" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112300012068179.gif" width="552" height="59"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;簡單的說，就是既然你用了Nios II SBT，就不建議手動去改Makefile，應該採用GUI或者Command line script的方式，由tools去更改你的Makefile，而不該手動去更改你的Makefile。本文採用的方式，雖然知道Makefile有問題，但依照Nios II SBT的邏輯，使用了Nios II SBT的GUI方式與流程去修改Makefile，完全沒有手動去修改Makefile，這樣可確定Makefile的正確性，也省去了一一比對原本Makefile的功夫。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;完整程式碼下載&lt;/strong&gt;&lt;br&gt;&lt;a href="http://files.cnblogs.com/oomusou/DE2_70_SOPC_golden_mini2.7z"&gt;DE2_70_SOPC_golden_mini2.7z&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;br&gt;&lt;/strong&gt;這篇博文中的解法，是參考了Altera的官方資料所做出的總結，並經過無數次的實驗所歸納的心得， 因為這是我困擾好幾年的問題，假如你也為Nios II project路徑問題而困擾，可以參考本文的解法。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;See Also&lt;br&gt;&lt;/strong&gt;&lt;a href="http://www.cnblogs.com/oomusou/archive/2012/01/03/revising_bsp.html"&gt;(原創) Qsys或RTL做修改後，Nios II SBT該如何面對新的硬體? (SOC) (Nios II) (Qsys)&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;br&gt;[1] &lt;a href="http://www.altera.com/literature/hb/nios2/n2sw_nii52017.pdf" target="_blank"&gt;Getting Started with the Graphical User Interface&lt;/a&gt;&lt;br&gt;[2] &lt;a href="http://www.cnblogs.com/yuphone/" target="_blank"&gt;张亚峰&lt;/a&gt;的&lt;a href="http://www.cnblogs.com/yuphone/archive/2011/10/24/2222207.html"&gt;[笔记].为何在Nios II SBTE中，直接拖放到工程文件夹的文件，编译会出错？&lt;/a&gt;&lt;br&gt;[3] &lt;a href="http://www.altera.com/literature/hb/nios2/n2sw_nii52016.pdf" target="_blank"&gt;Nios II Software Build Tools Reference&lt;/a&gt;&lt;br&gt;[4] &lt;a href="http://www.altera.com/literature/hb/nios2/n2sw_nii52015.pdf" target="_blank"&gt;Nios II Software Build Tools&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;全文完。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/oomusou/aggbug/2296317.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/oomusou/archive/2011/12/21/nios2_project_moved.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/oomusou/archive/2011/12/20/nios2_qsys_generate.html</id><title type="text">(原創) Qsys Generation Tab的Simulation設定的意義 (SOC) (Nios II) (Qsys)</title><summary type="text">若要對含有Nios II的SOPC系統進行simulation，在Qsys的Generation Tab有新的設定，本文討論其設定的意義。 </summary><published>2011-12-20T15:38:00Z</published><updated>2011-12-20T15:38:00Z</updated><author><name>真 OO无双</name><uri>http://www.cnblogs.com/oomusou/</uri></author><link rel="alternate" href="http://www.cnblogs.com/oomusou/archive/2011/12/20/nios2_qsys_generate.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/oomusou/archive/2011/12/20/nios2_qsys_generate.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;br /&gt;若要對含有Nios II的SOPC系統進行simulation，在Qsys的Generation Tab有新的設定，本文討論其設定的意義。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Introduction&lt;br /&gt;使用環境：Windows XP SP3 + VirtualBox 4.1.2 + Quartus II 11.0&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在Qsys的Generation tab的Simulation部分，有以下的設定：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="nios2_sim00" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/2011122023381078.gif" alt="nios2_sim00" width="581" height="503" border="0" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;根據[1] &lt;strong&gt;Quartus II Handbook 11.0 Volumn 1：Section II Chapter 5&lt;/strong&gt;的&lt;strong&gt;P.5-12&lt;/strong&gt;，對各選項的設定解釋如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/17820/2011122110360828.gif" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我個人是對以上的解釋有看沒有懂，以下是我實驗後的總結：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Create simulation model&lt;/strong&gt;：Qsys會產生simulation model與testbench，但不會產生命名為xxx_tb.sys的testbench Qsys system，這種就類似FPGA不使用SOPC時，在top module自己將所有module手動接起來一樣。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Create testbench Qsys system&lt;/strong&gt;：Qsys會幫你產生命名為xxx_tb.sys的testbench Qsys system，而這個testbench Qsys system就相當於simulation的top module。值得注意的是：這個選項只會幫你建立1個testbench Qsys system，並不會建立testbench與simulation model。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Standard, BFMs for standard Avalon interfaces&lt;/strong&gt;：所建立的testbench Qsys system會掛上所有的simulation model，包含各種記憶體與其他周邊，這是最完整的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Simple, BFMs for clocks and resets&lt;/strong&gt;：根據Altera的官方解釋，看起來所建立的testbench Qsys system只會掛上clocks與reset simulation model，&lt;strong&gt;&lt;span style="color: #008080;"&gt;事實上還會掛上所有記憶體的simulation model&lt;/span&gt;&lt;/strong&gt;，其實這是合理的，因為Nios II要跑C code，一定要有記憶體才能跑，而且在Nios II SBT的Run As ModelSim時，會根據Linker Script的定義，產生要載入各種記憶體的*.hex或*.dat然後載入到各記憶體的simulation model。值得注意的是：&lt;strong&gt;&lt;span style="color: #008080;"&gt;這個選項不會掛上記憶體以外周邊的simulation model&lt;/span&gt;&lt;/strong&gt;，所以Qsys在Generate時會快一些。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Create testbench simulation model：&lt;/strong&gt;此選項會根據之前所產生的testbench Qsys system去產生testbench與simulation model。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;實務上該如何設定這些選項呢?根據[2] &lt;a href="http://www.altera.com/support/examples/nios2/exm-simulating-niosii.html" target="_blank"&gt;Simulating Nios II Embedded Processor Designs&lt;/a&gt;，建議使用以下設定：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #008080;"&gt;Create simulation model：None&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #008080;"&gt;Create testbench Qsys system：Standard, BFMs for standard Avalon interfaces&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #008080;"&gt;Create testbench simulation model：Verilog&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;理由是既然選擇使用testbench Qsys system，就不用再選擇使用『Create simulation model』，而且Standard, BFMs for standard Avalon interfaces可以產生最完整的testbench與simulation model，包含系統所有的記憶體與周邊。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;br /&gt;[1] Quartus II Handbook 11.0 Volumn 1：Section II Chapter 5的P.5-12&lt;br /&gt;[2] &lt;a href="http://www.altera.com/support/examples/nios2/exm-simulating-niosii.html" target="_blank"&gt;Simulating Nios II Embedded Processor Designs&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;全文完。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/oomusou/aggbug/2295287.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/oomusou/archive/2011/12/20/nios2_qsys_generate.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/oomusou/archive/2011/12/08/nios2_spi.html</id><title type="text">(原創) 如何在Nios II使用SPI Core? (SOC) (Nios II) (Qsys) (DE2-70)</title><summary type="text">SPI為IC之間溝通中常見的介面，Qsys已經提供SPI Core，Nios II可以直接使用，本文詳細探討SPI core的使用方式以及實務上該如何開發使用SPI介面的韌體。</summary><published>2011-12-08T14:04:00Z</published><updated>2011-12-08T14:04:00Z</updated><author><name>真 OO无双</name><uri>http://www.cnblogs.com/oomusou/</uri></author><link rel="alternate" href="http://www.cnblogs.com/oomusou/archive/2011/12/08/nios2_spi.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/oomusou/archive/2011/12/08/nios2_spi.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;br /&gt;SPI為IC之間溝通中常見的介面，Qsys已經提供SPI Core，Nios II可以直接使用，本文詳細探討SPI core的使用方式以及實務上該如何開發使用SPI介面的韌體。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Introduction&lt;br /&gt;使用環境：Windows XP SP3 + VirtualBox 4.1.2 + Quartus II 11.0 +&amp;nbsp; + DE2-70&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;實務上IC最常見的3大通訊介面：I2C、SPI與UART，其中Qsys已經內建SPI core，Nios II可以直接使用。&lt;/p&gt;&#xD;
&lt;p&gt;本文將討論以下主題：&lt;/p&gt;&#xD;
&lt;p&gt;1.SPI Bus簡介&lt;/p&gt;&#xD;
&lt;p&gt;2.Qsys的SPI Core簡介&lt;/p&gt;&#xD;
&lt;p&gt;3.詳細探討alt_avalon_spi_command()的內部運作機制&lt;/p&gt;&#xD;
&lt;p&gt;4.實際使用SPI Core存取SPI Flash&lt;/p&gt;&#xD;
&lt;p&gt;5.實際開發存取SPI Flash的SDK&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.SPI Bus簡介&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在DE2-70平台上的IC，唯有TRDB-LTM這個Touch Panel的觸控IC使用SPI將觸控的座標傳回，使用上較為複雜，若初學者只想單純的學習SPI，恐怕會模糊焦點，因此我特地找了一顆使用SPI的Flash，透過GPIO與DE2-70連接，如此就可在Nios II使用SPI core對Flash的register做read/write，也能實際對Flash做讀寫。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="spi000" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112090803532212.gif" alt="spi000" width="585" height="388" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="spi001" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112090804154033.gif" alt="spi001" width="585" height="403" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;SPI為&lt;strong&gt;&lt;span style="color: #008080;"&gt;Serial Peripheral Interface&lt;/span&gt;&lt;/strong&gt;縮寫，為Motorola所制定的標準，總共只有4根1 bit的信號，如下圖所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="spi002" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112181616401092.gif" alt="spi002" width="572" height="191" border="0" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;SCLK：為&lt;strong&gt;&lt;span style="color: #008080;"&gt;Serial Clock&lt;/span&gt;&lt;/strong&gt;縮寫，由master所產生的clock給slave使用。&lt;/p&gt;&#xD;
&lt;p&gt;MOSI：為&lt;strong&gt;&lt;span style="color: #008080;"&gt;Master Output Slave Input&lt;/span&gt;&lt;/strong&gt;縮寫，由master output至slave input。&lt;/p&gt;&#xD;
&lt;p&gt;MISO：為&lt;strong&gt;&lt;span style="color: #008080;"&gt;Master Input Slave Output&lt;/span&gt;&lt;/strong&gt;縮寫，由slave output至master input。&lt;/p&gt;&#xD;
&lt;p&gt;SS_N：為&lt;strong&gt;&lt;span style="color: #008080;"&gt;Slave Select&lt;/span&gt;&lt;/strong&gt;縮寫，由master告知slave是否enable。(active low)。&lt;/p&gt;&#xD;
&lt;p&gt;在多SPI slave的環境下，會以如下圖的方式連接：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="spi003" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112181635406015.gif" alt="spi003" width="581" height="414" border="0" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;其中SPI master會有n個SS_N port對應SPI slave 0, SPI slave 1&amp;hellip;的SS_N，當該SPI slave的SS_N為low時，表示master選定了該slave。&lt;/p&gt;&#xD;
&lt;p&gt;其中較特殊的是master與slave的MISO port連接時，須加上一個tristate buffer，使該slave沒有被master選取時，MISO為Hi-Z，如此才能避免兩個slave同時drive一個MISO。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Clock polarity and phase&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;SPI根據其clock polarity與clock phase的排列組合，總共有以下4種可能：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Clock Polarity = 0, Clock Phase = 0&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="spi004" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112181715413167.gif" alt="spi004" width="584" height="162" border="0" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;1.SCLK在idle時為low。&lt;/p&gt;&#xD;
&lt;p&gt;2.MOSI在SCLK的rising edge時被latch，在SCLK的falling edge時做transition。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Clock Polarity = 0, Clock Phase = 1&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="spi005" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112181733365300.gif" alt="spi005" width="587" height="165" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.SCLK在idle時為low。&lt;/p&gt;&#xD;
&lt;p&gt;2.MOSI在SCLK的falling edge時被latch，在SCLK的rising edge時做transition。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Clock Polarity = 1, Clock Phase = 0&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;img style="display: inline; border: 0px;" title="spi006" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112181733365890.gif" alt="spi006" width="587" height="165" border="0" /&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.SCLK在idle時為high。&lt;/p&gt;&#xD;
&lt;p&gt;2.MOSI在SCLK的falling edge時被latch，在SCLK的rising edge時做transition。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Clock Polarity = 1, Clock Phase = 1&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="spi007" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/20111218173337939.gif" alt="spi007" width="587" height="165" border="0" /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.SCLK在idle時為high。&lt;/p&gt;&#xD;
&lt;p&gt;2.MOSI在SCLK的rising edge時被latch，在SCLK的falling edge時做transition。&lt;/p&gt;&#xD;
&lt;p&gt;看到這裡，或許你會問：『在實務上，我們是如何利用SPI介面與其他IC做溝通呢?』&lt;/p&gt;&#xD;
&lt;p&gt;我們以[3] &lt;a href="http://www.winbond.com/NR/rdonlyres/AEC6E481-6616-4555-B339-6E79D17810AC/0/W25X10BV_W25X20BV_W25X40BV.pdf" target="_blank"&gt;Winbond SPI Flash datasheet&lt;/a&gt;的Read Status Register為例：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="spi008" src="http://images.cnblogs.com/cnblogs_com/oomusou/201112/201112182218226973.gif" alt="spi008" width="621" height="238" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;其中DIO就是MOSI，DO就是MISO(naming convention不同而已)，在前8個clk由master從MOSI送出instruction：05h，在下8個clk由slave從MISO傳回status register的值，由於status register可以連續的讀取，因此MISO可以連續的傳回status register值。&lt;/p&gt;&#xD;
&lt;p&gt;其中Mode 0就相當於clock polarity = 0，clock phase = 0，而Mode 3就相當於clock polarity = 1，clock phase = 1。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;br /&gt;[1] &lt;a href="http://www.altera.com/literature/ug/ug_embedded_ip.pdf" target="_blank"&gt;Embedded Peripherals IP User Guide&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus" target="_blank"&gt;Serial Peripheral Interface Bus Wiki&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://www.winbond.com/NR/rdonlyres/AEC6E481-6616-4555-B339-6E79D17810AC/0/W25X10BV_W25X20BV_W25X40BV.pdf" target="_blank"&gt;Winbond SPI Flash datasheet&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;未完，待續。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/oomusou/aggbug/2281314.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/oomusou/archive/2011/12/08/nios2_spi.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/oomusou/archive/2011/10/31/write_n_byte.html</id><title type="text">(筆記) 如何寫入binary file某個byte連續n byte的值? (C/C++) (C)</title><summary type="text">通常公司為了保護其智慧財產權，會自己定義檔案格式，其header區會定義每個byte各代表某項資訊，所以常常需要直接對binary檔的某byte直接進行寫入，且連續寫入幾個byte表示某一數值資訊。</summary><published>2011-10-31T15:56:00Z</published><updated>2011-10-31T15:56:00Z</updated><author><name>真 OO无双</name><uri>http://www.cnblogs.com/oomusou/</uri></author><link rel="alternate" href="http://www.cnblogs.com/oomusou/archive/2011/10/31/write_n_byte.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/oomusou/archive/2011/10/31/write_n_byte.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;br /&gt;通常公司為了保護其智慧財產權，會自己定義檔案格式，其header區會定義每個byte各代表某項資訊，所以常常需要直接對binary檔的某byte直接進行寫入，且連續寫入幾個byte表示某一數值資訊。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Introduction&lt;br /&gt;使用環境：Windows XP SP3 + Visual C++ 6.0 SP6&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;將寫入wf.bin的0x33 byte處的連續4 byte值。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #008000;"&gt;(C) OOMusou 2011 &lt;/span&gt;&lt;span style="color: #008000; text-decoration: underline;"&gt;http://oomusou.cnblogs.com&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #008000;"&gt;Filename    : WriteNByte.c&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #008000;"&gt;Compiler    : Visual C++ 6.0&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #008000;"&gt;Description : how to write n byte value with n-byte position?&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #008000;"&gt;Release     : oct.31,2011 1.0&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main() {&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;   FILE *fp;&lt;br /&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; filesize;&lt;br /&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;   unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; buff[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;];&lt;br /&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;   fp = fopen(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;./wf.bin&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;rb+&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!fp) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;     fclose(fp);&lt;br /&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; -&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;   }&lt;br /&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;      &lt;br /&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;   buff[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0xAC&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;   buff[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0xFF&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;   buff[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0x1B&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;   buff[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0xAA&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;   fseek(fp, &lt;span style="color: #800080;"&gt;0x33&lt;/span&gt;, SEEK_SET);&lt;br /&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;   fwrite(buff, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;), &lt;span style="color: #800080;"&gt;4&lt;/span&gt;, fp);&lt;br /&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt;   fclose(fp);&lt;br /&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt;   &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;15行&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; buff[&lt;span style="color: #800080;"&gt;4&lt;/span&gt;];&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;宣告4 byte char array。&lt;/p&gt;&#xD;
&lt;p&gt;17行&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;fp = fopen(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;./wf.bin&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;rb+&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;由於要修改目前開啟的binary f ile，所以使用rb+，詳細請參考&lt;a href="http://www.cnblogs.com/oomusou/archive/2011/10/31/writebyte.html" target="_blank"&gt;(筆記) 如何寫入binary file某個byte的值? (C/C++) (C)&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;23行&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;buff[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0xAC&lt;/span&gt;;&lt;br /&gt;buff[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0xFF&lt;/span&gt;;&lt;br /&gt;buff[&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0x1B&lt;/span&gt;;&lt;br /&gt;buff[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;] = &lt;span style="color: #800080;"&gt;0xAA&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;分別設定每個byte的值。&lt;/p&gt;&#xD;
&lt;p&gt;28行&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;fseek(fp, &lt;span style="color: #800080;"&gt;0x33&lt;/span&gt;, SEEK_SET);&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;使用fseek將binary file的檔案位置移到0x33處，其中SEEK_SET表示offset是從檔頭開始。&lt;/p&gt;&#xD;
&lt;p&gt;29行&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;fwrite(buff, &lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;(unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;), &lt;span style="color: #800080;"&gt;4&lt;/span&gt;, fp);&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;正式使用fwrite將buff寫入檔案，由於單位是unsigned char，所以size為4。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;See Also&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.cnblogs.com/oomusou/archive/2011/10/31/writebyte.html" target="_blank"&gt;(筆記) 如何寫入binary file某個byte的值? (C/C++) (C)&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/oomusou/aggbug/2230902.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/oomusou/archive/2011/10/31/write_n_byte.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/oomusou/archive/2011/10/31/writebyte.html</id><title type="text">(筆記) 如何寫入binary file某個byte的值? (C/C++) (C)</title><summary type="text">通常公司為了保護其智慧財產權，會自己定義檔案格式，其header區會定義每個byte各代表某項資訊，所以常常需要直接對binary檔的某byte直接進行寫入。</summary><published>2011-10-31T15:18:00Z</published><updated>2011-10-31T15:18:00Z</updated><author><name>真 OO无双</name><uri>http://www.cnblogs.com/oomusou/</uri></author><link rel="alternate" href="http://www.cnblogs.com/oomusou/archive/2011/10/31/writebyte.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/oomusou/archive/2011/10/31/writebyte.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;br&gt;通常公司為了保護其智慧財產權，會自己定義檔案格式，其header區會定義每個byte各代表某項資訊，所以常常需要直接對binary檔的某byte直接進行寫入。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Introduction&lt;br&gt;使用環境：Windows XP SP3 + Visual C++ 6.0 SP6&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;將在wf.bin的0x33 byte處寫入0xAC值。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;WriteByte.c / C&lt;/strong&gt;&lt;/p&gt; &lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;span style="color: #008080"&gt; 1&lt;/span&gt; &lt;span style="color: #008000"&gt;/*&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 2&lt;/span&gt; &lt;span style="color: #008000"&gt;(C) OOMusou 2011 &lt;/span&gt;&lt;span style="color: #008000; text-decoration: underline"&gt;http://oomusou.cnblogs.com&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 3&lt;/span&gt; &lt;span style="color: #008000"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 4&lt;/span&gt; &lt;span style="color: #008000"&gt;Filename    : WriteByte.c&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 5&lt;/span&gt; &lt;span style="color: #008000"&gt;Compiler    : Visual C++ 6.0&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 6&lt;/span&gt; &lt;span style="color: #008000"&gt;Description : how to write byte value with n-byte position?&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 7&lt;/span&gt; &lt;span style="color: #008000"&gt;Release     : oct.31,2011 1.0&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt; 8&lt;/span&gt; &lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;br&gt;&lt;span style="color: #008080"&gt; 9&lt;/span&gt; &lt;br&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt; #include &amp;lt;stdio.h&amp;gt;&lt;br&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt; &lt;br&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; main() {&lt;br&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;   FILE *fp;&lt;br&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; filesize;&lt;br&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;   unsigned &lt;span style="color: #0000ff"&gt;char&lt;/span&gt; buff[&lt;span style="color: #800080"&gt;1&lt;/span&gt;];&lt;br&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;     &lt;br&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt;   fp = fopen(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;./wf.bin&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;, &lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;rb+&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;br&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!fp) {&lt;br&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt;     fclose(fp);&lt;br&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; -&lt;span style="color: #800080"&gt;1&lt;/span&gt;;&lt;br&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt;   }&lt;br&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt;     &lt;br&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt;   buff[&lt;span style="color: #800080"&gt;0&lt;/span&gt;] = &lt;span style="color: #800080"&gt;0xAC&lt;/span&gt;;&lt;br&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt;     &lt;br&gt;&lt;span style="color: #008080"&gt;25&lt;/span&gt;   fseek(fp, &lt;span style="color: #800080"&gt;0x33&lt;/span&gt;, SEEK_SET);&lt;br&gt;&lt;span style="color: #008080"&gt;26&lt;/span&gt;   fwrite(buff, &lt;span style="color: #0000ff"&gt;sizeof&lt;/span&gt;(unsigned &lt;span style="color: #0000ff"&gt;char&lt;/span&gt;), &lt;span style="color: #800080"&gt;1&lt;/span&gt;, fp);&lt;br&gt;&lt;span style="color: #008080"&gt;27&lt;/span&gt;     &lt;br&gt;&lt;span style="color: #008080"&gt;28&lt;/span&gt;   fclose(fp);&lt;br&gt;&lt;span style="color: #008080"&gt;29&lt;/span&gt;         &lt;br&gt;&lt;span style="color: #008080"&gt;30&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #800080"&gt;0&lt;/span&gt;;&lt;br&gt;&lt;span style="color: #008080"&gt;31&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;17行&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;fp = fopen(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;./wf.bin&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;, &lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;rb+&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;將wf.bin開啟，rb表示read binary，+表示除了read外，也可以做write。&lt;/p&gt;&#xD;
&lt;p&gt;23行&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;buff[&lt;span style="color: #800080"&gt;0&lt;/span&gt;] = &lt;span style="color: #800080"&gt;0xAC&lt;/span&gt;;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;由於要寫入的是1個byte，其值為0xAC，故先宣告buff這個char array，將0xAC填入。&lt;/p&gt;&#xD;
&lt;p&gt;25行&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;fseek(fp, &lt;span style="color: #800080"&gt;0x33&lt;/span&gt;, SEEK_SET);&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;使用fseek將binary file的檔案位置移到0x33處，其中SEEK_SET表示offset是從檔頭開始。&lt;/p&gt;&#xD;
&lt;p&gt;26行&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;fwrite(buff, &lt;span style="color: #0000ff"&gt;sizeof&lt;/span&gt;(unsigned &lt;span style="color: #0000ff"&gt;char&lt;/span&gt;), &lt;span style="color: #800080"&gt;1&lt;/span&gt;, fp);&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;正式使用fwrite將buff寫入檔案。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;完整程式碼下載&lt;br&gt;&lt;/strong&gt;&lt;a href="http://files.cnblogs.com/oomusou/WriteByte.7z"&gt;WriteByte.7z&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;br&gt;&lt;/strong&gt;以上的code看起來都很直觀，但讓我搞一天的地方是在17行，我原本以為既然是要寫入binary file，所以很直覺的這樣寫：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;fp = fopen(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;./wf.bin&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;, &lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;wb&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;wb表示write binary，看起來非常直覺，但結果卻會變成位置0x33處的確會寫入0xAC，&lt;span style="color: #008080"&gt;&lt;strong&gt;但檔案卻到此為止，後面的資料完全不見了!!&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;為什麼會這樣呢?&lt;/p&gt;&#xD;
&lt;p&gt;在C IN A NUTSHELL語法暨程式庫標準辭典[1] p.208第7行：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;如果模式字串以r開始，此檔案必須有存在檔案系統中才行。如果模式字串以w開始，那麼如果檔案不存在，就會建立一個新檔案；如果存在，那麼之前的內容就會遺失，因為在write中，fopen()函式會將檔案的長度截為0。&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;也就是說，因為使用wb開啟，且又使用fseek()移動了binary file的位置到0x33，所以0x33之後檔案長度被截為0，然後fwrite()將0xAC寫到檔案位置0x33處。&lt;/p&gt;&#xD;
&lt;p&gt;所以雖然只是小小的差異，但結果卻天差了十萬八千里啊。&lt;/p&gt;&#xD;
&lt;p&gt;在此筆記fopen()所有參數排列組合的意義[2]&lt;/p&gt;&#xD;
&lt;table style="font-size: 13px" border="1" cellspacing="0" cellpadding="0" width="585"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="115"&gt;r&lt;/td&gt;&#xD;
&lt;td valign="top" width="469"&gt;打開現有text file以便讀取&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="115"&gt;w&lt;/td&gt;&#xD;
&lt;td valign="top" width="469"&gt;生成新text file或截短現有text file至零長度以便寫入&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="115"&gt;a&lt;/td&gt;&#xD;
&lt;td valign="top" width="469"&gt;附加。生成新text file或打開現有text file以便在文件結束處寫入&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="115"&gt;rb&lt;/td&gt;&#xD;
&lt;td valign="top" width="469"&gt;打開現有binary file以便讀取&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="115"&gt;wb&lt;/td&gt;&#xD;
&lt;td valign="top" width="469"&gt;生成新binary file或將現有binary file截至零長度以便寫入&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="115"&gt;ab&lt;/td&gt;&#xD;
&lt;td valign="top" width="469"&gt;附加。生成新binary file或打開現有binary file以便在文件結束處寫入&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="115"&gt;r+&lt;/td&gt;&#xD;
&lt;td valign="top" width="469"&gt;打開現有text file，以便更新(讀和寫)&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="115"&gt;w+&lt;/td&gt;&#xD;
&lt;td valign="top" width="469"&gt;生成新text file或將現有text file截至零長度以便更新。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="115"&gt;a+&lt;/td&gt;&#xD;
&lt;td valign="top" width="469"&gt;附加。生成新text file或打開現有text file以便更新，在文件結束處寫入&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="115"&gt;r+b或rb+&lt;/td&gt;&#xD;
&lt;td valign="top" width="469"&gt;打開現有binary file以便更新(讀和寫)&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="115"&gt;w+b或wb+&lt;/td&gt;&#xD;
&lt;td valign="top" width="469"&gt;生成新binary file或截短現有文件至零長度以便更新&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="115"&gt;a+b或ab+&lt;/td&gt;&#xD;
&lt;td valign="top" width="469"&gt;附加。生成新binary file或截短現有文件至零長度以便更新，在文件結束處寫入&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;See Also&lt;br&gt;&lt;/strong&gt;&lt;/p&gt;&lt;a href="http://www.cnblogs.com/oomusou/archive/2011/10/31/write_n_byte.html"&gt;(筆記) 如何寫入binary file某個byte連續n byte的值? (C/C++) (C)&lt;/a&gt; &#xD;
&lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt;&lt;br&gt;[1] Peter Prinz &amp;amp; Tony Crawford 2005, 蔡學鏞 編譯，C IN A NUTSHELL語法暨程式庫標準辭典，美商歐萊禮股份有限公司&lt;/p&gt;&#xD;
&lt;p&gt;[2] P.J Plauger, The Standard C Library&lt;/p&gt;&lt;img src="http://www.cnblogs.com/oomusou/aggbug/2230870.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/oomusou/archive/2011/10/31/writebyte.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
