精华内容
下载资源
问答
  • 2021-05-13 08:27:59

    我列出了所有中断:

    cat /proc/interruts

    它给出了这个:

    CPU0 CPU1 CPU2 CPU3

    0: 126 0 0 0 IO-APIC-edge timer

    1: 941 0 0 0 IO-APIC-edge keyboard

    ... (etc.)

    19: 941 0 0 0 IO-APIC-fasteoi eth0

    ... (etc.)

    此表中的第一列是否给出优先级中断?我只是想学习优先级,因为我想提高NIC的中断优先级以获得更好的网络性能.我想,前两个中断不能改变(我想是因为intel x86架构).

    无论如何,这是我的问题:

    是否可以提高NIC中断的优先级?

    更多相关内容
  • 各位大神,最近做项目遇到一问题,如下:功能要求:串口要接收大量数据,用于绘图;使用串口屏绘图,每5ms刷新一次...中断优先级分组为2。故障表现:定时器绘图正常,但串口接收大量数据丢失,把TIM3关掉,或者TIM3...

    各位大神,最近做项目遇到一问题,如下:功能要求:串口要接收大量数据,用于绘图;使用串口屏绘图,每5ms刷新一次。

    实现过程:使用TIM3,每5ms取一次数据,并发送一次绘图命令,优先级设置为抢占3,组内2;使能串口1接收中断(或DMA空闲中断),把数据放置在某缓冲区,优先级设置为最高(抢占0,组内0);中断优先级分组为2。

    故障表现:定时器绘图正常,但串口接收大量数据丢失,把TIM3关掉,或者TIM3中断时间改成100ms,串口就能正常工作。貌似定时器优先级比串口优先级高,非常奇怪。

    部分代码如下:

    void USART1_Init(uint32_t baud)

    {

    USART_InitTypeDef USART1_InitStruct;

    GPIO_InitTypeDef GPIO_InitStruct;

    NVIC_InitTypeDef NVIC_InitStruct;

    //enable clock

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);

    //reset usart1

    USART_DeInit(USART1);

    //init GPIO

    //PA9 TX

    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;

    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;

    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&GPIO_InitStruct);

    //PA10 RX

    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;

    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;

    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&GPIO_InitStruct);

    //Init usart

    USART1_InitStruct.USART_BaudRate=baud;

    USART1_InitStruct.USART_WordLength=USART_WordLength_8b;

    USART1_InitStruct.USART_StopBits=USART_StopBits_1;

    USART1_InitStruct.USART_Parity=USART_Parity_No;

    USART1_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

    USART1_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;

    USART_Init(USART1,&USART1_InitStruct);

    //init NVIC

    NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;

    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;

    NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;

    NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;

    NVIC_Init(&NVIC_InitStruct);

    //enable rx interrupt

    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

    //enable usart1

    USART_Cmd(USART1,ENABLE);

    }

    void SendChar1(char ch)

    {

    USART_SendData(USART1,ch);

    while(!USART_GetFlagStatus(USART1,USART_FLAG_TC));

    USART_ClearFlag(USART1,USART_FLAG_TC);

    }

    void SendStr1(char *str)

    {

    while(*str)

    {

    SendChar(*str);

    str++;

    }

    }

    void USART1_IRQHandler(void)

    {

    if(USART1->CR1 & RXNEIE)

    {

    //receive first byte

    *(usart1->buff+0)=USART1->DR;

    SendChar1(*(usart1->buff+0));//直接转发

    USART_ClearFlag(USART1,USART_IT_RXNE);

    //定时器代码

    void TIM3_Init(u16 arr,u16 psc)

    {

    NVIC_InitTypeDef NVIC_InitStruct;

    TIM_TimeBaseInitTypeDef TIM_InitStruct;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

    TIM_InitStruct.TIM_Period=arr;

    TIM_InitStruct.TIM_Prescaler=psc;

    TIM_InitStruct.TIM_ClockDivision=TIM_CKD_DIV1;

    TIM_InitStruct.TIM_CounterMode=TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM3,&TIM_InitStruct);

    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);

    NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn;

    NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;

    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0x03;

    NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x02;

    NVIC_Init(&NVIC_InitStruct);

    TIM_Cmd(TIM3,ENABLE);

    }

    void TIM3_IRQHandler(void)

    {

    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)

    {

    TEST_LED_ON();

    if(rt->Data_Length>0&&rt->ECG_Started==TRUE)

    {

    //set end point position

    rt->EndPoint.x = ECG_START_DRAWING_POS_X + 1 + (u16)(ECG_SCALE_X*rt->time_Counter);

    rt->EndPoint.y = ECG_DRAWING_BASELINE_Y +0x80- rt->pData[rt->Data_Index];

    if(rt->EndPoint.x > ECG_END_DRAWING_POS_X)

    {

    rt->EndPoint.x=ECG_START_DRAWING_POS_X;

    rt->time_Counter=0;

    rt->StartPoint.x=ECG_START_DRAWING_POS_X;

    rt->StartPoint.y=rt->EndPoint.y;

    }

    if(rt->StartPoint.x<455)

    {

    //draw line

    DrawLine(&rt->StartPoint,&rt->EndPoint);

    }

    rt->StartPoint.x=rt->EndPoint.x;

    rt->StartPoint.y=rt->EndPoint.y;

    rt->time_Counter=(rt->time_Counter+1)%459;

    //change ECG_Data index

    rt->Data_Index=(rt->Data_Index+1)%rt->Data_Length;

    }

    TEST_LED_OFF();

    }

    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);

    }

    初始化部分:

    USART1_Init(9600);

    TIM3_Init(49,7199);//5ms

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    用示波器看TIM3中断,脉宽5ms,正常。求救!!!!

    我来回答

    展开全文
  • ULK第四章里明确讲到“Linux实现了一种没有优先级的中断模型”,并且“Linux中断和异常都支持嵌套”。这个我不太理解了,这两种说法都与我以前的理解刚好相反,核对了原书,翻译没有错。Linux中断系统到底是否支持...

    ULK第四章里明确讲到“Linux实现了一种没有优先级的中断模型”,并且“Linux中断和异常都支持嵌套”。这个我不太理解了,这两种说法都与我以前的理解刚好相反,核对了原书,翻译没有错。

    Linux中断系统到底是否支持优先级,可否嵌套,中断号又是怎么来确定的,中断产生时又是如何一步步执行到中断处理函数的。为了彻底搞懂Linux中断系统,我决定从最原始材料出发,一探究竟。(s3c2440+linux2.6.21)

    先来看看ARM的硬件执行流程

    异常是ARM处理器模式分类,ARM有七种运行模式USR,SYS,SVC,IRQ,FIQ,UND,ABT

    五种异常模式:SVC,IRQ,FIQ,UND,ABT

    20167516719788874.png

    中断模式是ARM异常模式之一(IRQ模式,FIQ模式),是一种异步事件,如外部按键产生中断,内部定时器产生中断,通信数据口数据收发产生中断等。

    1.当一个异常产生时,以FIQ为例,CPU切入FIQ模式时,

    ①将原来执行程序的下一条指令地址保存到LR中,就是将R14保存到R14_fiq里面。

    ②拷贝CPSR到SPSR_fiq。

    ③改变CPSR模式位的值,改到FIQ模式。

    ④改变PC值,将其指向相应的异常处理向量表。

    离开异常处理的时候,

    ①将LR(R14_fiq)赋给PC。

    ②将SPSR(SPSR_fiq)拷贝到CPSR。

    ③清除中断禁止标志(如果开始时置位了)。

    ARM一般在某个固定地址中有一个异常向量表,比如0x0

    20167516720300919.png

    当一个外部IRQ中断产生时

    ①处理器切换到IRQ模式

    ②PC跳到0x18处运行,因为这是IRQ的中断入口。

    ③通过0x18:LDR PC, IRQ_ADDR,跳转到相应的中断服务程序。这个中断服务程序就要确定中断源,每个中断源会有自己独立的中断服务程序。

    ④得到中断源,然后执行相应中断服务程序

    ⑤清除中断标志,返回

    20167516720467675.png

    这就是一个外部中断完整的执行流程了,下面以具体寄存器来更具体的了解ARM的中断机制。

    假设ARM核有两个中断引脚,一根是irq pin,一根是fiq pin,正常情况下,ARM核只是机械地随着PC指示去执行,当CPSR中的I位和F位都为1时,IRQ和FIQ都处于禁止状态,这时候无论发什么信号,ARM都不会理睬。

    当I位或F位为0时,irq pin有中断信号过来时,ARM当前工作就会被打断,切换到IRQ模式,并且跳转到异常向量表的中断入口0x18,SRCPND中相应位置1,经过检查中断优先级寄存器以及屏蔽寄存器,确定中断源,INTPND相应位置1(经过仲裁,只有一位置1),这过程由ARM自动完成。0x18存放的是总的中断处理函数,在这个函数里,可以建立一个二级中断向量表,先清除SRCPND相应位,然后根据中断源执行相应中断服务程序,清除INTPND,返回。

    及时清除中断Pending寄存器的标志位是为了避免两个问题:①发生中断返回后,立即又被中断,不断的重复响应②丢失中断处理过程中发生的中断,返回后不响应。

    在某个IRQ中断程序执行过程中,有另外一个外部IRQ中断产生,会将SRCPND相应位置1,等该中断服务执行完,经过仲裁决定下一个要响应的中断。但是假如当产生的是FIQ,则保存当前IRQ的现场,嵌套响应FIQ,FIQ服务程序执行完,再继续执行IRQ服务。那么当一个FIQ正在服务,产生另外一个FIQ,会怎样呢,答案是不会被打断,跟IRQ一样等当前中断服务完成,再仲裁剩余需要相应的中断。

    所以得出这样的结论:

    ①关于中断嵌套:IRQ模式只能被FIQ模式打断,FIQ模式下谁也打不断。

    ②关于优先级:ARM核对中断优先级,有明确的可编程管理。

    下面再来看看Linux对ARM是怎么处理的,记住一个前提:Linux对ARM的硬件特性可以取舍,但不可更改。

    1.建立异常向量表:

    系统从arch/arm/kernel/head.S的ENTRY(stext)开始执行,__lookup_processor_type检查处理器ID,__lookup_machine_type检查机器ID,__create_page_tables创建页表,启动MMU,然后由arch/arm/kernel/head_common.S跳到start_kernel()->trap_init()

    点击(此处)折叠或打开

    展开全文
  • Linux中软中断实现分析在Linux中最多可以注册32个软中断,目前系统用了6个软中断,他们为:定时器处理、SCSI处理、网络收发处理以及Tasklet机制,这里的tasklet机制就是用来实现下半部的,描述软中断的核心数据结构...

    Linux中软中断实现分析

    在Linux中最多可以注册32个软中断,目前系统用了6个软中断,他们为:定时器处理、SCSI处理、网络收发处理以及Tasklet机制,这里的tasklet机制就是用来实现下半部的,

    描述软中断的核心数据结构为中断向量表,其定义如下:

    struct softirq_action

    {

    void (*action)(struct softirq_action *); /* 软中断服务程序 */

    void *data;                                         /* 服务程序输入参数 */

    };

    软中断守护daemon是软中断机制的实现核心,其实现过程也比较简单,通过查询软中断状态irq_stat来判断事件是否发生,如果发生,那么映射到软中断向量表,调用执行注册的action函数就可以了。从这一点分析可以看出,软中断的服务程序的执行上下文为软中断daemon。在Linux中软中断daemon线程函数为do_softirq()。

    触发软中断事务通过raise_softirq()来实现,该函数就是在中断关闭的情况下设置软中断状态位,然后判断如果不在中断上下文,那么直接唤醒守护daemon。

    常用的软中断函数列表如下:

    1、  Open_softirq,注册一个软中断,将软中断服务程序注册到软中断向量表。2、  Raise_softirq,设置软中断状态bitmap,触发软中断事务。

    Tasklet机制实现分析

    Tasklet为一个软中断,考虑到优先级问题,分别占用了向量表中的0号和5号软中断。Tasklet机制的实现原理如下图所示:

    7354d7ae9d578b3605dacc6cd5834d48.png

    当tasklet的软中断事件发生之后,执行tasklet-action的软中断服务程序,该服务程序会扫描一个tasklet的任务列表,执行该任务中的具体服务程序。在这里举一个例子加以说明:

    当用户读写USB设备之后,发生了硬件中断,硬件中断服务程序会构建一个tasklet_struct,在该结构中指明了完成该中断任务的具体方法函数(下半部执行函数),然后将tasklet_struct挂入tasklet的tasklet_struct链表中,这一步可以通过tasklet_schedule函数完成。最后硬件中断服务程序退出并且CPU开始调度软中断daemon,软中断daemon会发现tasklet发生了事件,其会执行tasklet-action,然后tasklet-action会扫描tasklet_struct链表,执行具体的USB中断服务程序下半部。这就是应用tasklet完成中断下半部实现的整个过程。

    Linux中的tasklet实现比较简单,其又封装了一个重要数据结构tasklet_struct,使用tasklet主要函数列表如下:

    1、  tasklet_init,初始化一个tasklet_struct,当然可以采用静态初始化的方法,宏为:DECLARE_TASKLET。

    2、  tasklet_schedule,调度一个tasklet,将输入的tasklet_struct添加到tasklet的链表中。

    Linux中的软中断机制就是模拟了硬件中断的过程,其设计思想完全可以在其他嵌入式OS中得以应用。0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • linux设置程序优先级

    千次阅读 2021-06-07 13:56:43
    1.linux程序优先级说明 linux下进程调度优先级是从-20到19,一共40个级别,数字越大,表示进程的优先级越低。默认进程优先级是0。 2.查看 ...
  • Linux-ARM之中断GIC分析

    2021-05-16 14:26:01
    1.“站的高尿的远”GIC为中断控制器,不要和ARM core的中断搞混了,这些中断都是连接到ARM core的IRQ或者FIQ上的。要了解arm中断系统,GIC绝对不容错过,好先付上一张大家都能百度到的图片。++和*可以先不用考虑,...
  • Linux单处理器系统中,定时器中断与系统处于内核模式还是用户模式无关?系统处于内核模式时,定时器中断是否有任何不同的行为?解决方法:简单的答案是硬件时钟中断服务程序的执行以及动态定时器处理程序的调度都不受...
  • configMAX_SYSCALL_INTERRUPT_PRIORITY 中断优先级设置问题 从CortexM角度 Cortex-M构架自身最多允许256级可编程优先级(优先级配置寄存器最多8位,所以优先级范围从0x00~0xFF), 是绝大多数微控制器制造商只是使用...
  • 概述1.1 进程优先级1.2 普通进程的调度1.2.1 静态优先级和基本时间片1.2.2 动态优先级和平均睡眠1.3 实时进程的调度1.4 内核空间优先级2.调度策略2.1 进程的抢占2.2 调度算法2.3 O(1)调度2.4 调度模型——机制与策略...
  • Linux之时钟中断详解

    2021-01-20 16:27:30
    Linux的0号中断是一个定时器中断。在固定的时间间隔都发生一次中断,也是说每秒发生该中断的频率都是固定的。该频率是常量HZ,该值一般是在100 ~ 1000之间。该中断的作用是为了定时更新系统日期和时间,使系统时间...
  • Priority Inversion 优先级反转是嵌入式实时系统里面的一个经典的问题。简单描述一下这个问题:有三个优先级不同的task,A,B,C; A的优先级最高,B次之,C最低。其中A和C有共享的临界区。如果C已进入临界区,那么A在...
  • 中断优先级和中断线程优先级

    千次阅读 2017-11-12 15:40:00
    中断是一种当今很重要的硬件与cpu通信的方式,主板上集成很多硬件,那么就可以认为会有很多中断,但是cpu的数目往往要少得多,那么肯定会有多个硬件中断竞争一个cpu的情况,任何系统(包括自然界)都不能乱套,肯定...
  • 在学习了linux的完全公平调度算法(CFS)后,记录下学习轨迹这篇文章主要讲述,完全公平调度算法的工作方式,和一些调度知识我们可以通过ps -l看到当前正在运行的进程的详细信息其中F:表示进程旗标,标识进程所拥有的...
  • FreeRTOS 之 优先级翻转

    2021-05-23 12:37:06
    互斥量一般具有如下特性: 1、优先级继承 2、互斥量不能在中断中使用 3、互斥量获取和释放需要再同一个task中 1.2、信号量: 信号量分为计数信号量和二值信号量,一般用于同步,应用场景比如一个任务等待信号量,另...
  • Linux 进程优先级 NICE、PRI

    千次阅读 2022-03-06 17:23:44
    nice值应该是熟悉Linux/UNIX的人很了解的概念了,我们都知它是反应一个进程“优先级”状态的值,其取值范围是-20至19,一共40个级别。这个值越小,表示进程”优先级”越高,而值越大“优先级”越低。我们可以通过...
  • 中断单片机CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A...
  • Linux中断基础知识

    2021-12-19 15:18:20
    SGI通常在Linux内核中被用作IPI中断(inter- processorinterrupts),并会送达到系统指定的CPU上。 (2)PPI:私有外设中断(PrivatePeripheralInterrupt),是每个CPU私有的中断。最多支持 16个PPI中断,硬件中断...
  • linux 的调度策略与优先级 参考资料如下: man手册man 7 sched 内核文档 Documentation/scheduler。 首先需要说明,我们常说的进程调度器是传统的说法,但是实际上进程是资源管理的单位,线程才是调度的单位.有时也...
  • 今天继续给大家介绍Linux,本文主要内容是Linux进程控制与进程优先级。 一、Linux进程控制 在Linux系统中,kill命令被用作进程控制,该命令通过给进程发送信号量,从而可以对进程进行暂停、中止等操作,执行命令kill...
  • 文章目录前言一、基础知识1、常见的定时器资源2、定时器中断频率计算二、CubeMx硬件配置1、硬件配置步骤:2、CubeMx硬件配置3、定时器配置总结 前言 利用HAL库开发实现功能:使用TIM2实现定时,每隔1秒实现双闪功能...
  • 小编典典我做了一个实验来确定这一点,如下所示:process1:RT优先级= 40,CPU关联性= CPU0。此进程“旋转” 10秒钟,因此它不会让任何较低优先级的进程在CPU 0上运行。process2:RT优先级= 39,CPU关联性= CPU0。此...
  • 首先,Linux是一个时分操作系统...linux线程优先级的范围是 0 ~ 139,值越小,优先级越高。user space 线程优先级的范围是 100 ~ 139,默认创建的线程优先级是120,对应的nice值是0,nice值的范围是 -20 ~ 19,对应的优
  • 对于x86硬中断的概念,一直都落在理论的认识之上,...以前的认识:Linux对硬中断(本文如无特殊说明,都是指普通意义上的可屏蔽硬件中断)的处理有优先级概念,高优先级中断可以打断低优先级中断。重新认识:1,对...
  • linux线程优先级设置

    万次阅读 2017-03-24 09:09:26
    Linux线程优先级 Linux内核的三种调度策略:  1.SCHED_OTHER 分时调度策略  2.SCHED_FIFO 实时调度策略,先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃  3.SCHED_...
  • Linux系统下提升进程优先级的办法

    千次阅读 2019-07-23 11:37:01
    Linux系统进程的优先级取值:-20 到 19,数越大优先级越低。 可以通过top命令来查看,NI那一列。 改变进程的优先级的方法有两种: www.2cto.com 1,top命令。输入r,然后根据提示输入进程ID,再输入优先级...
  • Linux进程优先级系统——设置实时进程优先级

    万次阅读 多人点赞 2018-10-22 23:13:29
    最近研发的产品出了点小bug,最后查到根本原因是,其中一个进程A使用基于FIFO的实时进程优先级,而另一个进程B是使用普通调度的进程优先级,而A和B两个进程是互相通信的,进程B会被饿死,而进程A也不能正常工作。...
  • Linux进程的优先级

    千次阅读 2018-09-10 22:34:39
    为什么要有优先级:在多任务操作系统中,操作系统为了区分进程的重要程度,需要有一个衡量重要程度的指标,优先级便由此产生 一、nice值和Priority值 首先用top命令看一下当前进程的信息: top 得到: ...
  • Linux中断子系统(一)中断控制器GIC架构 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客: Linux中断子系统(一)中断控制器及驱动分析 吐血整理|肝翻Linux中断所有知识点 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,833
精华内容 25,133
关键字:

linux 中断优先级