硬件: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裏處理內容交給線程,簡單不耗時得任務直接在中斷裏處理。