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

    文章

    10824

    浏览量

    211088
  • 定时器
    +关注

    关注

    23

    文章

    3237

    浏览量

    114432
  • FreeRTOS
    +关注

    关注

    12

    文章

    483

    浏览量

    61990
  • 中断优先级
    +关注

    关注

    0

    文章

    22

    浏览量

    9348

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

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

收藏 人收藏

    评论

    相关推荐

    freeRTOS开发笔记】记一次爹的freeTOS升级

    freeRTOS开发笔记】记一次爹的freeTOS-v9.0.0升级到freeRTOS-v10.4.4
    的头像 发表于 07-11 09:15 4551次阅读
    【<b class='flag-5'>freeRTOS</b>开发笔记】记一次<b class='flag-5'>坑</b>爹的freeTOS升级

    如何对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 121次下载

    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 1990次阅读
     基于STM32应用的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>中断</b>设置

    STM32中断FreeRTOS中断优先级配置

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

    STM32CubeIDE+FREERTOS记录

    STM32CubeIDE+FREERTOS记录
    发表于 12-05 18:06 15次下载
    STM32CubeIDE+<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>优先级配置原理

    PCB设计指南

    本文就重点讲解PCB设计指南,99%的PCB工程师容易忽略的!点进来 大家在PCB设计
    的头像 发表于 03-20 18:20 1138次阅读
    PCB设计<b class='flag-5'>避</b><b class='flag-5'>坑</b><b class='flag-5'>指南</b>

    【6月28日|直播】遇见KeysightCare——贵重仪器安全指南

    现场直播时间: 2023年6月28日 下午1415   立即报名 01 直播简介 什么?!价值百万的仪器坏了?怎么就坏了呢?如果你有这样的困惑,快来参加直播,听听专家详细介绍如何“”,保证高端
    的头像 发表于 06-14 07:40 451次阅读
    【6月28日|直播】遇见KeysightCare——贵重仪器安全<b class='flag-5'>避</b><b class='flag-5'>坑</b><b class='flag-5'>指南</b>

    芯片测试大讲堂——半导体参数测试指南

    芯片测试大讲堂系列 又和大家见面了 本期我们来聊聊 半导体参数测试 内容涉及半导体参数测试原理, 参数测试面临的挑战与实测
    的头像 发表于 09-13 07:45 3352次阅读
    芯片<b class='flag-5'>测试</b>大讲堂——半导体参数<b class='flag-5'>测试</b>与<b class='flag-5'>避</b><b class='flag-5'>坑</b><b class='flag-5'>指南</b>

    FreeRTOS中断测试实验

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

    指南】电容耐压降额裕量不合理导致电容频繁被击穿

    指南】电容耐压降额裕量不合理导致电容频繁被击穿
    的头像 发表于 11-23 09:04 1727次阅读
    【<b class='flag-5'>避</b><b class='flag-5'>坑</b><b class='flag-5'>指南</b>】电容耐压降额裕量不合理导致电容频繁被击穿