0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FreeRTOS中斷測(cè)試實(shí)驗(yàn)

麥辣雞腿堡 ? 來(lái)源:嵌入式Linux系統(tǒng)開(kāi)發(fā) ? 作者:嵌入式Linux系統(tǒng)開(kāi) ? 2023-09-28 11:42 ? 次閱讀

FreeRTOS 中斷測(cè)試實(shí)驗(yàn)

設(shè)定:FreeRTOS 中優(yōu)先級(jí)低于 configMAX_SYSCALL_INTERRUPT_PRIORITY的中斷會(huì)被屏蔽掉,高于的就不會(huì),那么我們就寫(xiě)個(gè)簡(jiǎn)單的例程測(cè)試一下。

使用兩個(gè)定時(shí)器,一個(gè)優(yōu)先級(jí)為 4,一個(gè)優(yōu)先級(jí)為 5,兩個(gè)定時(shí)器每隔 1s 通過(guò)串口輸出一串字符串。然后在某個(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("打開(kāi)中斷.............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的,就不放出來(lái)了。

編譯并下載代碼到開(kāi)發(fā)板中,打開(kāi)串口調(diào)試助手查看數(shù)據(jù)輸出:

圖片

一開(kāi)始沒(méi)有關(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()重新打開(kāi)中斷,重新打開(kāi)中斷以后 TIM5 恢復(fù)運(yùn)行,藍(lán)框所示部分。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 測(cè)試
    +關(guān)注

    關(guān)注

    8

    文章

    4927

    瀏覽量

    125955
  • 嵌入式
    +關(guān)注

    關(guān)注

    5046

    文章

    18821

    瀏覽量

    298598
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    889

    瀏覽量

    41220
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3218

    瀏覽量

    113688
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61729
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FreeRTOS中斷測(cè)試避坑指南

    任何調(diào)用中斷安全FreeRTOS API函數(shù)的中斷服務(wù)例程都可以使用的最高中斷優(yōu)先級(jí)。不要從任何優(yōu)先級(jí)高于此的中斷調(diào)用
    的頭像 發(fā)表于 12-21 09:04 ?864次閱讀
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>中斷</b><b class='flag-5'>測(cè)試</b>避坑指南

    FreeRTOS中斷實(shí)驗(yàn)中,在任務(wù)中關(guān)閉中斷,即使沒(méi)有開(kāi)啟中斷,中斷仍在執(zhí)行的原因?

    =~LED0;vTaskDelay(1000); }}//我把最后打開(kāi)中斷的函數(shù)屏蔽掉了,但中斷仍在繼續(xù)。此實(shí)驗(yàn)完整代碼就是發(fā)燒友FreeRTOS
    發(fā)表于 06-18 05:16

    FreeRTOS中斷實(shí)驗(yàn)沒(méi)有反應(yīng)的原因?

    按照 《STM32F103 FreeRTOS開(kāi)發(fā)手冊(cè)V1.1》 一步一步做的實(shí)驗(yàn),在初始化的時(shí)候把time3_init()和time5_init()放在uart_init()前面,下載到板子里就沒(méi)
    發(fā)表于 07-08 05:02

    如何對(duì)FreeRTOS中斷進(jìn)行測(cè)試

    FreeRTOS與臨界段代碼保護(hù)有關(guān)的函數(shù)有哪幾個(gè)?如何對(duì)FreeRTOS中斷進(jìn)行測(cè)試呢?
    發(fā)表于 11-26 08:06

    求大佬分享一個(gè)FREERTOS中斷組屏蔽實(shí)驗(yàn)

    求大佬分享一個(gè)FREERTOS中斷組屏蔽實(shí)驗(yàn)
    發(fā)表于 02-23 07:21

    基于STM32應(yīng)用的FreeRTOS中斷設(shè)置

    一、FreeRTOS中斷設(shè)置介紹 FreeRTOSConfig.h中定義了兩個(gè)宏,分別是: configKERNEL_INTERRUPT_PRIORITY
    發(fā)表于 11-29 19:46 ?1871次閱讀
     基于STM32應(yīng)用的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>中斷</b>設(shè)置

    STM32中斷FreeRTOS中斷優(yōu)先級(jí)配置

    STM32中斷,及FreeRTOS中斷優(yōu)先級(jí)配置
    的頭像 發(fā)表于 03-04 11:45 ?8611次閱讀
    STM32<b class='flag-5'>中斷</b>及<b class='flag-5'>FreeRTOS</b><b class='flag-5'>中斷</b>優(yōu)先級(jí)配置

    實(shí)驗(yàn)三:中斷實(shí)驗(yàn)

    實(shí)驗(yàn)三:中斷實(shí)驗(yàn)強(qiáng)調(diào):本文章為新手提供學(xué)習(xí)參考實(shí)驗(yàn)三:中斷實(shí)驗(yàn)使用的開(kāi)發(fā)板原理圖及本次使用的模塊
    發(fā)表于 11-23 17:51 ?11次下載
    <b class='flag-5'>實(shí)驗(yàn)</b>三:<b class='flag-5'>中斷</b><b class='flag-5'>實(shí)驗(yàn)</b>

    FreeRTOS學(xué)習(xí)筆記--臨界段代碼處關(guān)閉中斷

    FreeRTOS學(xué)習(xí)筆記--臨界段代碼處關(guān)閉中斷一、臨界段代碼二、Cortex-M4中斷管理三、中斷屏蔽實(shí)驗(yàn)四、結(jié)語(yǔ)一、臨界段代碼大家在學(xué)習(xí)
    發(fā)表于 12-04 14:51 ?10次下載
    <b class='flag-5'>FreeRTOS</b>學(xué)習(xí)筆記--臨界段代碼處關(guān)閉<b class='flag-5'>中斷</b>

    stm32cubemx 配置FreeRTOS相關(guān)基礎(chǔ)基礎(chǔ)知識(shí)及串口接收中斷實(shí)驗(yàn)

    實(shí)驗(yàn)首先大家自身要有stm32cubemx基礎(chǔ)配置,比如GPIO、中斷、串口、SPI等,FreeRTOS有相關(guān)的調(diào)用函數(shù)基礎(chǔ)及調(diào)度任務(wù)的概念都需要提前理解。單獨(dú)stm32cubemx或
    發(fā)表于 12-14 18:44 ?21次下載
    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>

    FREERTOS中斷組屏蔽實(shí)驗(yàn)

    FREERTOS中斷組屏蔽實(shí)驗(yàn)Cortex M中斷管理(該段取自正點(diǎn)原子FREETRTOS開(kāi)發(fā)手冊(cè),我覺(jué)得比較詳細(xì)了)當(dāng)多個(gè)中斷來(lái)臨的時(shí)候處
    發(fā)表于 12-31 19:16 ?6次下載
    <b class='flag-5'>FREERTOS</b><b class='flag-5'>中斷</b>組屏蔽<b class='flag-5'>實(shí)驗(yàn)</b>

    STM32之FreeRTOS:(一) 中斷配置和臨界段的使用

    STM32之FreeRTOS:(一) 中斷配置和臨界段的使用文章目錄STM32之FreeRTOS:(一) 中斷配置和臨界段的使用前言 一、stm32的NVIC 分組配置二、
    發(fā)表于 01-14 15:43 ?3次下載
    STM32之<b class='flag-5'>FreeRTOS</b>:(一) <b class='flag-5'>中斷</b>配置和臨界段的使用

    Cortex-M中斷FreeRTOS中斷優(yōu)先級(jí)配置原理

    下面就來(lái)說(shuō)說(shuō)關(guān)于Cortex-M的中斷,及FreeRTOS中斷優(yōu)先級(jí)配置原理。
    發(fā)表于 02-08 15:30 ?3次下載
    Cortex-M<b class='flag-5'>中斷</b>及<b class='flag-5'>FreeRTOS</b><b class='flag-5'>中斷</b>優(yōu)先級(jí)配置原理

    FreeRTOS開(kāi)關(guān)中斷定義

    FreeRTOS 開(kāi)關(guān)中斷 FreeRTOS 開(kāi)關(guān)中斷函數(shù)為 portENABLE_INTERRUPTS ()和 portDISABLE_INTERRUPTS(),這兩個(gè)函數(shù)其實(shí)是宏定
    的頭像 發(fā)表于 09-28 11:37 ?552次閱讀
    <b class='flag-5'>FreeRTOS</b>開(kāi)關(guān)<b class='flag-5'>中斷</b>定義

    freertos中斷優(yōu)先級(jí)在哪設(shè)置

    FreeRTOS是一個(gè)流行的實(shí)時(shí)操作系統(tǒng),它廣泛應(yīng)用于嵌入式系統(tǒng)開(kāi)發(fā)。在FreeRTOS中,中斷優(yōu)先級(jí)是一個(gè)重要的概念,因?yàn)樗鼪Q定了中斷處理的順序和響應(yīng)時(shí)間。 1. 理解
    的頭像 發(fā)表于 09-02 14:17 ?234次閱讀