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

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设