第4步程序的AXI定時器0的ucos_axitimer驅(qū)動程序
對于一些外圍設(shè)備,Micrium公司經(jīng)銷的自定義驅(qū)動,通常被設(shè)計為線程安全的通過RTOS服務(wù)使用。例如,ucos_axitimer主要作用是充當MicroBlaze的系統(tǒng)的內(nèi)核時基的驅(qū)動。這些驅(qū)動程序可供一般使用的便利性。
在這個步驟中,您將創(chuàng)建一個新的內(nèi)核任務(wù)在等待一個信號量定期發(fā)布的中斷服務(wù)程序。這ISR將通過AXI定時器0使用ucos_axitimer被觸發(fā)。在步驟5中相同的操作將使用Xilinx獨立驅(qū)動來完成。
為清楚起見由各個內(nèi)核函數(shù)返回的錯誤碼在下列實施例,不檢查。錯誤應(yīng)該通常在最終應(yīng)用進行驗證。
1.創(chuàng)建一個新的任務(wù)和信號量。
第一步是聲明的任務(wù)功能,它的TCB(任務(wù)控制塊)和堆??臻g鄰近app.c.的頂 與此同時,我們需要在這個例子中名為Timer0Semaphore一個信號。
無效 Timer0Task(無效 * p_arg);
OS_TCB Timer0TCB;
CPU_STK Timer0TaskStk [512];
OS_SEM Timer0Semaphore;
上市 - 定時器0聲明的任務(wù)
在μC/ OS-III裸任務(wù)是一個簡單的功能,Timer0Task在這個例子中。為了幫助演示,我們可以在新的任務(wù)開始加UCOS_Print(),以確保它已成功創(chuàng)建。請參閱?因為我們不希望此任務(wù)返回時(1)在接近函數(shù)的末尾添加。
無效 Timer0Task(無效 * p_arg)
{
OS_ERR os_err;
UCOS_Print(“Timer0Task達到 r N” );
而 (1) {
}
}
上市 - 定時器0任務(wù)骷髏
該UCOS_Print()的實現(xiàn)是重入(線程安全的),這意味著它可以從多個任務(wù)被稱為無特殊同步。
信號量是用在本實施例中,等待來自計時器的信號。創(chuàng)建于μC/ OS-III信號量是一個簡單的函數(shù)調(diào)用,如圖 上市-定時器0信號燈創(chuàng)建
OSSemCreate(Timer0Semaphore, “ 定時器0信號燈” ,0,&os_err);
上市 - 定時器0信號燈創(chuàng)建
定時器0的任務(wù)可以掛起(等待)這個信號量一旦它與OSSemPend()創(chuàng)建和輸出的東西在終端上時,它發(fā)出信號。最后的任務(wù)應(yīng)與OSTaskCreate()函數(shù)調(diào)用創(chuàng)建 列表-定時器0任務(wù)顯示的主要和Timer0任務(wù)的當前內(nèi)容。
無效 MainTask的(無效 * p_arg)
{
OS_ERR os_err;
UCOS_Print( “ 你好從主要任務(wù) r ?世界” );
OSSemCreate(Timer0Semaphore, “ 定時器0信號燈” ,0,&os_err);
OSTaskCreate(Timer0TCB,
“定時器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秒” );
}
}
無效 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任務(wù)
運行該程序現(xiàn)在將顯示定時器0元起拍,但對未決信號無限期由于定時器尚未配置。
2.配置AXI定時器0信號定時器0信號。
Micrium公司定制的驅(qū)動程序通常注冊了一個默認的中斷處理函數(shù)時初始化。中斷源是從硬件設(shè)計中扣除。在ucos_axitimer驅(qū)動程序有可能注冊一個回調(diào)的情況下,要調(diào)用的中斷觸發(fā)時。使用該功能顯示在?
無效 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的司機都圍繞這是由不同的初始化函數(shù)返回的句柄。 上市-定時器0手柄宣言表明的AXI定時器申報辦理定時器0。
AXITIMER_HANDLE定時器0;
上市 - 定時器0聲明手柄
要配置定時器必須首先進行初始化,然后配置為倒計時,自動重裝定時器啟用中斷。在硬件設(shè)計的定時器由一個50MHz的時鐘驅(qū)動,我們將使用100萬美元的負載值給予2秒的延時中斷之間 上市-定時器0設(shè)置
定時器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設(shè)置
最后,計時器可以啟動。 上市-定時器0開始
AXITimer_Start(定時器0,0);
上市 - 定時器0開始
3.運行應(yīng)用程序。輸出應(yīng)該看起來像 圖-定時器0端子輸出。
圖 - 定時器0端子輸出
第5步程序的AXI定時器1與賽靈思tmrctr驅(qū)動程序
在步驟4中的Micrium定制驅(qū)動ucos_axitimer用于產(chǎn)生周期性中斷喚醒的應(yīng)用程序的任務(wù)。同樣可以通過使用分布式的SDK賽靈思獨立的驅(qū)動程序來實現(xiàn)。
當使用一個獨立的驅(qū)動程序是很重要的有ucos_standalone列入項目庫。此外,如果外設(shè)從多個線程所使用的必需的同步,必須由應(yīng)用程序提供,或者通過使用內(nèi)核信號量或互斥。
1.創(chuàng)建一個新的任務(wù)和信號燈類似于步驟4的1項。
2.編寫一個自定義的中斷服務(wù)程序定時器。
無效 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參數(shù)是注冊時中斷給用戶指定的參數(shù)。該CPU的說法是,所產(chǎn)生的中斷,并且只針對相應(yīng)和對的Cortex-A9產(chǎn)生軟件中斷的CPU核心ID。CPU的參數(shù)將是0在所有其他情況。
3.注冊和啟用自定義中斷
UCOS_IntVectSet(62,0,DEF_BIT_00 ,Timer1ISR,和定時器1);
UCOS_IntSrcEn (62);
上市 - 定時器1中斷配置
4.建立和運行。輸出應(yīng)該類似于從第4步以前的輸出最終app.c文件可以在這里下載-?app.c
結(jié)論
在本教程中,您創(chuàng)建了一個基本的ZYNQ硬件設(shè)計和寫利用μC/ OS BSP一個基本的應(yīng)用程序。無論是Micrium公司自定義驅(qū)動程序和Xilinx獨立驅(qū)動器的使用,提出與中斷處理。讀者新的生態(tài)系統(tǒng)Micrium公司建議閱讀UC-OS-III文檔深入了解有關(guān)使用Micrium的實時內(nèi)核。在另一方面,長期以來Micrium公司強烈建議用戶檢查Vivado設(shè)計套件的各種教程和培訓(xùn)。
?
評論