第4步程序的AXI定時器0的ucos_axitimer驅動程序
對于一些外圍設備,Micrium公司經銷的自定義驅動,通常被設計為線程安全的通過RTOS服務使用。例如,ucos_axitimer主要作用是充當MicroBlaze的系統的內核時基的驅動。這些驅動程序可供一般使用的便利性。
在這個步驟中,您將創建一個新的內核任務在等待一個信號量定期發布的中斷服務程序。這ISR將通過AXI定時器0使用ucos_axitimer被觸發。在步驟5中相同的操作將使用Xilinx獨立驅動來完成。
為清楚起見由各個內核函數返回的錯誤碼在下列實施例,不檢查。錯誤應該通常在最終應用進行驗證。
1.創建一個新的任務和信號量。
第一步是聲明的任務功能,它的TCB(任務控制塊)和堆棧空間鄰近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設計套件的各種教程和培訓。
?
評論