#每日话题# #技术资源# #有奖活动# # FreeRTOS操作系统学习
# 前言
中断是微控制器一个很常见的特性,中断由硬件产生,当中断产生以后 CPU 就会中断当前
的流程转而去处理中断服务,Cortex-M 内核的 MCU 提供了一个用于中断管理的嵌套向量中断
控制器(NVIC)。 Cotex-M3 的 NVIC 最多支持 240 个 IRQ(中断请求)、1 个不可屏蔽中断(NMI)、1 个 Systick(滴
答定时器)定时器中断和多个系统异常。
# 一、中断管理
临界区:
临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如有的外设
的初始化需要严格的时序,初始化过程中不能被打断。FreeRTOS 在进入临界段代码的时候需要
关闭中断,当处理完临界段代码以后再打开中断。FreeRTOS 系统本身就有很多的临界段代码,
这些代码都加了临界段代码保护,我们在写自己的用户程序的时候有些地方也需要添加临界段
代码保护。
FreeRTOS 与 临 界 段 代 码 保 护 有 关 的 函 数 有 4 个 : taskENTER_CRITICAL() 、taskEXIT_CRITICAL() 、 taskENTER_CRITICAL_FROM_ISR() 和
taskEXIT_CRITICAL_FROM_ISR(),这四个函数其实是宏定义,在 task.h 文件中有定义。这四个函数的区别是前两个是任务级的临界段代码保护,后两个是中断级的临界段代码保护。
```c
void taskcritical_test(void)
{
while(1)
{
taskENTER_CRITICAL(); (1)//进入临界区
total_num+=0.01f;
printf("total_num 的值为: %.4f\r\n",total_num);
taskEXIT_CRITICAL(); (2)//退出临界区
vTaskDelay(1000);
} }
```
(1)、进入临界区。
(2)、退出临界区。
(1)和(2)中间的代码就是临界区代码,注意临界区代码一定要精简!因为进入临界区会关闭中断,这样会导致优先级低于 configMAX_SYSCALL_INTERRUPT_PRIORITY 的中断得不到及
时的响应!
只有所有的临界段代码都退出以后才会使能中断!
最低中断优先级15、最高中断优先级5
0-4不归FreeRTOS管理,5-15FreeRTOS可管理
# 二、FreeRTOS中断测试实验
本实验设计了两个任务 start_task()和 interrupt_task(), 这两个任务的任务功能如下:
start_task():创建另外一个任务。interrupt_task() : 中 断 测 试 任 务 , 任 务 中 会 调 用 FreeRTOS 的 中 断 函 数portDISABLE_INTERRUPTS()来将中断关闭一段时间。
## 1.代码实战
```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 |