【FreeRTOS-中断实验】

FreeRTOS-中断实验

本次实验简单验证优先级问题
用定时器3和定时器4优先级分别配置4和5 优先级低于5的时候FreeRTOS中断不能屏蔽而大于等于5的优先级会屏蔽

在这里插入图片描述

FreeRTOS开关中断函数为portENABLE_INTERRUPTS ()和portDISABLE_INTERRUPTS(),这两个函数其实是宏定义,在portmacro.h中有定义,

#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() //关闭中断
#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0)  //开启中断

time.h

#ifndef _TIME_H_
#define _TIME_H_

#include "stm32f10x.h"

void Init_TIM3(void);
void Init_TIM4(void);

#endif

timc.c

#include "time.h"
#include "usart.h"


void Init_TIM3(void)
{
	TIM_TimeBaseInitTypeDef TIME3_InitStructure;
	NVIC_InitTypeDef        TIM3_NVICStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	
	TIME3_InitStructure.TIM_ClockDivision  = TIM_CKD_DIV1;
	TIME3_InitStructure.TIM_CounterMode    = TIM_CounterMode_Up;
	TIME3_InitStructure.TIM_Period         = 10000 - 1;
	TIME3_InitStructure.TIM_Prescaler      = 3600 - 1;
	TIM_TimeBaseInit(TIM3,&TIME3_InitStructure);
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
	
	TIM3_NVICStructure.NVIC_IRQChannel     =  TIM3_IRQn;
	TIM3_NVICStructure.NVIC_IRQChannelCmd  =	ENABLE;
	TIM3_NVICStructure.NVIC_IRQChannelPreemptionPriority =	4;
	TIM3_NVICStructure.NVIC_IRQChannelSubPriority        = 	0;
	NVIC_Init(&TIM3_NVICStructure);
	TIM_Cmd(TIM3,ENABLE);
	
}



void Init_TIM4(void)
{
	TIM_TimeBaseInitTypeDef TIME4_InitStructure;
	NVIC_InitTypeDef        TIM4_NVICStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
	
	TIME4_InitStructure.TIM_ClockDivision  = TIM_CKD_DIV1;
	TIME4_InitStructure.TIM_CounterMode    = TIM_CounterMode_Up;
	TIME4_InitStructure.TIM_Period         = 10000 - 1;
	TIME4_InitStructure.TIM_Prescaler      = 3600 - 1;
	TIM_TimeBaseInit(TIM4,&TIME4_InitStructure);
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
	
	TIM4_NVICStructure.NVIC_IRQChannel     =  TIM4_IRQn;
	TIM4_NVICStructure.NVIC_IRQChannelCmd  =	ENABLE;
	TIM4_NVICStructure.NVIC_IRQChannelPreemptionPriority =	5;
	TIM4_NVICStructure.NVIC_IRQChannelSubPriority        = 	0;
	NVIC_Init(&TIM4_NVICStructure);
	TIM_Cmd(TIM4,ENABLE);
}



void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
	{
		printf("time3 interrupt\r\n");
		
	}
	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
	
}


void TIM4_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM4,TIM_IT_Update) != RESET)
	{
		printf("time4 interrupt\r\n");
		
	}
	TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
	
}

main.c

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


/*--------------------------------------------------------------------
*FreeRTOS中断实验
*Date:2022-2-13
*Author:小殷同学
*--------------------------------------------------------------------*/


//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);

//任务优先级
#define INTERRUPT_TASK_PRIO		2
//任务堆栈大小	
#define INTERRUPT_STK_SIZE 		50  
//任务句柄
TaskHandle_t INTERRUPTTask_Handler;
//任务函数
void interrupt_task(void *pvParameters);



int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4	 
	delay_init();	    				//延时函数初始化	  
	uart_init(115200);					//初始化串口
	LED_Init();		  					//初始化LED
	Init_TIM3();
	Init_TIM4();
	 
	//创建开始任务
    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();           //进入临界区
    //创建LED0任务
    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();            //退出临界区
}

//LED0任务函数 
void interrupt_task(void *pvParameters)
{
  char task_num = 0;  
	while(1)
    {
        task_num++;
			//低于5的中断优先级不会被屏蔽 TIM3 中断优先级配置4 正常运行
			if(task_num == 5)
			{
				printf(" 关闭中断 \r\n");
				portDISABLE_INTERRUPTS();
				delay_xms(5000);
				printf(" 开启中断 \r\n");
				portENABLE_INTERRUPTS();				
			}
			LED0 = ~LED0;
			vTaskDelay(1000);
    }
}      

在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小殷学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值