本教程介紹了如何使用μC/ OS BSP建立在ZYNQ基本應(yīng)用程序?使用Vivado -7000 ? IDE和賽靈思? SDK。在本教程中,您將使用Vivado IP集成器配置ZYNQ處理器系統(tǒng)以及FPGA架構(gòu)集成軟外設(shè)。然后,您將使用μC/ OS BSP來(lái)生成使用一個(gè)基本的應(yīng)用程序μC/ OS-III實(shí)時(shí)內(nèi)核。
教程將讓您體驗(yàn)以下概念:
一個(gè)μC/ OS-III的應(yīng)用程序和BSP的生成
BSP和驅(qū)動(dòng)程序配置
選擇和使用賽靈思獨(dú)立驅(qū)動(dòng)和Micrium的自定義驅(qū)動(dòng)程序
標(biāo)準(zhǔn)輸出(文字痕跡)
中斷處理
本教程是不是意味著作為Vivado設(shè)計(jì)流程的演示。讀者建議先通過(guò)官方賽靈思教程和文檔嘗試本教程之前。
軟件要求
合適的Vivado設(shè)計(jì)套件是本教程所需。是否支持您的主板WebPACK的版本都可以使用。
在μC/ OS BSP。BSP是隨μC/ OS-III的評(píng)估目的的完整的源代碼。請(qǐng)參閱安裝說(shuō)明進(jìn)行安裝。
Vivado設(shè)計(jì)套件2014.3版本在本教程中使用。截圖和設(shè)計(jì)步驟可能會(huì)有所不同在其他版本。
硬件要求
本教程的編寫和賽靈思ZC702,安富利ZedBoard測(cè)試?和MicroZed ?。然而,大多數(shù)如果不是全部基于ZYNQ開(kāi)發(fā)平臺(tái)應(yīng)該是適合本教程。為了達(dá)到最佳效果董事會(huì)應(yīng)該有一個(gè)可用的UART輸出連接到PS UART。
確保你有適當(dāng)?shù)恼{(diào)試器或調(diào)試電纜連接,并且板載跳線進(jìn)行相應(yīng)配置。
硬件設(shè)計(jì)
在寫任何賽靈思可編程器件的軟件應(yīng)用程序是創(chuàng)建硬件設(shè)計(jì)首先需要。本教程的目的是建立一個(gè)硬件設(shè)計(jì)具有下列組件。
的Cortex-A9處理器,硬化
經(jīng)由處理器系統(tǒng)的UART標(biāo)準(zhǔn)輸出
基本FPGA設(shè)計(jì)
AXI互連連接到PS通用AXI4主端口
兩個(gè)軟AXI定時(shí)器
這兩個(gè)定時(shí)器到PS的路由
步驟1.調(diào)用Vivado IDE和創(chuàng)建項(xiàng)目
1.打開(kāi)Vivado IDE作為起始頁(yè)。
?
圖 - Vivado起始頁(yè)
2.從入門頁(yè)面中點(diǎn)擊“創(chuàng)建新項(xiàng)目”。這應(yīng)該打開(kāi)新項(xiàng)目向?qū)А?圖- Vivado新建項(xiàng)目向?qū)c(diǎn)擊下一步。
圖 - Vivado新建項(xiàng)目向?qū)?/p>
3.輸入項(xiàng)目名稱和位置。確?!皠?chuàng)建項(xiàng)目的子目錄”被選中。點(diǎn)擊下一步。
4.選擇“RTL工程”作為項(xiàng)目類型,并檢查“不要指定此時(shí)來(lái)源”復(fù)選框。點(diǎn)擊下一步。
5.在默認(rèn)部分對(duì)話框中選擇你板或部分。點(diǎn)擊下一步。
6.在項(xiàng)目摘要頁(yè)面單擊Finish。
這應(yīng)該在一個(gè)空白的項(xiàng)目主要Vivado IDE項(xiàng)目視圖為您帶來(lái)。
圖 - Vivado項(xiàng)目視圖
步驟2.創(chuàng)建一個(gè)IP集成器設(shè)計(jì)
1.在流動(dòng)導(dǎo)航器中選擇“創(chuàng)建模塊設(shè)計(jì)”項(xiàng)目
?
圖 - 模塊化設(shè)計(jì)流程的項(xiàng)目
2.指定塊設(shè)計(jì)一個(gè)名稱,然后單擊確定。
第3步:添加和設(shè)置ZYNQ處理器系統(tǒng)的IP塊
1.通過(guò)右鍵單擊程序框圖畫布,選擇“添加IP ......”添加IP對(duì)話框。
?
圖 - 添加IP上下文菜單
2.在搜索字段中鍵入“ZYNQ”,然后選擇ZYNQ7處理系統(tǒng),最后按回車鍵的ZYNQ IP模塊添加到設(shè)計(jì)
?
圖 - 添加IP ZYNQ
您現(xiàn)在應(yīng)該看到ZYNQ塊單獨(dú)的程序段設(shè)計(jì)原理圖的中間。
圖 - 座ZYNQ
3.調(diào)用的ZYNQ塊自動(dòng)化對(duì)話框。這應(yīng)該高亮顯示為綠色的畫布上,并可以通過(guò)點(diǎn)擊“運(yùn)行座自動(dòng)化”啟動(dòng)。 圖- ZYNQ座自動(dòng)化援助
座自動(dòng)化為Zynq7處理系統(tǒng)將只可當(dāng)Vivado知道你正在使用的電路板。
圖 - ZYNQ座自動(dòng)化援助
4.在“運(yùn)行座自動(dòng)化”對(duì)話框中選擇“應(yīng)用預(yù)設(shè)董事會(huì)”,并留下了交叉觸發(fā)設(shè)置為禁用 。點(diǎn)擊OK。
?
圖 - ZYNQ座自動(dòng)化對(duì)話
如果一切順利阻止自動(dòng)化應(yīng)該連接外部存儲(chǔ)器和固定的I / O自動(dòng)。
?
圖 - ZYNQ座自動(dòng)化結(jié)果
步驟4.自定義ZYNQ塊我們的設(shè)計(jì)
在上一步驟的Zynq7 IP模塊加入到設(shè)計(jì)中。在這個(gè)步驟中,您將定制ZYNQ塊教程設(shè)計(jì)和連接將用于軟件演示兩個(gè)AXI定時(shí)器。
對(duì)于軟件演示,需要許多組件。
UART - 輸出字符串消息的UART必須連接到外部源。
參考時(shí)鐘 - 該ZYNQ可以導(dǎo)出多達(dá)四個(gè)時(shí)鐘信號(hào)FPGA架構(gòu)。一個(gè)是需要時(shí)鐘AXI定時(shí)器和互連。
通用主端口 - 要訪問(wèn)位于PS的AXI4主端口的FPGA一個(gè)軟外設(shè)必須被激活。
中斷 - 要路由的定時(shí)器到PS對(duì)PS-PL中斷必須啟用的背面的中斷。
1.打開(kāi)Zynq7通過(guò)右鍵單擊自定義對(duì)話框中的塊,然后選擇“自定義模塊”。
?
圖 - ZYNQ塊上下文菜單
重新定義IP對(duì)話框的Zynq7現(xiàn)在應(yīng)該打開(kāi)。
圖 - ZYNQ塊上下文菜單
2.確保AXI通用主端口0是啟用的PS-PL配置部分。。調(diào)用ZYNQ塊時(shí),這通常是完成默認(rèn) ZYNQ PS-PL配置-圖
圖 - ZYNQ PS-PL配置
3.安裝一個(gè)UART輸出。大多數(shù)板都會(huì)有這樣的配置為默認(rèn)的“外設(shè)I / O引腳”部分中。
圖 - ZYNQ外圍IO配置
4.Setup從PS到PL一個(gè)50MHz的時(shí)鐘。這通常是“時(shí)鐘配置”部分中的默認(rèn)設(shè)置。
圖 - ZYNQ時(shí)鐘配置
5.Enable FPGA來(lái)PS中斷線路的“中斷”一節(jié)中。這將使路由多達(dá)16個(gè)獨(dú)立的中斷從FPGA到了Cortex-A9中斷控制器。
圖 - ZYNQ中斷配置
在“重新定制IP”對(duì)話框6.依次點(diǎn)擊確定。
第5步:添加軟外設(shè)
現(xiàn)在,ZYNQ塊被正確配置它的時(shí)間來(lái)添加軟定時(shí)器。這些定時(shí)器隨后將通過(guò)AXI互連連接到ZYNQ主端口和映射到主要的ARM互連地址空間。
1.添加兩個(gè)AXI定時(shí)器,以塊設(shè)計(jì)。這可以以類似的方式為ZYNQ塊通過(guò)右鍵單擊在畫布上完成,然后選擇添加IP。從添加IP對(duì)話框搜索“AXI定時(shí)器”,并將其添加到設(shè)計(jì)中。重復(fù)一次,第二次計(jì)時(shí)。
圖 - ZYNQ和未連接定時(shí)器示意圖
2.連接自動(dòng)化,可從突出綠色條,可用于自動(dòng)連接定時(shí)器。
?
圖 - 定時(shí)器連接自動(dòng)化
定時(shí)器現(xiàn)在應(yīng)該經(jīng)由一個(gè)新的AXI互連由連接自動(dòng)化設(shè)計(jì)協(xié)助自動(dòng)添加連接到ZYNQ塊。您可能會(huì)注意到一個(gè)復(fù)位處理系統(tǒng)也是設(shè)計(jì)的一部分了。
?
圖 - 定時(shí)器連接完成
連接自動(dòng)化還自動(dòng)連接的外設(shè)分配地址范圍。您可以咨詢所產(chǎn)生的地址映射在框圖編輯器的“地址編輯器”窗格中。
?
圖 - 定時(shí)器地址配置
3.從“添加IP”對(duì)話框中添加一個(gè)“Concat的”塊實(shí)例。該塊可以被用于聚合路由給PS的中斷信號(hào)。該塊的輸出應(yīng)連接到IRQ_F2P [0:0] ZYNQ塊的端口。然后axi_timer_0連接的中斷行腳0 Concat的塊。同樣應(yīng)該做axi_timer_1并連接到管腳1塊的毗連的。最終的原理應(yīng)該像 圖-最終的硬件設(shè)計(jì)原理圖
圖 - 最終的硬件設(shè)計(jì)原理圖
4.設(shè)計(jì)可以檢查通過(guò)點(diǎn)擊“驗(yàn)證設(shè)計(jì)”按鈕的錯(cuò)誤。
第6步:生成HDL設(shè)計(jì)文件
1.在源樹(shù)中右擊該塊設(shè)計(jì)文件,然后選擇“生成輸出文件”。
圖 - 生成輸出文件背景
2.右鍵單擊再次選擇“創(chuàng)建HDL封裝”這個(gè)時(shí)候。當(dāng)系統(tǒng)提示選擇“讓Vivado管理創(chuàng)建包裝器”。
第7步合成,實(shí)施和生成流
1.要進(jìn)行綜合,實(shí)現(xiàn)和位流生成一次全部單擊“生成流”中的“程序和調(diào)試”的流程導(dǎo)航部分。當(dāng)提示運(yùn)行前一代點(diǎn)擊合成和實(shí)施步驟是肯定的。
圖 - 生成流
之后,它的完成你呈現(xiàn)一個(gè)對(duì)話框,您可以選擇打開(kāi)實(shí)現(xiàn)的設(shè)計(jì)。從那里,你就可以查看資源的使用情況,定時(shí)信息和最終實(shí)施的布局規(guī)劃。該設(shè)計(jì)現(xiàn)在是準(zhǔn)備出口到Xilinx SDK。
2.要導(dǎo)出的設(shè)計(jì)選擇文件菜單中的“導(dǎo)出硬件”選項(xiàng)。請(qǐng)確保選擇“包含比特流”。
?
圖 - 導(dǎo)出硬件對(duì)話
3.在文件菜單中選擇了“勞克SDK”選項(xiàng),再次啟動(dòng)SDK。
這結(jié)束了本教程的硬件設(shè)計(jì)部分。
軟件設(shè)計(jì)
本教程的軟件部分的目標(biāo)是創(chuàng)建一個(gè)基本的μC/ OS-III項(xiàng)目。然后證明同時(shí)使用Micrium公司定制的驅(qū)動(dòng)程序和Xilinx獨(dú)立的驅(qū)動(dòng)程序與AXI定時(shí)器接口。
步驟1.安裝了μC/ OS系統(tǒng)信息庫(kù)
完整的安裝說(shuō)明在現(xiàn)有的用戶手冊(cè)。
1.要安裝存儲(chǔ)庫(kù)將其添加到從Xilinx工具-當(dāng)前的工作空間>系統(tǒng)信息庫(kù)菜單。
圖 - 賽靈思SDK庫(kù)首選項(xiàng)
第2步:生成μC/ OS BSP
第一步驟是生成的C / OS的BSP的硬件平臺(tái)和一個(gè)簡(jiǎn)單的C / OS的“Hello World”類型的項(xiàng)目。
1.打開(kāi)賽靈思SDK。這應(yīng)該已經(jīng)完成的硬件設(shè)計(jì)節(jié)的最后一步。
?
圖 - 賽靈思SDK主屏幕
2.打開(kāi)“新的應(yīng)用項(xiàng)目對(duì)話框”。它可以從文件 - >新建 - >應(yīng)用程序項(xiàng)目菜單進(jìn)行訪問(wèn)。
在此對(duì)話框中,輸入項(xiàng)目名稱,然后選擇“UCOS”作為操作系統(tǒng)平臺(tái)。點(diǎn)擊下一步。
?
圖 - 新的應(yīng)用項(xiàng)目對(duì)話框
3.新項(xiàng)目模板對(duì)話框應(yīng)該會(huì)出現(xiàn)下一個(gè)。選擇的uC / OS-III的Hello World然后單擊Finish。
?
圖 - 新建項(xiàng)目對(duì)話框的模板
您現(xiàn)在應(yīng)該看到在IDE中板級(jí)支持包的摘要。
4.打開(kāi)板支持包設(shè)置通過(guò)單擊對(duì)話框中的“修改這個(gè)BSP的設(shè)置”。
5.選擇必要的庫(kù)ucos_common,ucos_osiii和ucos_standalone。
該ucos_common庫(kù)始終需要由BSP以及內(nèi)核之一或者ucos_osii或ucos_osiii但不能同時(shí)使用。該ucos_standalone包是一個(gè)兼容性組件能夠使用賽靈思獨(dú)立的驅(qū)動(dòng)程序。在庫(kù)組件的詳細(xì)信息可以在中找到支持Micrium公司產(chǎn)品的鏈接到該文檔中,用戶手冊(cè)部分。
圖 - BSP設(shè)置概述
6.在“UCOS”配置section.For的ZC702和ZedBoard這應(yīng)該是ps7_uart_1選擇STDOUT提供商。
圖 - BSP標(biāo)準(zhǔn)輸出設(shè)置
7.配置的驅(qū)動(dòng)程序AXI定時(shí)器。在本教程中axi_timer_0將與μC/ OS定制驅(qū)動(dòng)程序進(jìn)行編程,而axi_timer_1將使用Xilinx獨(dú)立的驅(qū)動(dòng)器。
圖 - BSP驅(qū)動(dòng)程序配置
8.單擊確定。
第3步:構(gòu)建和調(diào)試的示范項(xiàng)目
默認(rèn)生成的項(xiàng)目是一個(gè)簡(jiǎn)單的Hello World消息的主要任務(wù)打印。
1.生成項(xiàng)目。這是自動(dòng)賽靈思SDK修改BSP配置后,通常會(huì)完成。
2.選擇項(xiàng)目(不是BSP)在工作區(qū)中,并從運(yùn)行 - >調(diào)試配置...菜單打開(kāi)調(diào)試配置對(duì)話框。
3.創(chuàng)建雙擊“賽靈思公司的C / C ++應(yīng)用程序(系統(tǒng)調(diào)試)”一個(gè)新的調(diào)試配置。
4.檢查“復(fù)位整個(gè)系統(tǒng)”和“計(jì)劃FPGA”在新創(chuàng)建的調(diào)試配置。這將啟動(dòng)調(diào)試會(huì)話時(shí)自動(dòng)編程的FPGA。
?
圖 - 調(diào)試配置
5.單擊調(diào)試。
對(duì)FPGA進(jìn)行編程的調(diào)試之后,現(xiàn)在應(yīng)該停在main()函數(shù)。
6.終端連接到你的開(kāi)發(fā)板的COM端口。嵌入式終端或任何其他的終端應(yīng)用程序都可以使用。
圖 - 終端配置
7.按運(yùn)行- >恢復(fù)或F8運(yùn)行演示。您應(yīng)該看到在終端文本輸出。
?
圖 - 終端輸出
第4步程序的AXI定時(shí)器0的ucos_axitimer驅(qū)動(dòng)程序
對(duì)于一些外圍設(shè)備,Micrium公司經(jīng)銷的自定義驅(qū)動(dòng),通常被設(shè)計(jì)為線程安全的通過(guò)RTOS服務(wù)使用。例如,ucos_axitimer主要作用是充當(dāng)MicroBlaze的系統(tǒng)的內(nèi)核時(shí)基的驅(qū)動(dòng)。這些驅(qū)動(dòng)程序可供一般使用的便利性。
在這個(gè)步驟中,您將創(chuàng)建一個(gè)新的內(nèi)核任務(wù)在等待一個(gè)信號(hào)量定期發(fā)布的中斷服務(wù)程序。這ISR將通過(guò)AXI定時(shí)器0使用ucos_axitimer被觸發(fā)。在步驟5中相同的操作將使用Xilinx獨(dú)立驅(qū)動(dòng)來(lái)完成。
為清楚起見(jiàn)由各個(gè)內(nèi)核函數(shù)返回的錯(cuò)誤碼在下列實(shí)施例,不檢查。錯(cuò)誤應(yīng)該通常在最終應(yīng)用進(jìn)行驗(yàn)證。
1.創(chuàng)建一個(gè)新的任務(wù)和信號(hào)量。
第一步是聲明的任務(wù)功能,它的TCB(任務(wù)控制塊)和堆??臻g鄰近app.c.的頂 與此同時(shí),我們需要在這個(gè)例子中名為Timer0Semaphore一個(gè)信號(hào)。
無(wú)效 Timer0Task(無(wú)效 * p_arg);
OS_TCB Timer0TCB;
CPU_STK Timer0TaskStk [512];
OS_SEM Timer0Semaphore;
上市 - 定時(shí)器0聲明的任務(wù)
在μC/ OS-III裸任務(wù)是一個(gè)簡(jiǎn)單的功能,Timer0Task在這個(gè)例子中。為了幫助演示,我們可以在新的任務(wù)開(kāi)始加UCOS_Print(),以確保它已成功創(chuàng)建。請(qǐng)參閱?因?yàn)槲覀儾幌M巳蝿?wù)返回時(shí)(1)在接近函數(shù)的末尾添加。
無(wú)效 Timer0Task(無(wú)效 * p_arg)
{
OS_ERR os_err;
UCOS_Print(“Timer0Task達(dá)到 r N” );
而 (1) {
}
}
上市 - 定時(shí)器0任務(wù)骷髏
該UCOS_Print()的實(shí)現(xiàn)是重入(線程安全的),這意味著它可以從多個(gè)任務(wù)被稱為無(wú)特殊同步。
信號(hào)量是用在本實(shí)施例中,等待來(lái)自計(jì)時(shí)器的信號(hào)。創(chuàng)建于μC/ OS-III信號(hào)量是一個(gè)簡(jiǎn)單的函數(shù)調(diào)用,如圖 上市-定時(shí)器0信號(hào)燈創(chuàng)建
OSSemCreate(Timer0Semaphore, “ 定時(shí)器0信號(hào)燈” ,0,&os_err);
上市 - 定時(shí)器0信號(hào)燈創(chuàng)建
定時(shí)器0的任務(wù)可以掛起(等待)這個(gè)信號(hào)量一旦它與OSSemPend()創(chuàng)建和輸出的東西在終端上時(shí),它發(fā)出信號(hào)。最后的任務(wù)應(yīng)與OSTaskCreate()函數(shù)調(diào)用創(chuàng)建 列表-定時(shí)器0任務(wù)顯示的主要和Timer0任務(wù)的當(dāng)前內(nèi)容。
無(wú)效 MainTask的(無(wú)效 * p_arg)
{
OS_ERR os_err;
UCOS_Print( “ 你好從主要任務(wù) r ?世界” );
OSSemCreate(Timer0Semaphore, “ 定時(shí)器0信號(hào)燈” ,0,&os_err);
OSTaskCreate(Timer0TCB,
“定時(shí)器0的任務(wù)” ,
Timer0Task,
DEF_NULL ,
10,
Timer0TaskStk,
0,
512,
0,
0,
DEF_NULL ,
0,
&os_err);
而 (DEF_TRUE ){
OSTimeDlyHMSM(0,0,10,0,OS_OPT_TIME_HMSM_STRICT,&os_err);
UCOS_Print( “ 定期輸出的主要任務(wù) r ?每10秒” );
}
}
無(wú)效 Timer0Task(無(wú)效 * p_arg)
{
OS_ERR os_err;
UCOS_Print(“Timer0Task達(dá)到 r N” );
而 (1) {
OSSemPend(Timer0Semaphore,0,0,DEF_NULL ,&os_err);
UCOS_Print( “ 定時(shí)器0旗語(yǔ)信號(hào) r N” );
}
}
上市 - 定時(shí)器0任務(wù)
運(yùn)行該程序現(xiàn)在將顯示定時(shí)器0元起拍,但對(duì)未決信號(hào)無(wú)限期由于定時(shí)器尚未配置。
2.配置AXI定時(shí)器0信號(hào)定時(shí)器0信號(hào)。
Micrium公司定制的驅(qū)動(dòng)程序通常注冊(cè)了一個(gè)默認(rèn)的中斷處理函數(shù)時(shí)初始化。中斷源是從硬件設(shè)計(jì)中扣除。在ucos_axitimer驅(qū)動(dòng)程序有可能注冊(cè)一個(gè)回調(diào)的情況下,要調(diào)用的中斷觸發(fā)時(shí)。使用該功能顯示在?
無(wú)效 Timer0ISR(AXITIMER_HANDLE手柄,CPU_INT32U tmr_nbr)
{
OS_ERR os_err;
OSSemPost(Timer0Semaphore,0,&os_err);
}
上市 - 定時(shí)器0 ISR
該ISR只是張貼定時(shí)器0信號(hào)。
最后一步是配置AXI定時(shí)器。駕駛員的公共API可以通過(guò)包括訪問(wèn)ucos_axitimer.h頭文件app.c. Micrium的司機(jī)都圍繞這是由不同的初始化函數(shù)返回的句柄。 上市-定時(shí)器0手柄宣言表明的AXI定時(shí)器申報(bào)辦理定時(shí)器0。
AXITIMER_HANDLE定時(shí)器0;
上市 - 定時(shí)器0聲明手柄
要配置定時(shí)器必須首先進(jìn)行初始化,然后配置為倒計(jì)時(shí),自動(dòng)重裝定時(shí)器啟用中斷。在硬件設(shè)計(jì)的定時(shí)器由一個(gè)50MHz的時(shí)鐘驅(qū)動(dòng),我們將使用100萬(wàn)美元的負(fù)載值給予2秒的延時(shí)中斷之間 上市-定時(shí)器0設(shè)置
定時(shí)器0 = AXITimer_Init (0);
AXITimer_OptSet(定時(shí)器0,0,AXITIMER_OPT_DOWN | AXITIMER_OPT_AUTO_RELOAD | AXITIMER_OPT_INT);
AXITimer_LoadSet(定時(shí)器0,0,億);
AXITimer_CallbackSet(定時(shí)器0,0,Timer0ISR);
上市 - 定時(shí)器0設(shè)置
最后,計(jì)時(shí)器可以啟動(dòng)。 上市-定時(shí)器0開(kāi)始
AXITimer_Start(定時(shí)器0,0);
上市 - 定時(shí)器0開(kāi)始
3.運(yùn)行應(yīng)用程序。輸出應(yīng)該看起來(lái)像 圖-定時(shí)器0端子輸出。
圖 - 定時(shí)器0端子輸出
第5步程序的AXI定時(shí)器1與賽靈思tmrctr驅(qū)動(dòng)程序
在步驟4中的Micrium定制驅(qū)動(dòng)ucos_axitimer用于產(chǎn)生周期性中斷喚醒的應(yīng)用程序的任務(wù)。同樣可以通過(guò)使用分布式的SDK賽靈思獨(dú)立的驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn)。
當(dāng)使用一個(gè)獨(dú)立的驅(qū)動(dòng)程序是很重要的有ucos_standalone列入項(xiàng)目庫(kù)。此外,如果外設(shè)從多個(gè)線程所使用的必需的同步,必須由應(yīng)用程序提供,或者通過(guò)使用內(nèi)核信號(hào)量或互斥。
1.創(chuàng)建一個(gè)新的任務(wù)和信號(hào)燈類似于步驟4的1項(xiàng)。
2.編寫一個(gè)自定義的中斷服務(wù)程序定時(shí)器。
無(wú)效 Timer1ISR(無(wú)效 * p_arg,CPU_INT32U CPU)
{
CPU_INT32U ControlStatusReg;
OS_ERR os_err;
ControlStatusReg = XTmrCtr_ReadReg(Timer1.BaseAddress,
0,
XTC_TCSR_OFFSET);
XTmrCtr_WriteReg(Timer1.BaseAddress,
0,
XTC_TCSR_OFFSET,
ControlStatusReg |
XTC_CSR_INT_OCCURED_MASK);
OSSemPost(Timer1Semaphore,0,&os_err);
}
上市 - 定時(shí)器1 ISR
在μC/ OS下的原始中斷程序都具有相同的簽名,其中一部分只與在某些情況下。該p_arg參數(shù)是注冊(cè)時(shí)中斷給用戶指定的參數(shù)。該CPU的說(shuō)法是,所產(chǎn)生的中斷,并且只針對(duì)相應(yīng)和對(duì)的Cortex-A9產(chǎn)生軟件中斷的CPU核心ID。CPU的參數(shù)將是0在所有其他情況。
3.注冊(cè)和啟用自定義中斷
UCOS_IntVectSet(62,0,DEF_BIT_00 ,Timer1ISR,和定時(shí)器1);
UCOS_IntSrcEn (62);
上市 - 定時(shí)器1中斷配置
4.建立和運(yùn)行。輸出應(yīng)該類似于從第4步以前的輸出最終app.c文件可以在這里下載-?app.c
結(jié)論
在本教程中,您創(chuàng)建了一個(gè)基本的ZYNQ硬件設(shè)計(jì)和寫利用μC/ OS BSP一個(gè)基本的應(yīng)用程序。無(wú)論是Micrium公司自定義驅(qū)動(dòng)程序和Xilinx獨(dú)立驅(qū)動(dòng)器的使用,提出與中斷處理。讀者新的生態(tài)系統(tǒng)Micrium公司建議閱讀UC-OS-III文檔深入了解有關(guān)使用Micrium的實(shí)時(shí)內(nèi)核。在另一方面,長(zhǎng)期以來(lái)Micrium公司強(qiáng)烈建議用戶檢查Vivado設(shè)計(jì)套件的各種教程和培訓(xùn)。
?
評(píng)論