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

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

3天内不再提示

FreeRTOS中断测试实验

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-09-28 11:42 次阅读

FreeRTOS 中断测试实验

设定:FreeRTOS 中优先级低于 configMAX_SYSCALL_INTERRUPT_PRIORITY的中断会被屏蔽掉,高于的就不会,那么我们就写个简单的例程测试一下。

使用两个定时器,一个优先级为 4,一个优先级为 5,两个定时器每隔 1s 通过串口输出一串字符串。然后在某个任务中关闭中断一段时间,查看两个定时器的输出情况。

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "FreeRTOS.h"
#include "task.h"

#define START_TASK_PRIO   1
#define START_STK_SIZE    256  
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);

#define INTERRUPT_TASK_PRIO  2
#define INTERRUPT_STK_SIZE   256  
TaskHandle_t INTERRUPTTask_Handler;
void interrupt_task(void *p_arg);

int main(void)
{
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); 
 delay_init();         
 uart_init(115200);     
 LED_Init();
 //起了两个定时器,不停的打印,除非中断被关闭
 TIM3_Int_Init(10000-1,7200-1);  
 TIM5_Int_Init(10000-1,7200-1);  
 
    xTaskCreate((TaskFunction_t )start_task,            
                (const char*    )"start_task",        
                (uint16_t       )START_STK_SIZE,       
                (void*          )NULL,                 
                (UBaseType_t    )START_TASK_PRIO,      
                (TaskHandle_t*  )&StartTask_Handler);              
    vTaskStartScheduler();    
}

void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();         
 
    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); 
 vTaskDelete(StartTask_Handler); 
    taskEXIT_CRITICAL(); 
}

void interrupt_task(void *pvParameters)
{
 static u32 total_num=0;
    while(1)
    {
   printf("秒数",total_num);
   total_num+=1;
   if(total_num==5) 
   {
    printf("关闭中断.............rn");
    portDISABLE_INTERRUPTS();   
    delay_xms(5000);      
    printf("打开中断.............rn"); 
    portENABLE_INTERRUPTS();
   }
     LED0=~LED0;
     vTaskDelay(1000);
    }
}

timer.c

#include "timer.h"
#include "led.h"
#include "led.h"
#include "usart.h"

void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 NVIC_InitTypeDef NVIC_InitStructure;

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 
 
 TIM_TimeBaseStructure.TIM_Period = arr; 
 TIM_TimeBaseStructure.TIM_Prescaler =psc; 
 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 
 
 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 

 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;  
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
 NVIC_Init(&NVIC_InitStructure);  

 TIM_Cmd(TIM3, ENABLE);      
}

void TIM5_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 NVIC_InitTypeDef NVIC_InitStructure;

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); 
 
 TIM_TimeBaseStructure.TIM_Period = arr;      
 TIM_TimeBaseStructure.TIM_Prescaler =psc;      
 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
 TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);    
 
 TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE );      

 NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;     
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;   
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
 NVIC_Init(&NVIC_InitStructure);         

 TIM_Cmd(TIM5, ENABLE);            
}

void TIM3_IRQHandler(void)
{
 if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) 
 {
  printf("TIM3输出.......rn");
 }
 TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  
}

void TIM5_IRQHandler(void)
{
 if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET) 
 {
  printf("TIM5输出.......rn");
 }
 TIM_ClearITPendingBit(TIM5,TIM_IT_Update);  
}

另外还有一些延时函数和串口初始化,这个都是基础的文件,可以直接copy的,就不放出来了。

编译并下载代码到开发板中,打开串口调试助手查看数据输出:

图片

一开始没有关闭中断,所以 TIM3 和 TIM5 都正常运行,红框所示部分。当任务 interrupt_task()运行了 5 次以后就关闭了中断,此时由于 TIM5 的中断优先级为 5,等于configMAX_SYSCALL_INTERRUPT_PRIORITY,因此 TIM5 被关闭。但是,TIM3 的中断优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,不会被关闭,所以 TIM3 正常运行,绿框所示部分。中断关闭 5S 以后就会调用函数 portENABLE_INTERRUPTS()重新打开中断,重新打开中断以后 TIM5 恢复运行,蓝框所示部分。

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

    关注

    8

    文章

    4458

    浏览量

    125132
  • 嵌入式
    +关注

    关注

    4984

    文章

    18300

    浏览量

    288648
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41030
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112060
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61359
收藏 人收藏

    评论

    相关推荐

    FreeRTOS中断测试避坑指南

    任何调用中断安全FreeRTOS API函数的中断服务例程都可以使用的最高中断优先级。不要从任何优先级高于此的中断调用
    的头像 发表于 12-21 09:04 460次阅读
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>中断</b><b class='flag-5'>测试</b>避坑指南

    FreeRTOS中断实验中,在任务中关闭中断,即使没有开启中断中断仍在执行的原因?

    =~LED0;vTaskDelay(1000); }}//我把最后打开中断的函数屏蔽掉了,但中断仍在继续。此实验完整代码就是发烧友FreeRTOS
    发表于 06-18 05:16

    FreeRTOS中断实验没有反应的原因?

    按照 《STM32F103 FreeRTOS开发手册V1.1》 一步一步做的实验,在初始化的时候把time3_init()和time5_init()放在uart_init()前面,下载到板子里就没
    发表于 07-08 05:02

    如何对FreeRTOS中断进行测试

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

    求大佬分享一个FREERTOS中断组屏蔽实验

    求大佬分享一个FREERTOS中断组屏蔽实验
    发表于 02-23 07:21

    基于STM32应用的FreeRTOS中断设置

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

    STM32中断FreeRTOS中断优先级配置

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

    实验三:中断实验

    实验三:中断实验强调:本文章为新手提供学习参考实验三:中断实验使用的开发板原理图及本次使用的模块
    发表于 11-23 17:51 11次下载
    <b class='flag-5'>实验</b>三:<b class='flag-5'>中断</b><b class='flag-5'>实验</b>

    实验四:中断实验

    实验三:中断实验强调:本文章为新手提供学习参考实验四:中断实验使用的开发板原理图及本次使用的模块
    发表于 11-23 18:06 7次下载
    <b class='flag-5'>实验</b>四:<b class='flag-5'>中断</b><b class='flag-5'>实验</b>

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

    FreeRTOS学习笔记--临界段代码处关闭中断一、临界段代码二、Cortex-M4中断管理三、中断屏蔽实验四、结语一、临界段代码大家在学习
    发表于 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>组屏蔽<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 358次阅读
    <b class='flag-5'>FreeRTOS</b>开关<b class='flag-5'>中断</b>定义