0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FreeRTOS中断测试避坑指南

Dp1040 来源:技术让梦想更伟大 2023-12-21 09:04 次阅读

FreeRTOS中断简介

任何调用中断安全FreeRTOS API函数的中断服务例程都可以使用的最高中断优先级。不要从任何优先级高于此的中断调用中断安全FREERTOS API函数(优先级越高,数值越低)。

代码如下(版本FreeRTOS V202107.00):

/*Cortex-M specific definitions.*/
#ifdef __NVIC_PRIO_BITS
/*__BVIC_PRIO_BITS will be specified when CMSIS is being used.*/
#define configPRIO_BITS__NVIC_PRIO_BITS
#else
#define configPRIO_BITS4/*15 priority levels*/
#endif

/*The lowest interrupt priority that can be usedina call to a"set priority"
function.*/
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY0xf

/*The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS APIfunctions.DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS!(higher priorities are lower numeric values.*/
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5

/*Interrupt priorities used by the kernel port layer itself.These are generic
to all Cortex-M ports,anddonot rely on any particular libraryfunctions.*/
#define configKERNEL_INTERRUPT_PRIORITY(configLIBRARY_LOWEST_INTERRUPT_PRIORITY<< (8 - configPRIO_BITS) )
/* !!!! 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) )

configMAX_SYSCALL_INTERRUPT_PRIORITY 高于此优先级的中断,不能被禁止。

cbd8c0a4-9f98-11ee-8b88-92fbcf53809c.jpg

测试过程

开启定时器TIM6和TIM7,两个定时器每隔一定时间串口打印一次,设置定时器TIM6中断优先级为4,定时器TIM7中断优先级为5, 高于 5 的优先级(即优先级数小于5)不归操作系统管理。

简而言之,定时器TIM6不归FreeRTOS管理,在关闭中断时,低于优先级5的都会被关闭,高于或者等于优先级5的都会被关闭。

1、创建中断测试任务

xTaskCreate((TaskFunction_t)interrupt_task,//任务函数
(const char*)"interrupt_task",//任务名称
(uint16_t)INTERRUPT_STK_SIZE,//任务堆栈大小
(void*)NULL,//传递给任务函数的参数
(UBaseType_t)INTERRUPT_TASK_PRIO,//任务优先级
(TaskHandle_t*)&INTERRUPTTask_Handler);//任务句柄

2、中断测试任务函数

void interrupt_task(void*pvParameters)
{
static u32 count_num=0;
while(1)
{
count_num++;
if(count_num==5)
{
printf("关闭中断.............
");
portDISABLE_INTERRUPTS();//关闭中断
delay_xms(5000);//延时5s
printf("打开中断.............
");
portENABLE_INTERRUPTS();//打开中断
}
vTaskDelay(1000);//延时1000个时钟节拍,就是1sconfigTICK_RATE_HZ
}
}

3、定时器中断服务函数

void TIM6_IRQHandler(void)
{
if(TIM_GetITStatus(TIM6,TIM_IT_Update))//是否产生中断
{
printf("TIM6中断
");
TIM_ClearITPendingBit(TIM6,TIM_IT_Update);//清除中断标志位
}
}

void TIM7_IRQHandler(void)
{
if(TIM_GetITStatus(TIM7,TIM_IT_Update))//是否产生中断
{
printf("TIM7中断
");
TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除中断标志位
}
}

4、测试结果

cbe67a5a-9f98-11ee-8b88-92fbcf53809c.png

5、注意事项

临界区、中断服务函数、开关中断中不能使用vTaskDelay()函数,此函数就是要交出CPU一段时间,如果任务一直不延时或者挂起,那么低优先级的任务会无法获得CPU。







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10449

    浏览量

    206579
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112050
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61351
  • 中断优先级
    +关注

    关注

    0

    文章

    22

    浏览量

    9270

原文标题:FreeRTOS避坑指南之中断测试

文章出处:【微信号:玩点嵌入式,微信公众号:玩点嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FreeRTOS编程指南

    FreeRTOS编程指南
    发表于 11-05 17:13

    STM32基础知识入门指南

    一STM32入门踩笔记——(2)无敌的我、又回来了。。。。又是元气满满的一天、又是踩崩溃的一天。昨晚上连夜把跑马灯寄存器版本搞定了。这里需要声明一下。哈哈、首先说我不是水军或者托儿哈!!我
    发表于 08-03 07:30

    如何对FreeRTOS中断进行测试

    FreeRTOS与临界段代码保护有关的函数有哪几个?如何对FreeRTOS中断进行测试呢?
    发表于 11-26 08:06

    分享一些嵌入式系统编程中内存操作相关的指南

    在嵌入式系统的编程中,内存操作是我们常用到的,但往往也是易错的地方,怎么避免呢,今天给大家分享一些相关的指南。数据指针...
    发表于 12-17 07:18

    FreeRTOS实时内核使用指南-中文

    FreeRTOS实时内核使用指南-中文版,Using the FreeRTOS Real Time Kernel - A Practical Guide的中文版本
    发表于 07-13 15:11 119次下载

    FreeRTOS 使用指南

    FreeRTOS 使用指南
    发表于 10-24 13:37 25次下载
    <b class='flag-5'>FreeRTOS</b> 使用<b class='flag-5'>指南</b>

    基于STM32应用的FreeRTOS中断设置

    一、FreeRTOS中断设置介绍 FreeRTOSConfig.h中定义了两个宏,分别是: configKERNEL_INTERRUPT_PRIORITY
    发表于 11-29 19:46 1611次阅读
     基于STM32应用的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>中断</b>设置

    STM32中断FreeRTOS中断优先级配置

    STM32中断,及FreeRTOS中断优先级配置
    的头像 发表于 03-04 11:45 8203次阅读
    STM32<b class='flag-5'>中断</b>及<b class='flag-5'>FreeRTOS</b><b class='flag-5'>中断</b>优先级配置

    FreeRTOS学习笔记--临界段代码处关闭中断

    FreeRTOS学习笔记--临界段代码处关闭中断一、临界段代码二、Cortex-M4中断管理三、中断屏蔽实验四、结语一、临界段代码大家在学习Free
    发表于 12-04 14:51 10次下载
    <b class='flag-5'>FreeRTOS</b>学习笔记--临界段代码处关闭<b class='flag-5'>中断</b>

    2.FreeRTOS中断优先级和任务优先级

    FreeRTOS中断优先级和任务优先级架构:Cortex-M3版本:FreeRTOS V9.0.0前言:最开始,我并没有搞清楚什么是中断优先级和任务优先级,但看了部分资料后发现这两个并
    发表于 12-04 20:21 8次下载
    2.<b class='flag-5'>FreeRTOS</b><b class='flag-5'>中断</b>优先级和任务优先级

    FREERTOS中断组屏蔽实验

    FREERTOS中断组屏蔽实验Cortex M中断管理(该段取自正点原子FREETRTOS开发手册,我觉得比较详细了)当多个中断来临的时候处理器应该响应哪--个
    发表于 12-31 19:16 6次下载
    <b class='flag-5'>FREERTOS</b><b class='flag-5'>中断</b>组屏蔽实验

    STM32之FreeRTOS:(一) 中断配置和临界段的使用

    STM32之FreeRTOS:(一) 中断配置和临界段的使用文章目录STM32之FreeRTOS:(一) 中断配置和临界段的使用前言 一、stm32的NVIC 分组配置二、
    发表于 01-14 15:43 3次下载
    STM32之<b class='flag-5'>FreeRTOS</b>:(一) <b class='flag-5'>中断</b>配置和临界段的使用

    Cortex-M中断FreeRTOS中断优先级配置原理

    下面就来说说关于Cortex-M的中断,及FreeRTOS中断优先级配置原理。
    发表于 02-08 15:30 3次下载
    Cortex-M<b class='flag-5'>中断</b>及<b class='flag-5'>FreeRTOS</b><b class='flag-5'>中断</b>优先级配置原理

    FreeRTOS开关中断定义

    FreeRTOS 开关中断 FreeRTOS 开关中断函数为 portENABLE_INTERRUPTS ()和 portDISABLE_INTERRUPTS(),这两个函数其实是宏定
    的头像 发表于 09-28 11:37 354次阅读
    <b class='flag-5'>FreeRTOS</b>开关<b class='flag-5'>中断</b>定义

    FreeRTOS中断测试实验

    FreeRTOS 中断测试实验 设定:FreeRTOS 中优先级低于 configMAX_SYSCALL_INTERRUPT_PRIORITY的中断
    的头像 发表于 09-28 11:42 329次阅读
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>中断</b><b class='flag-5'>测试</b>实验