第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)論