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