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