这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【转载】freertos——中断管理与测试--from三叶

共2条 1/1 1 跳转至

【转载】freertos——中断管理与测试--from三叶

工程师
2024-01-20 23:31:29     打赏

中断是微控制器一个很常见的特性,中断由硬件产生,当中断产生以后 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.代码实战





来源: 整理文章为传播相关技术,网络版权归原作者所有,如有侵权,请联系删除。



高工
2024-01-21 21:35:19     打赏
2楼

谢谢


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]