FreeRTOS 中断管理介绍和实操

简介: FreeRTOS 中断管理介绍和实操

中断定义

中断是指在程序执行的过程中,突然发生了某种事件,需要立即停止当前正在执行的程序,并转而处理这个事件,处理完后再回到原来的程序执行点继续执行的过程。


中断可以是硬件中断(由硬件设备触发)或软件中断(由程序执行中断指令触发)。


中断可以提高计算机的响应速度和效率,使得计算机可以同时处理多个任务。


中断优先级

任何中断的优先级都大于任务!


在我们的操作系统,中断同样是具有优先级的,并且我们也可以设置它的优先级,但是他的优先 级并不是从 0~15 ,默认情况下它是从 5~15 ,0~4 这 5 个中断优先级不是 FreeRTOS 控制的(5是 取决于 configMAX_SYSCALL_INTERRUPT_PRIORITY)。


相关注意

1. 在中断中必需使用中断相关的函数;


2. 中断服务函数运行时间越短越好。


中断相关函数

1.队列

xQueueReceiveFromISR()

  • 在中断中从队列头部读取消息,并删除消息

xQueuePeekFromISR()

  • 在中断中从队列头部读取消息

2.信号量

xSemaphoreGiveFromISR()

  • 在中断中释放信号量

xSemaphoreTakeFromISR()

  • 在中断中获取信号量

3.事件标志组

xEventGroupClearBitsFromISR()

  • 在中断中清零事件标志位

xEventGroupSetBitsFromISR()

  • 在中断中设置事件标志位

4.任务通知

xTaskNotifyFromISR()

  • 在中断中发送任务通知

xTaskNotifyAndQueryFromISR()

  • 在中断中发送任务通知

vTaskNotifyGiveFromISR()

  • 在中断中发送任务通知

5.软件定时器

xTimerStartFromISR()

  • 在中断中开启软件定时器定时

xTimerStopFromISR()

  • 在中断中停止软件定时器定时

xTimerResetFromISR()

  • 在中断中复位软件定时器定时

xTimerChangePeriodFromISR()

  • 在中断中更改定时超时时间


中断管理实操

创建一个队列及一个任务,按下按键 KEY1 触发中断,在中断服务函数里向队列里发送数据,任 务则阻塞接收队列数据。

打开CubeMX

1.将FreeRTOS移植到STM32F103C8T6,具体看我之前写过的文章

将FreeRTOS移植到STM32F103C8T6

2.在NVIC中使能中断

3.中断代码示例:

用到的中断函数

  • xQueueSendFromISR()

stm32f1xx_it.c

#include "cmsis_os.h" // 增加CubeMX封装好的头文件
 
extern osMessageQId myQueue01Handle;
 
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    uint32_t snd = 1;
    xQueueSendFromISR(myQueue01Handle, &snd, NULL);
}

4.主程序代码示例:

freertos.c

void StartDefaultTask(void const * argument)
{
    uint32_t rev = 0;
    for(;;)
    {
        if (xQueueReceive(myQueue01Handle, &rev, portMAX_DELAY) == pdTRUE)
        printf("rev = %d\r\n", rev);
        osDelay(1);
    }
}

5.打开串口助手,查看结果

相关文章
|
API
FreeRTOS学习笔记—FreeRTOS移植
本文学习了如何移植FreeRTOS到自己的STM32工程。最后,根据正点原子提供的测试main函数,测试了移植效果。
1244 0
FreeRTOS学习笔记—FreeRTOS移植
|
存储 算法 安全
【Freertos基础入门】队列(queue)的使用
【Freertos基础入门】队列(queue)的使用
1336 0
|
8月前
|
人工智能 编解码 芯片
告别低效沟通|让技术提问不再头疼-这套高效AI提问模板来帮你
不会向ai提问,不知道怎么提问的 可以看看
20801 1
告别低效沟通|让技术提问不再头疼-这套高效AI提问模板来帮你
|
6月前
|
机器学习/深度学习 人工智能 边缘计算
基于YOLOv8的包装箱纸板破损缺陷识别项目
本项目集成了 YOLOv8纸板破损缺陷检测模型 与 PyQt5图形界面工具,支持对工厂包装纸箱表面出现的多种破损瑕疵(如撕裂、压痕、孔洞等)进行快速准确识别。检测逻辑精准,界面操作便捷,适用于工厂自动质检、流水线布控系统等实际场景。提供完整训练流程与数据,开箱即用、部署无门槛,适合AI新手和工业视觉开发者学习与二次开发。
基于YOLOv8的包装箱纸板破损缺陷识别项目
|
数据采集 Web App开发 JavaScript
Puppeteer自动化:使用JavaScript定制PDF下载
在现代Web开发中,自动化工具如Puppeteer可显著提升效率并减少重复工作。Puppeteer是一款强大的Node.js库,能够控制无头Chrome或Chromium浏览器,适用于网页快照生成、数据抓取及自动化测试等任务。本文通过示例展示了如何使用Puppeteer自动化生成定制化的PDF文件,并介绍了如何通过配置代理IP、设置user-agent和cookie等技术增强自动化过程的灵活性与稳定性。具体步骤包括安装Puppeteer、配置代理IP、设置user-agent和cookie等,最终生成符合需求的PDF文件。此技术可应用于报表生成、发票打印等多种场景。
577 6
Puppeteer自动化:使用JavaScript定制PDF下载
|
消息中间件 调度
FreeRTOS入门教程(任务状态)
FreeRTOS入门教程(任务状态)
1165 0
|
文字识别 程序员 C++
实战阿里通义灵码极速编程-截屏-OCR-OLlama篇
通过实际案例展示阿里通义灵码如何极大提高编程效率。以开发屏幕截图OCR Python程序为例,使用Win10、Anaconda3、VS Code及通义灵码插件。经过四次提问与优化,从截屏选择矩形区域到调用大模型进行OCR识别,整个过程仅耗时半小时,最终形成可运行的控制台程序。加入界面开发后,总用时2小时,显著提升开发速度和质量。
1208 5
|
API 调度 芯片
FreeRTOS 延时函数和软件定时器 详解
FreeRTOS 延时函数和软件定时器 详解
FreeRTOS 延时函数和软件定时器 详解