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里处理内容交给线程,简单不耗时得任务直接在中断里处理。

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