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

相关文章

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

基于Python和Tkinter实现高考倒计时功能

《基于Python和Tkinter实现高考倒计时功能》随着高考的临近,每个考生都在紧锣密鼓地复习,这时候,一款实用的倒计时软件能有效帮助你规划剩余时间,提醒你不要浪费每一分每一秒,今天,我们来聊聊一款... 目录一、软件概述:二、功能亮点:1. 高考倒计时2. 添加目标倒计时3. 励志语句4. 透明度调节与

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

CSS @media print 使用详解

《CSS@mediaprint使用详解》:本文主要介绍了CSS中的打印媒体查询@mediaprint包括基本语法、常见使用场景和代码示例,如隐藏非必要元素、调整字体和颜色、处理链接的URL显示、分页控制、调整边距和背景等,还提供了测试方法和关键注意事项,并分享了进阶技巧,详细内容请阅读本文,希望能对你有所帮助...

使用Folium在Python中进行地图可视化的操作指南

《使用Folium在Python中进行地图可视化的操作指南》在数据分析和可视化领域,地图可视化是一项非常重要的技能,它能够帮助我们更直观地理解和展示地理空间数据,Folium是一个基于Python的地... 目录引言一、Folium简介与安装1. Folium简介2. 安装Folium二、基础使用1. 创建

Java实现MD5加密的四种方式

《Java实现MD5加密的四种方式》MD5是一种广泛使用的哈希算法,其输出结果是一个128位的二进制数,通常以32位十六进制数的形式表示,MD5的底层实现涉及多个复杂的步骤和算法,本文给大家介绍了Ja... 目录MD5介绍Java 中实现 MD5 加密方式方法一:使用 MessageDigest方法二:使用

mysql删除无用用户的方法实现

《mysql删除无用用户的方法实现》本文主要介绍了mysql删除无用用户的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 1、删除不用的账户(1) 查看当前已存在账户mysql> select user,host,pa

Nginx配置location+rewrite实现隐性域名配置

《Nginx配置location+rewrite实现隐性域名配置》本文主要介绍了Nginx配置location+rewrite实现隐性域名配置,包括基于根目录、条件和反向代理+rewrite配置的隐性... 目录1、配置基于根目录的隐性域名(就是nginx反向代理)2、配置基于条件的隐性域名2.1、基于条件

Linux配置IP地址的三种实现方式

《Linux配置IP地址的三种实现方式》:本文主要介绍Linux配置IP地址的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录环境RedHat9第一种安装 直接配置网卡文件第二种方式 nmcli(Networkmanager command-line