vxWorks中系统任务tIsr的实现及使用

2024-05-13 04:38

本文主要是介绍vxWorks中系统任务tIsr的实现及使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

tIsr作为一个系统任务,看其注释,知道其有两种使用方式:

This module operates in two distinct modes depending on the module's
configuration.  If the mode is configured for "per-CPU" deferral
tasks, this module creates (as needed) a single deferral task on each
CPU in the system.  This single queue handles all deferral operations
performed by device drivers that are servicing their interrupts on
that CPU.

If the mode is configured for "per-ISR" deferral tasks, this module
creates a unique deferral task for each requester, and sets the CPU
affinity for the created task to the requested CPU index.

这个任务具体做什么任务呢?
举一个例子:
ns16550vxInt串口中断处理函数中使用到了。
当这个串口处理函数去读取这个串口中的值时,如果出现了超时没有读取完成的情况,就会把这个中断函数延后执行。

LOCAL void ns16550vxbInt(VXB_DEVICE_ID pDev){FAST NS16550VXB_CHAN * pChan = (NS16550VXB_CHAN *)(pDev->pDrvCtrl);    /* pointer to channel */FAST volatile char        intStatus;UINT8   iirValue, lsrValue;while ( pChan != NULL ){VXB_NS16550_ISR_SET(pChan);switch (intStatus){case IIR_RLS:REG_GET(LSR, pChan, lsrValue);/*read LSR to reset interrupt */intStatus = (char)lsrValue;break;case IIR_RDA:           /* received data available */case IIR_TIMEOUT:{pChan->ier &= ~(RxFIFO_BIT); /* indicate to disable Rx Int */REG_SET(IER, pChan, pChan->ier);VXB_NS16550_ISR_CLEAR(pChan);/*把这个任务延后,继续处理下一个,剩下的任务交给tIsr系统任务执行*/isrDeferJobAdd (pChan->queueId, &pChan->isrDefRd);goto nextChan;}........
}

这相当于就是把一个中断上下文转换为任务上下文来继续执行。
初始化过程

usrRoot--->usrIosCoreInit--->usrIsrDeferInit--->isrDeferLibInit

STATUS isrDeferLibInit(int		mode			/* global deferral queue mode */){
/*记录要使用的模式*/isrDeferLibMode = mode;
/*如果是ISR_DEFER_MODE_PER_CPU模式,就为每一个cpu创建一个队列,来处理这个cpu上所有的延后函数*/if (isrDeferLibMode == ISR_DEFER_MODE_PER_CPU){pCpuQueueId = (ISR_DEFER_QUEUE_ID *) calloc (vxCpuConfiguredGet (),sizeof(*pCpuQueueId));if (pCpuQueueId == NULL)return ERROR;}return OK;}
/*创建处理延后队列函数*/
LOCAL ISR_DEFER_QUEUE * isrDeferQueueCreate(VXB_DEVICE_ID	pInst,	        /* VxBus device id of requester */int			intIdx,	        /* interrupt source index */int			logicalCpuIndex	/* logical CPU index for deferral task */){char taskName[32];char *pT;cpuset_t affinity;ISR_DEFER_QUEUE *pQueue = malloc(sizeof(*pQueue));lstInit (&pQueue->list);semBInit (&pQueue->syncSem, SEM_Q_PRIORITY, SEM_EMPTY);SPIN_LOCK_ISR_INIT (&pQueue->lock, 0);/*根据不同的cpu号,设置一个独一无二的名字,cpu0---tIsr0,cpu1---tIsr1*/strcpy (taskName, "tIsr");pT = taskName + 4;if (pInst == NULL)  /* use CPU index only */{*pT++ = '0' + logicalCpuIndex % 10;*pT   = '\0';}else  /* use device unit number and interrupt index */{*pT++ = '0' + pInst->unitNumber % 10;*pT++ = '0' + intIdx % 10;strcpy (pT, pInst->pName);}/*创建对应处理的系统任务*/pQueue->tid = taskSpawn (taskName,ISR_DEFER_TASK_PRIO,ISR_DEFER_TASK_OPTS,8192, (FUNCPTR) isrDeferTask,(int) pQueue, 0, 0, 0, 0, 0, 0, 0, 0, 0);.....}
/*具体的处理函数*/
LOCAL void isrDeferTask (ISR_DEFER_QUEUE_ID queueId	/* queue for incoming deferred work */){ISR_DEFER_JOB *pJob;
/*死循环,一直等待任务的到来*/FOREVER{semBTake (&queueId->syncSem, WAIT_FOREVER);
/*获取任务,并执行*/FOREVER{SPIN_LOCK_ISR_TAKE (&queueId->lock);pJob = (ISR_DEFER_JOB *) lstGet  (&queueId->list);SPIN_LOCK_ISR_GIVE (&queueId->lock);pJob->func (pJob->pData);}}}


/*把一个任务添加到延迟队列上来*/
void isrDeferJobAdd(ISR_DEFER_QUEUE_ID queueId,	/* queue allocated by isrDeferQueueGet */ISR_DEFER_JOB *    pJob	/* job to enqueue */){SPIN_LOCK_ISR_TAKE (&queueId->lock);lstAdd (&queueId->list, &pJob->node);SPIN_LOCK_ISR_GIVE (&queueId->lock);/*添加完成后,通知isrDeferTask有任务到来了*/semGive (&queueId->syncSem);}/*从队列获取一个任务*/
ISR_DEFER_QUEUE_ID isrDeferQueueGet(VXB_DEVICE_ID  pInst,	           /* VxBus device ID of requester */int		   intIdx,	            /* interrupt source index */int		   logicalCpuIndex, /* logical CPU index for deferral task */int		   mode	            /* deferral queue mode(for future use) */){
/*如果是ISR_DEFER_MODE_PER_CPU模式,就返回对应cpu的那个队列*/if (isrDeferLibMode == ISR_DEFER_MODE_PER_CPU){if (pCpuQueueId [logicalCpuIndex] == NULL)pCpuQueueId [logicalCpuIndex] = isrDeferQueueCreate (0, 0, logicalCpuIndex);return pCpuQueueId [logicalCpuIndex];}
/*如果是另一种模式,就创建这个设备对应的队列*/return isrDeferQueueCreate (pInst, intIdx, logicalCpuIndex);}



这篇关于vxWorks中系统任务tIsr的实现及使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/984706

相关文章

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

Kali Linux安装实现教程(亲测有效)

《KaliLinux安装实现教程(亲测有效)》:本文主要介绍KaliLinux安装实现教程(亲测有效),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、下载二、安装总结一、下载1、点http://www.chinasem.cn击链接 Get Kali | Kal

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案

《使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案》在SpringBoot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能... 目录@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案1

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

java中XML的使用全过程

《java中XML的使用全过程》:本文主要介绍java中XML的使用全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录什么是XML特点XML作用XML的编写语法基本语法特殊字符编写约束XML的书写格式DTD文档schema文档解析XML的方法​​DOM解析XM