Zynq PS線程和中斷

硬件:Xilinx Zynq-7000 SoC ZC706

版本:vivado2015.4

PS需要複雜邏輯就需要運用到線程,分時處理任務。

中斷是數據交互得一種常見情況,在處理耗時中斷任務,任務交給線程處理。

線程

啓動線程

頭文件<sys.h>

/*
pcName:線程名稱
pvParameters:線程函數
pvArg:傳到線程函數得參數
iStackSize:Stack大小
iPriority:線程優先級
*/

sys_thread_t sys_thread_new( const char *pcName, void( *pxThread )( void *pvParameters ), void *pvArg, int iStackSize, int iPriority )

設置線程函數,線程函數參數,棧大小,優先級。

關閉線程

/*
xTaskToDelete:線程ID號
*/
void vTaskDelete( TaskHandle_t xTaskToDelete )

關閉指定線程,在線程函數關閉本身把xTaskToDelete 設置成NULL

 

中斷

PL中斷配置

選擇需要得中斷源,這邊選擇IRQ_F2P

申請中斷

頭文件xscugic.h

XScuGic_Config* pScuGicCfg;

static int setup_request() {
    /*查找中斷設備*/
    pScuGicCfg = XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID);
    /*註冊中斷回調*/
    XScuGic_RegisterHandler(pScuGicCfg->CpuBaseAddress, 61, pl2ps_handler, NULL);
    /*設置中斷觸發類型*/ 
    XScuGic_SetPriTrigTypeByDistAddr(XPAR_SCUGIC_DIST_BASEADDR,61,0xA0,
    INT_TYPE_RISING_EDGE);
    /*使能中斷號*/
    XScuGic_EnableIntr(XPAR_SCUGIC_DIST_BASEADDR,61);
}

static void pl2ps_handler(void *CallbackRef) {
    /*關閉使能*/
    XScuGic_DisableIntr(XPAR_SCUGIC_DIST_BASEADDR,61);
    /*中斷處理*/
    work(g_sd);
    /*打開使能*/
    XScuGic_EnableIntr(XPAR_SCUGIC_DIST_BASEADDR,61);

}

中斷號和平臺相關,不同平臺也不相同,需要自己查詢手冊。

耗時任務需要把work裏處理內容交給線程,簡單不耗時得任務直接在中斷裏處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章