精华内容
下载资源
问答
  • 中断优先级

    2020-01-13 13:36:17
    中断优先级 分组方法 以及中断强度优先级和响应优先级的关系: 注意: 例如:已经设置好分组为2 抢占和响应优先级分别为10 10即抢占优先级为2,响应优先级也为2;如果这时改变分组为3,则抢占优先级为101 0...

    中断优先级

    分组方法

    以及中断强度优先级和响应优先级的关系:

    注意:

    例如:已经设置好分组为2 抢占和响应优先级分别为10 10即抢占优先级为2,响应优先级也为2;如果这时改变分组为3,则抢占优先级为101 0即抢占优先级为5,响应优先级为0,已设置好的中断就会混乱

    设置中断优先级可以使用库函数实现:

    以及中断初始化函数:

    总结一下中断优先级设置:

    具体还是要在代码中实践学习。

    展开全文
  • 前面讲到了各种中断。PIT中断用于控制小车的直立速度角度;EXTI中断用于处理摄像头的行场中断;UART中断用于串口通信;直立控制必须1ms进行一次计算,所以PIT中断一次都不能少;...中断优先级的设置,...

    前面讲到了各种中断。

    PIT中断用于控制小车的直立速度角度;

    EXTI中断用于处理摄像头的行场中断;

    UART中断用于串口通信;

    直立控制必须1ms进行一次计算,所以PIT中断一次都不能少;

    摄像头的行场中断缺一不可,而且行场中断来了必须马上处理,处理过程不能暂停,否则图像会采集出错;

    UART不要求马上反应,但需要处理每个请求;

    那么问题来了,一个中断正在处理的时候,另一个中断来了,怎么办?

    中断优先级的设置,可以让每个中断都得到处理,且能按照优先级进行中断嵌套。(优先级低的中断正在处理的时候,来了优先级高的中断,会先暂停优先级低的中断,执行完优先级高的中断后再继续进行处理。)

    好消息是,在K60和XS128中设置中断优先级都不难。

    K60

    //调整中断优先级 set_irq_priority (int irq, int prio),肥叉烧,2014-3-30

    // irq写的是中断号(注意不是VECTOR的号码)

    // irq可以在cpu/vectors.h中查到

    set_irq_priority (88,0); //exti_PTB最高优先级0,用于控制DMA采集图像;

    set_irq_priority (68,1); // PIT0第二优先级1,用于控制直立;

    set_irq_priority (45,2); // UART0第三优先级2。

    在中断处理函数的开始,一定要EnableInterrupts; 否则优先级更高的中断会执行不了。

    set_irq_priority (int irq, int prio)是cmsis库自带函数,在cpu/arm_cm4.c可以查看实现;

    XS128

    详情请参考:

    4.4.2 Interrupt Prioritization, MC9S12XS256 Reference Manual.

    Table 1-10. Interrupt Vector Locations, MC9S12XS256 Reference Manual.

    1. 在Table 1-10找到相应中断的Vector Address;

    2. 取高4位的值放到CFADDR的高4位里;(如TIM7的地址是Vector base+ $E0,将E放到CFADDR的高4位里,INT_CFADDR = 0xE0;)

    3. 低4位的值除以2,如TIM7的低4位是0,除以2是0,则在CFDATA0中设置TIM7的优先级,如果设成3,则INT_CFDATA0 = 3;

    4. 优先级数值越高,越优先;

    /*************************************************************************

    *  函数名称:SetInterruptPriority

    *  功能说明:Set Priority

    *  参数说明:

    *  函数返回:无

    *  修改时间:2014-04-24

    *  备    注 :   feichashao

    *************************************************************************/

    void SetInterruptPriority(void) {

    // Set timch0 to priority 7.

    // Vector Address $EE

    INT_CFADDR = 0xE0;

    INT_CFDATA7 = 7;    // E/2 = 7

    // Set timch1 to priority 7.

    // Vector Address $EC

    INT_CFADDR = 0xE0;

    INT_CFDATA6 = 7;   // C/2=6

    // Set pit0 to priority 6.

    // Vector Address $7A

    INT_CFADDR = 0x70;

    INT_CFDATA5 = 6;   // A/2=5

    // Set sci0 to priority 5.

    // Vecort Address $D6

    INT_CFADDR = 0xD0;

    INT_CFDATA3 = 5;  // 6/2=3

    }

    展开全文
  • 中断作为stm32中必不可少的一个功能,其重要性是不言而喻的...最终,调试出bug就是由于中断优先级的影响。 本项目使用到的是STM32F030C8型号的MCU,我们可以从官方下载到的标准库文件中的启动汇编文件中,查看到...

      中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本。

      所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工。问题是什么呢?项目中我用到了一个触摸键盘TTP229,结果在测试键盘时,不能够输入密码?最终,调试出bug就是由于中断优先级的影响。

      本项目使用到的是STM32F030C8型号的MCU,我们可以从官方下载到的标准库文件中的启动汇编文件中,查看到本型号单片机的外部中断向量表。(如下图所示)

    ca26a0b2b3f7a89dfd4eb2e38db1c532.png

      首先,我们了解一下NVIC是什么,在core_cm0.h文件中的标准库中的NVIC结构体。

    b80ff3f44b84f510b4259f3130f6b7d6.png

      其中,我们一般只用到ISER、ICER、IP这3个寄存器。ISER用于使能中断,ICER用来清除中断,IP用来设置中断优先级。

      其次,我们了解一下中断优先级,中断优先级寄存器NVIC_IPRx,本寄存器宽度为8位,原则上每个外部中断可配置的优先级为0~255,实际上精简了,只用到了它的高4位。这4位,又被分成了抢占优先级和响应优先级两组,然后,中断优先级有分为以下几种情况:

      1、抢占优先级不同,会涉及到中断嵌套,抢占优先级高的会优先抢占优先级低的,优先得到执行。(注意:优先级数字越小,优先级越高)

      2、抢占优先级相同,不涉及到中断嵌套,响应优先级不同,响应优先级高的先响应。(例如:两个中断同时响应,这里就会先执行响应优先级高的那个中断)(注意:优先级数字越小,优先级越高)

      3、抢占优先级和响应优先级都相同,则比较它们的硬件中断编号,中断编号越小,优先级越高。(硬件中断编号从中断向量表当中查看)

      中断优先级分组,因为中断优先级只使用了高4位,所以,中断优先级的分组分别有以下几种情况:

    e3792cd5ee64a8c0a042ae210bcb96d8.png

      最后,总结一下中断编程的三步曲:

      第一步:使能外设某个中断,具体由对应的中断使能位控制。

      (例如:我们使用到GPIO之前必须开启GPIO端口的时钟,用到EXTI必须开启AFIO时钟)

      第二步:初始化NVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级和响应优先级,使能中断请求。

      库函数:

      NVIC_IRQChannel()设置不同的中断源,在IRQn_Type IRQn结构体寻找自己对应的中断源。

      NVIC_IRQChannelPreemptionPriority()设置抢占优先级

      NVIC_IRQChannelCmd() 中断使能或者取消使能

      第三步:编写中断服务函数,在stm32f0xx_it.c文件中,都有一个根据中断向量表,实现的一个空的中断服务函数,需要我们自己重新编写。

      stm32相关的视频资料

    (stm32直流电机驱动)

    (时钟系统)

    STM32中断系统

    STM32可以这样玩

    分析STM32的的开发方式

    展开全文
  • 3. freertos调度器启动、中断优先级管理、中断优先级分组永远不要小看不起眼的东西,哪怕是短短的一行代码!(某些图片分辨率过大显示不清楚,保存到本地或拖动可放大)。很多例程将vTaskStartScheduler函数作为main...

    3. freertos调度器启动、中断优先级管理、中断优先级分组

    永远不要小看不起眼的东西,哪怕是短短的一行代码!

    (某些图片分辨率过大显示不清楚,保存到本地或拖动可放大)。

    很多例程将vTaskStartScheduler函数作为main执行的最后一行代码,因为执行了vTaskStartScheduler后主权便交给了freertos调度器,程序永远不会在这个函数中得到返回。

    vTaskStartScheduler主要动作有:创建IDLE任务,初始化systick等重要寄存器,手动触发中断重新配置MSP并返回到handle模式执行第一个任务。如图展示源码主要流程:

    d6a6a8c012127296736a71fff4acf6c2.png

    (调度器启动流程)

    流程分析:

    3.1 创建IDLE任务

    vTaskStartScheduler函数中创建了名为IDLE的任务,这个任务的功能先不管它,先饶它不死等对源码逐个击破后它就会不攻自破。

    3.2 关中断

    某些不可重入代码段或定义的一些全局变量,在使用它们之前往往先进入临界区保护下,以免突发事件产生时破坏当前正要处理的数据。比如一些全局变量,如果在中断里或多个任务中都被使用到,当任务正在处理某个全局数组的数据时,此时中断发生并更新了数组中的数据,这样中断返回后就会产生一些不可预料的结果。

    记得在实习那会写过不少这样的错误代码,没有考虑代码能不能重入,结果只能害人害己啊~。

    在task.c中有一些全局变量,freertos为了保护这些变量数据在处理时不被异常破坏而使用了中断屏蔽,不过这种操作并没有将所有可屏蔽中断一股脑全部杀死:freertos提供了“可管理的中断范围”。以某个中断优先级为阈值,优先级低于(或等于)此分界线的中断将全部屏蔽,较高的中断则不受影响。当然不会白白让“高等”优先级执行的,代价便是freertos不会让高优先级的中断参与任何api的调用。所以“高等”优先级是否触发都不会影响freertos的正常运行。

    事实上能够有如此方便的屏蔽操作还要归功于CM3/CM4中NVIC的强大。写到这里,终于引出今天的主角了~。NVIC :嵌套向量中断控制器是CM3/CM4内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。不仅如此,NVIC拥有者更多精巧的设计,BASEPRI寄存器便是其中之一,屏蔽中断所使用的阈值就存储在其中,屏蔽时将需要屏蔽中断的最高优先级值填入寄存器便能达到效果。如果向BASEPRI写0则意味着停止掩蔽任何中断。

    在配置头文件中可以看到阈值的身影:configMAX_SYSCALL_INTERRUPT_PRIORITY

    freertos执行中断屏蔽的源码:

    mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY msr basepri, r1 

    3.3 优先级定义

    CM3中使用了8位寄存器来表达中断优先级,所以原则上,CM3支持256级可编程优先级和3个固定优先级(复位,NMI ,硬 fault)。

    但是,绝大多数 CM3 芯片都会精简设计,对优先级有效位数进行裁剪以达到减少优先级数的目的,不过无论怎样裁剪,有效位都是在高位开始算起。

    注:CM3 允许的最少使用位数为 3 个位,亦即至少要支持 8 级优先级。增加位数将增加更多成本和功耗。

    优先级的数值越小,则优先级越高

    举个例子,使用了3位有效位表达优先级的寄存器:

    eb2ba31cafe2a3e78430f83489d752d9.png

    (使用了3位有效位表达优先级)

    对有效位写1能读回1,无效位读回0,上图寄存器中,若对它写入0xFF则读回0xE0,可以使用读回的方法判断芯片支持多少级中断。

    对比下3位和4位优先级状况:

    1320626d36c1def8752160fc2043f0a1.png

    (3-4优先级对比)

    上图还是来自宝典,有图截取真爽。很明显4位要比3位表示的优先级范围更细致些,当然这是废话,不过为什么一定要将有效位放在高位,而不放在低位更直观。这也完全是为了开发者考虑,高位可以简化程序的跨器件移植:

    假设一个程序要从4位向3位上移植(3位向4位上移植肯定是没问题的,因为4位范围更广),在没有刻意更改优先级的情况下如图:

    d393f2b41a7dd0440d17ab2e757201aa.png

    (MSB减少有效位状况)

    移植后优先级有效位减少,原来相邻的两个优先级被置为一个,消失的中断优先级被拉高,不过这些改变将不会带来致命错误。

    如果使用低位来代表有效位的话将不会这样幸运了:

    1c38ba982a84f7f3daaa5dd14fb3016f.png

    (LSB减少有效位状况)

    红色区域出现移植后超过7的优先级反而升高,这对于之前的程序将会带来不可预测的错误。

    3.4优先级分组

    最后一个函数xPortStartScheduler中有一段断言宏打开时执行的代码,调试阶段肯定要将断言配置打开,这样便于程序在调试阶段及时发现异常。程序段如下:

    4703bba04912c2dab7c30febe7130c6a.png

    乍一看完全不知道执行这段程想要达到的目的,想要弄清楚之前首先要搞懂优先级分组的原则。

    关于优先级分组的信息,引用宝典的原话:“为了使抢占机能变得更可控,CM3 还把 256 级优先级按位分成高低两段,分别是抢占优先级和亚优先级。 NVIC 中有一个寄存器是“应用程序中断及复位控制寄存器”,它里面有一个位段名为“优先级组”。该位段的值对每一个优先级可配置的异常都有影响——把其优先级分为个位段:MSB 所在的位段(左边的)对应抢占优先级,而 LSB 所在的位段(右边的)对应亚优先级”。

    338352bb021ac3cfe801958e9731e178.png

    (分组位与分组优先级对应表)

    抢占优先级决定了抢占行为:当系统正在响应某异常 L 时,如果来了抢占优先级更高的异常 H,则 H 可以抢占 L。亚优先级则处理“内务”:当抢占优先级相同的异常有不止一个悬起时,就优先响应亚优先级最高的异常。这种优先级分组规定:亚优先级至少是 1 个位。因此抢占优先级最多是 7 个位,造成了最多只有 128 级抢占的现象。但是 CM3 允许从比特 7 处分组,此时所有的位都表达亚优先级,没有任何位表达抢占优先级,因而所有优先级可编程的异常之间就不会发生抢占——相当于在它们之中除能了CM3 的中断嵌套机制。

    注:分组位置可以在无效位,在任意无效位的效果都一样,它们都舍去了亚优先级。

    那么了解优先级分组之后,再去分析上面断言宏的主要动作,先向某个外部中断优先级配置寄存器写0xFF再读回,主要判断芯片有多少优先级有效位,然后根据有效位左移依次将最大分组数7减1,这样便得到了能够划分抢占优先级为最大数的分组最大位置,例如开发板优先级有效位为3(优先级寄存器7,6,5位),优先级最多能被分为8组,但是能够将其分为8组的分组位置为4,3,2,1,0。这段程序只取最大值所以ulMaxPRIGROUPValue值得到为4。

    ulMaxPRIGROUPValue值将会在freertos提供的中断api中被使用到,这些api中都会首先执行vPortValidateInterruptPriority()函数。这个函数中有两个断言宏,第一个检查了当前的中断优先级是否低于可屏蔽的中断(上文提到高于可屏蔽的优先级不允许调用freertos的中断api);第二个检查NVIC中设置的分组值是否大于ulMaxPRIGROUPValue,如果大于则意味着存在着主优先级和亚优先级,freertos不允许存在亚优先级,否则断言宏伺候,贴下注释原话:Priority grouping: The interrupt controller (NVIC) allows the bits that define each interrupt's priority to be split between bits that define the interrupt's pre-emption priority bits and bits that define the interrupt's sub-priority. For simplicity all bits must be defined to be pre-emption priority bits. The following assertion will fail if this is not the case (if some bits represent a sub-priority).

    按注释的描述是为了简化而不去设置亚优先级。

    3.5 调度器最后的配置

    在调度器启动之前还进行了:

    1. 配置了两个中断PendSV 和SysTick的优先级,配置头文件中的宏

    configKERNEL_INTERRUPT_PRIORITY表示它们的中断级别,configKERNEL_INTERRUPT_PRIORITY数值一定要大于或等于宏configMAX_SYSCALL_INTERRUPT_PRIORITY的值,或者说PendSV 和SysTick中断优先级一定要在可屏蔽中断范围内,若相反的话可就乱成一锅粥了。

    2. 开启freertos的心脏systick,填入计数值来决定systick中断频率,也是任务调度频率或说是时间片长度。

    3. 跳入prvPortStartFirstTask函数:

    ldr r0, NVIC_VTABLE_R // NVIC_VTABLE_R: 0xE000ED08 ,向量表偏移量寄存器的地址,需要现将向量表重定向ldr r0, [r0] ldr r0, [r0] //取出MSP新地址 msr msp, r0 //重新配置MSP地址 cpsie i //开中断 dsbisbsvc #0 //触发SVC中断

    至此,在进入SVC中断之前,freertos开启调度器代码流程已执行完毕,等待SVC中断处理完成后freertos便进入正轨。奔跑吧!fucking source code

    展开全文
  • 2440 中断优先级问题

    2020-07-29 05:35:44
    折腾2440半年多来,没有看到代码有中断优先级的痕迹,我真不信2440有这么差劲,连优先级寄存器也没有?!后来在2440的数据手册上看到了答案,感觉2440在中断优先级配置方面还是比较精妙的。现在就来学习一下吧。
  • USB在持续通信几十万次后,会出现USB IN中断丢失几次的情况,分析是中断优先级不够高,导 致USB中断在排队,然而排队还未完成,又有新的USB中断发生,致使其中断丢失。LPC1769的所有中 断默认为最高优先级"0"...
  • 近期在stm32 RTOS系统上编写RTC中断处理程序,源程序上添加了RTC初始化函数,发现整个系统跑不...1、优先级组设置概念:stm32库函数可以设置16个中断优先级,按照抢占式和子优先级的组合方式不同可以分成5组,如下:...
  • TMS320F28335中断优先级与中断嵌套的使用及讲解[复制链接]使用中断,就一定会涉及到中断嵌套的处理。下面就来看看28335如何实现中断嵌套。1,28335默认是禁止中断的。在进入中断后,CPU默认关全局中断,保存IER,...
  • FreeRTOS中断优先级和任务优先级 架构:Cortex-M3 版本:FreeRTOS V9.0.0 前言: 最开始,我并没有搞清楚什么是中断优先级和任务优先级,但看了部分资料后发现这两个并没有半毛钱关系,于是便有了这篇笔记,本...
  • FreeRtos 任务优先级和中断优先级

    千次阅读 2019-07-01 17:36:19
    中断优先级和任务优先级的区别: 1.简单的说,这两者之间没有任何关系,不管中断的优先级是多少,中断的优先级永远高任何任务的优先级,即在执行的过程中,中断来了就开始执行中断服务程序, 2.对应STM32F103 F...
  • 1.理解AT89C51单片机中断优先级和优先权。 2.用PROTEUS设计、仿真基于AT89C51单片机的中断优先级实验。 3.掌握中断编程。 优先级实验
  • PAGE PAGE #/ 3 STM32中断优先级彻底讲解 一综述 STM32目前支持的中断共为84个16个内核+68个外部16级可编程 中断优先级 的设置仅使用中断优先级设置 8bit 中的高 4位和 16个抢占优先级因 为抢占优先级最多可以有四...
  • 3. freertos调度器启动、中断优先级管理、中断优先级分组 永远不要小看不起眼的东西,哪怕是短短的一行代码! 某些图片分辨率过大显示不清楚,保存到本地或点击放大会回复原状。 原本认为几分钟能搞定的...
  • stm32中断优先级概述

    2020-07-20 02:46:25
    STM32 目前支持的中断共为 84 个(16 个内核+68 个外部),可以提供16 级可编程中断优先级的设置,下面一起来学习一下
  • Cortex-M内核提出中断分组的概念,一共5组 NVIC_PriorityGroup_0 :0 bit 抢占优先级 4 bit 子优先级 NVIC_PriorityGroup_1 :1 bit 抢占优先级 3 bit 子优先级 NVIC_PriorityGroup_2 :2 bit 抢占优先级 2 bit ...
  • 3. freertos调度器启动、中断优先级管理、中断优先级分组 永远不要小看不起眼的东西,哪怕是短短的一行代码! (某些图片分辨率过大显示不清楚,保存到本地或拖动可放大)。 很多例程将vTaskStartScheduler函数...
  • 本文主要讲了msp430单片机的中断优先级,下面一起来学习一下
  • 包含五个中断源,两级中断优先级,优先级可编程设置,通过IP进行设置:  51单片机中断优先级的设置方法解析  PX0(IP.0),外部中断0优先级设定位;  PT0(IP.1),定时/计数器T0优先级设定位;...
  • STM32支持多种中断,经常遇到中断优先级的问题,关于cortex-M3的中断优先级的描述。
  • XS128中断优先级设置

    2016-06-05 19:04:30
    XS128中断优先级设置
  • 摘要:中断优先级的内容,有一般紧急的中断,有特别紧急的中断,这取决于具体的系统设计,这就涉及到中断优先级和中断嵌套的概念,今天先简单介绍一下相关寄存器,不做例程说明。中断的产生背景,实际生活当中还有更...
  • NVIC中断优先级管理

    2020-05-15 18:56:50
    NVIC中断优先级管理 1、中断管理方法: 对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。 2、NVIC中断优先级分组 (1)分组配置在寄存器 分组配置是在寄存器SCB->AIRCR中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,248
精华内容 2,099
关键字:

中断优先级