[FreeRTOS].FreeRTOS CortexM3 M4中断优先级设置总结

转自:https://blog.csdn.net/xukai871105/article/details/53516857

前言
本文将说明在FreeRTOS嵌入式操作系统中,如何设置STM32 Cortex M3和M4系列MCU的中断优先级。
总结

  • 【1】STM32L1系列,STM32F1系列,STM32F4系列,设置NVIC时需要使用NVIC_PriorityGroup_4。
  • 【2】抢占优先级的要比“MAX”更大,而比“LOWEST”更小。例如 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY=5 , configLIBRARY_LOWEST_INTERRUPT_PRIORITY=15 ,那么NVIC抢占优先级设置的具体值应该比MAX=5更大(包括等于),比LOWEST=15更小(包括等于),也就是说5,6,7,8,9,10,11,12,13,14,15肯定是合法值。
  • 【3】FreeRTOS中,数值越大优先级越高,这种优先级可以成为逻辑优先级。Cortex M3/M4中断中,数值越大优先级越低,这种优先级成为中断优先级。两者相反,所以才会出现比"MAX"更大而比“LOWEST”更小的情况。

示意代码
【FreeRTOSConfig.h】

/* Use the system definition, if there is one */
#ifdef __NVIC_PRIO_BITS
#define configPRIO_BITS __NVIC_PRIO_BITS
#else
#define configPRIO_BITS 4 /* 15 priority levels */
#endif

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY    15
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5
/* The lowest priority. */
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* Priority 5, or 95 as only the top four bits are implemented. */
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

【NVIC设置】
【示例A】

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

NVIC_InitStructure.NVIC_IRQChannel = XXXX_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = configLIBRARY_LOWEST_INTERRUPT_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

【示例A】

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

NVIC_InitStructure.NVIC_IRQChannel = XXXX_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = configLIBRARY_LOWEST_INTERRUPT_PRIORITY-1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

原文地址:https://www.cnblogs.com/aaronLinux/p/11108140.html

时间: 2024-10-12 12:55:16

[FreeRTOS].FreeRTOS CortexM3 M4中断优先级设置总结的相关文章

[FreeRTOS]FreeRTOS使用

转自:https://blog.csdn.net/zhzht19861011/article/details/49819109 FreeRTOS系列第1篇---为什么选择FreeRTOS? FreeRTOS系列第2篇---FreeRTOS入门指南 FreeRTOS系列第3篇---FreeRTOS移植指南 FreeRTOS系列第4篇---FreeRTOS编码标准及风格指南 FreeRTOS系列第5篇---FreeRTOS在Cortex-M3上的移植 FreeRTOS系列第6篇---FreeRTOS

TI CC2541的中断优先级设置.

实际看到的中断优先级设置是这样的: 所以, IPG0最高, 为11 IPG4是01, IPG2是10, IPG3跟IPG1, IPG5都是00, 最低. 所以, RF是最高的. T2就是OSAL的优先级是次之. P1, T4, AES加解密再次, 其他都很低.

SylixOS Lite版本中断优先级设置

非Lite版本中断关闭方式 SylixOS向用户提供arch层关中断的接口,其接口名称为archIntDisable(),调用该函数将禁用所有外设的中断. 在ARM体系结构体中,对于ARM系列.Cortex-A系列的芯片,arch层接口archIntDisable()的实现方式如程序清单1.1所示. 程序清单1.1 非Lite版本的arch层中断关闭方式 FUNC_DEF(archIntDisable) MRS R0 , CPSR ORR R1 , R0, #0x80 MSR CPSR_c, R

ARM Cortex-M3/M4 启动分析

ARM Cortex-M3/M4启动分析 序: 之前在进行嵌入式开发的时候,并没有太过于关注ARM芯片的启动逻辑,现在IMXRT1052的学习过程中,发现了还真的老老实实的回去学习一下关于Cortex-M的启动逻辑和原理,才能惬意的玩转IMXRT芯片!此处做个随笔,主要是方便自己回顾,温故而知新嘛! 关键: 要分析cortex-m的启动原理需要从两个方面入手 1.芯片的memory map 2.链接文件 Memory Map: 我们用STM32F4XX来分析!The chip memory ma

cortex-M3/M4死机位置判断

用了挺久的M4(nxp的),但是发现有一个问题挺让人讨厌的,就是程序死机了无法判断死机位置,之前看到一篇文章是通过查看SP LR等寄存器,看堆栈内容来查找.还要看memory里的地址再找函数地址,再看汇编代码.觉得很麻烦.ARM7内核还好判断一些(M3内核未验证,应该一样的知识M4多了个FPU). 偶然一次死机(数组越界).发现在Call Stack居然直接保存了死机的函数名称和地址.非常滴方便啊,哈哈.直接右键calle stack就能看到函数死在哪儿了.网上很少看到关于死机判断位置的文章.不

In order to use an interrupt in a Cortex-M3/M4, you need the following

a stack. The core automatically saves several registers on the stack when an interrupt fires. Initial stack pointer value is read from address 0x0 the first thing when the core starts up. That value should normally equal to the end of RAM + 1. correc

FreeRTOS高级篇3---启动调度器

使用FreeRTOS,一个最基本的程序架构如下所示: int main(void) { 必要的初始化工作; 创建任务1; 创建任务2; ... vTaskStartScheduler(); /*启动调度器*/ while(1); } 任务创建完成后,静态变量指针pxCurrentTCB(见<FreeRTOS高级篇2---FreeRTOS任务创建分析>第7节内容)指向优先级最高的就绪任务.但此时任务并不能运行,因为接下来还有关键的一步:启动FreeRTOS调度器. 调度器是FreeRTOS操作系

FreeRTOS 事件标志组

为什么要使用事件标志事件标志组是实现多任务同步的有效机制之一.也许有不理解的初学者会问采用事件标志组多麻烦,搞个全局变量不是更简单?其实不然,在裸机编程时,使用全局变量的确比较方便,但是在加上 RTOS 后就是另一种情况了. 使用全局变量相比事件标志组主要有如下三个问题:? 使用事件标志组可以让 RTOS 内核有效地管理任务,而全局变量是无法做到的,任务的超时等机制需要用户自己去实现.? 使用了全局变量就要防止多任务的访问冲突,而使用事件标志组则处理好了这个问题,用户无需担心.? 使用事件标志组

FreeRTOS 消息队列

本章节为大家讲解 FreeRTOS 的一个重要的通信机制----消息队列,初学者要熟练掌握,因为消息队列在实际项目中应用较多. 消息队列的概念及其作用消息队列就是通过 RTOS 内核提供的服务,任务或中断服务子程序可以将一个消息(注意,FreeRTOS消息队列传递的是实际数据,并不是数据地址,RTX,uCOS-II 和 uCOS-III 是传递的地址)放入到队列.同样,一个或者多个任务可以通过 RTOS 内核服务从队列中得到消息.通常,先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先