IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【FreeRTOS-中断实验】 -> 正文阅读

[嵌入式]【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);
    }
}      

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-02-14 21:20:17  更:2022-02-14 21:21:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:30:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码