FreeRTOS 中斷測(cè)試實(shí)驗(yàn)
設(shè)定:FreeRTOS 中優(yōu)先級(jí)低于 configMAX_SYSCALL_INTERRUPT_PRIORITY的中斷會(huì)被屏蔽掉,高于的就不會(huì),那么我們就寫個(gè)簡(jiǎn)單的例程測(cè)試一下。
使用兩個(gè)定時(shí)器,一個(gè)優(yōu)先級(jí)為 4,一個(gè)優(yōu)先級(jí)為 5,兩個(gè)定時(shí)器每隔 1s 通過串口輸出一串字符串。然后在某個(gè)任務(wù)中關(guān)閉中斷一段時(shí)間,查看兩個(gè)定時(shí)器的輸出情況。
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();
//起了兩個(gè)定時(shí)器,不停的打印,除非中斷被關(guān)閉
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("秒數(shù)",total_num);
total_num+=1;
if(total_num==5)
{
printf("關(guān)閉中斷.............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);
}
另外還有一些延時(shí)函數(shù)和串口初始化,這個(gè)都是基礎(chǔ)的文件,可以直接copy的,就不放出來了。
編譯并下載代碼到開發(fā)板中,打開串口調(diào)試助手查看數(shù)據(jù)輸出:
一開始沒有關(guān)閉中斷,所以 TIM3 和 TIM5 都正常運(yùn)行,紅框所示部分。當(dāng)任務(wù) interrupt_task()運(yùn)行了 5 次以后就關(guān)閉了中斷,此時(shí)由于 TIM5 的中斷優(yōu)先級(jí)為 5,等于configMAX_SYSCALL_INTERRUPT_PRIORITY,因此 TIM5 被關(guān)閉。但是,TIM3 的中斷優(yōu)先級(jí)高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,不會(huì)被關(guān)閉,所以 TIM3 正常運(yùn)行,綠框所示部分。中斷關(guān)閉 5S 以后就會(huì)調(diào)用函數(shù) portENABLE_INTERRUPTS()重新打開中斷,重新打開中斷以后 TIM5 恢復(fù)運(yùn)行,藍(lán)框所示部分。
-
測(cè)試
+關(guān)注
關(guān)注
8文章
5394瀏覽量
127121 -
嵌入式
+關(guān)注
關(guān)注
5095文章
19189瀏覽量
307951 -
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41792 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3256瀏覽量
115442 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62414
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
FreeRTOS中斷測(cè)試避坑指南
![<b class='flag-5'>FreeRTOS</b><b class='flag-5'>中斷</b><b class='flag-5'>測(cè)試</b>避坑指南](https://file1.elecfans.com/web2/M00/B7/39/wKgaomWDj2uAYeFdAAAbCOFPQsQ018.jpg)
在FreeRTOS中斷實(shí)驗(yàn)中,在任務(wù)中關(guān)閉中斷,即使沒有開啟中斷,中斷仍在執(zhí)行的原因?
FreeRTOS中斷實(shí)驗(yàn)沒有反應(yīng)的原因?
如何對(duì)FreeRTOS中斷進(jìn)行測(cè)試呢
基于STM32應(yīng)用的FreeRTOS中斷設(shè)置
![基于STM32應(yīng)用的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>中斷</b>設(shè)置](https://file1.elecfans.com//web2/M00/A6/FB/wKgZomUMQZ6AVlhhAAASxLTw_Fk221.jpg)
實(shí)驗(yàn)三:中斷實(shí)驗(yàn)
![<b class='flag-5'>實(shí)驗(yàn)</b>三:<b class='flag-5'>中斷</b><b class='flag-5'>實(shí)驗(yàn)</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
FreeRTOS學(xué)習(xí)筆記--臨界段代碼處關(guān)閉中斷
![<b class='flag-5'>FreeRTOS</b>學(xué)習(xí)筆記--臨界段代碼處關(guān)閉<b class='flag-5'>中斷</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
stm32cubemx 配置FreeRTOS相關(guān)基礎(chǔ)基礎(chǔ)知識(shí)及串口接收中斷實(shí)驗(yàn)
![stm32cubemx 配置<b class='flag-5'>FreeRTOS</b>相關(guān)基礎(chǔ)基礎(chǔ)知識(shí)及串口接收<b class='flag-5'>中斷</b><b class='flag-5'>實(shí)驗(yàn)</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
FREERTOS中斷組屏蔽實(shí)驗(yàn)
![<b class='flag-5'>FREERTOS</b><b class='flag-5'>中斷</b>組屏蔽<b class='flag-5'>實(shí)驗(yàn)</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32之FreeRTOS:(一) 中斷配置和臨界段的使用
![STM32之<b class='flag-5'>FreeRTOS</b>:(一) <b class='flag-5'>中斷</b>配置和臨界段的使用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Cortex-M中斷及FreeRTOS中斷優(yōu)先級(jí)配置原理
![Cortex-M<b class='flag-5'>中斷</b>及<b class='flag-5'>FreeRTOS</b><b class='flag-5'>中斷</b>優(yōu)先級(jí)配置原理](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
FreeRTOS開關(guān)中斷定義
![<b class='flag-5'>FreeRTOS</b>開關(guān)<b class='flag-5'>中斷</b>定義](https://file1.elecfans.com/web2/M00/A8/37/wKgZomUU9FSATn1IAADkNzm7Fz4048.jpg)
評(píng)論