返回信息流DPC方式,即任务方式,把ISR中大量数据的处理流程搬移到一个高优先级的任务中处理,从而大大减少在ISR中停留的时间,防止ISR阻塞。
DPC实现方法:
SEM_ID semISRtoDPC = 0;
extern int intNO;
STATUS init()
{
STATUS status = OK;
semISRtoDPC = semBCreate (SEM_Q_PRIORITY, SEM_FULL);
if(semISRtoDPC == 0)
{
return ERROR;
}
intDisable(intNO);/*禁止中断*/
intConnect(intNO,isrFunction,0);/*挂接中断服务程序*/
intEnable(intNO);/*使能中断*/
status = taskSpawn ("tDPC", 50,VX_FP_TASK, 20000, taskDPC, 0,0,0,0,0,0,0,0,0,0);
if(status == 0)
{
return ERROR;
}
return OK;
}
void isrFunction()/*中断服务程序。仅在收到中断后,通知DPC去取数*/
{
if(TRUE)/*收到正确的中断*/
{
semGive(semISRtoDPC);
}
}
void taskDPC()/*在该函数中取数数据、上传*/
{
while(1)
{
semTake(semISRtoDPC,WAIT_FOREVER);
/*取数操作*/
buf = ReadMEM(0xadd);
/*清中断操作*/
}
}
注:DPC方式可极大减轻ISR的负担,加快系统运转速度,但是,如果任务优先级设置不当,可能会造成丢数等异常发生。
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #16071同步于 2016/1/12
Embedded_System机器人发帖
新手来报到二:DPC方式给中断服务程序减负
VxWorks55
2016/1/12镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。