2.1中断理论
发表于|更新于|ESP32-IDF开发笔记
![[Pasted image 20250519111748.png]]
![[Pasted image 20250519111949.png]]
![[Pasted image 20250519112416.png]]
一般不用全局中断
![[Pasted image 20250519112632.png]]
二选一,一般下面方式。
![[Pasted image 20250519112809.png]]
记得安装中断服务
![[Pasted image 20250519113952.png]]
![[Pasted image 20250519114031.png]]
注意:
![[Pasted image 20250519114617.png]]
![[Pasted image 20250519115303.png]]
![[Pasted image 20250519115319.png]]
文章作者: youran
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 youran'blog!
相关推荐

2025-05-21
2.2按键中断点灯
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162#include <stdio.h>#include "driver/gpio.h" // GPIO 控制头文件#include "freertos/FreeRTOS.h" // FreeRTOS 相关头文件(虽然本代码没用到任务)#include "esp_log.h" // 用于日志打印(此代码中未使用)/** * @brief GPIO 中断服务函数,当 GPIO 口电平发生变化时触发 * @param args 传入的参数,是中断来源的 GPIO 编号(通过强转传入) */static void gpio_isr_handle(void *args){ int io_num = (int)args; ...

2025-05-20
2.队列操作
esp32里面跑的是freertos,如果需要传递数据需要使用内部的缓存管理. 任务间同步RTOS中的同步,是指不同任务之间或者任务与外部事件之间的协同工作方式,确保多个并发执行的任务按照预期的顺序或时机执行。它设计到线程或任务间的通信和协调机制,目的是为了避免数据竞争、解决竞态条件,并确保系统的正确行为。 互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排他性。 ![[Pasted image 20250518093926.png]] 1234567891011121314151617181920212223242526272829QueueHandle_t xQueueCreate(//创建一个队列,成功返回队列句柄 UBaseType_t uxQueueLength,//队列容量 UBaseType_t uxltemSize //每个队列项所占内存的大小(单位是字节));BaseType_t xQueueSend(//向队列头部发送一个消息 QueueHandle_t xQueue,//队列句柄 const void *...

2025-05-20
3.信号量
信号量![[Pasted image 20250518115216.png]] 123456789101112131415161718192021//创建二值信号量,成功则返回信号量句柄(二值信号量最大只有1个)SemaphoreHandle_t xSemaphoreCreateBinary(void);//创建计数信号量,成功则返回信号量句柄SemaphoreHandle_t xSemaphoreCreateCounting( UBseType_t uxMaxCount,//最大信号量数 UBseType_t uxInitialCount//初始信号量数);//获取一个信号量,如果获得信号量,则返回pdTURExSemaphoreTake( SemaphoreHandle_t xSemaphore,//信号量句柄 TickType_t xTicksTowait//等待时间);//释放一个信号量xSemaphoreGive(SemaphoreHandle_t xSemaphore);//信号量句柄//删除信号量xSemaphoreDelete(SemaphoreHandle_t...

2025-05-20
1.创建任务
任务可以存在于以下状态:运行:当任务实际执行时,它被称为处于运行状态。任务当前正在使用处理机。如果运行RTOS的处理器只有一个内核,那么在任何给定时间内都只能有一个任务处于运行状态。 准备就绪:准备就绪任务指那些能够执行(它们不处于阻塞或挂起状态),但目前没有执行的任务,因为同等或更高优先级的不同任务已经处于运行状态。 阻塞:如果任务当前正在等待时间或外部时间,则该任务被认为处于阻塞状态。例如,如果一个任务调用vTaskDelay(),它将被阻塞(被置于阻塞状态),直到延迟结束一个时间事件。任务也可以通过阻塞来等待队列、信号量、事件组、通知或信号量事件。处于阻塞状态的任务通常有一个“超时”期,超时后任务被超时,并被解除阻塞,即使该任务所等待的事件没有发生。 “阻塞”状态下的任务不使用任何处理时间,不能 被选择进入运行状态。 挂起:与“阻塞”状态下的任务一样,“挂起”状态下的任务不能 被选择进入运行状态,但处于挂起状态的任务 没有超时。相反,任务只有在分别通过vTaskSuspend() 和 xTaskResume()...

2025-05-21
5.对比
机制 用途 特点 适用场景 队列(Queue) 传递数据 支持多个数据项排队 任务间传递结构体/数值等数据 信号量(Semaphore) 同步 / 互斥 不传递数据,只传“信号” 同步事件、任务间或中断间的配合 互斥锁(Mutex) 资源互斥保护 特殊的二值信号量 + 优先级继承 多任务访问共享资源(如 I²C、串口) 事件组(Event Group) 多位同步控制 可同时表示多个状态位 控制多个条件满足才执行,如联网、就绪等 任务通知(Task Notification) 点对点通知 + 可传值 轻量,效率高,限单任务 一对一传递信号或数据 🧩 各模块详细对比1. ✅ 队列(Queue) 可以传递数据(整数、结构体等) 先进先出(FIFO)机制 可以阻塞等待队列满或空 支持任务与任务 / 中断与任务之间通信 🔧 示例用途: xQueueSend(queue, &data, portMAX_DELAY); // 发送数据 xQueueReceive(queue, &data,...

2025-05-20
4.事件组和直达任务通知
事件组事件位:用于指示事件是否发生,事件位通常称为事件标志;事件组:就是一组事件位。事件组中的事件位通过位编号来引用; ![[Pasted image 20250518153023.png]] 12345678910111213141516171819202122232425//创建一个事件组,返回事件组句柄,失败返回NULLEventGroupHandle_t xEventGroupCreate(void);//等待事件组中某个标志位,用返回值以确定哪些位已完成设置EventBits_t xEventGroupWaitBits( const EventGroupHandle_t xEventGroup,//事件组句柄 const EventBits_t uxBitsToWaitFor,//哪些位需要等待 const BaseType_t xClearOnExit,//是否自动清除标志位 const BaseType_t xWaitForAllBits,//是否等待的标志位都成功了才返回 TickType_t...
评论
公告
写代码,也写生活;探索技术,也记录灵感。