![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ESP32 FreeRTOS
文章平均质量分 95
Mars.CN
世界上本来有很多路,走的人多了,便没有了路!
展开
-
S1-12 中断
如果在当前中断服务函数执行的过程中,又触发了一个新的中断请求,则会根据新中断的优先级来选择是否暂停当前中断服务函数,并转而执行新的中断服务函数。例如,如果需要在中断服务函数中唤醒一个阻塞在等待信号量的任务,可以将 xHigherPriorityTaskWoken 参数设置为 pdTRUE,并在中断服务函数结束时调用 portYIELD_FROM_ISR() 函数来切换任务上下文,这里我们不做任何处理,传入一个 NULL 即可。因为中断源比中断多,所以有些中断是与多个中断源共享的。原创 2024-01-16 09:43:18 · 1061 阅读 · 0 评论 -
S1-11 定时器
定时器又分为软件定时器和硬件定时器,硬件定时器在芯片中数量是有限的,在 ESP32-S3 中也仅有两个硬件定时器(其中有一个还被用作了FreeRTOS的Tick精确计时和任务调度),而软件定时器在一个系统中就可以有无数个,软件定时器和硬件定时器都是定时器的实现方式,它们的区别主要体现在实现方式和精度上。删除定时器,在删除之前,还进行了定时器是否活跃中的判断,如果活跃中,则先停止再删除,这一步对于删除来说是多余的,这里我们仅用于演示。第三个按钮演示了定时器的启动和停止,值得一提的是,启动定时器必须使用。原创 2024-01-16 09:40:04 · 847 阅读 · 0 评论 -
S1-10 任务管理及内存优化
A : 正在运行的任务,触发调度器工作的途径有:(但凡有可能引出高优先级任务或中断的操作都会触发调度器检查)创建新任务(显然,新建任务可能比自身的优先级高,因此可能触发调度器)挂起自己、删除自己(往往代表我执行完了)、阻塞延时自己、普通延时自己解阻塞高优先级任务、或触发中断(中断中解阻塞一些高优先级任务)高优先级任务自动就绪(主要指高优先级任务延时结束,定时器任务,定时器任务优先级较 高的情况下,若定时溢出,将抢占CPU)原创 2024-01-15 09:17:44 · 1022 阅读 · 0 评论 -
S1-09 直达任务通知
在消息队列的章节中,我们可以任意定义消息队列的大小,这是一种解决方案。在其他操作系统中(如μC/OS和RT-Thread)都有一种叫做“邮箱”的传输方式,基础类型的邮箱和消息队列的用法是一样的,但邮箱的高级用法中是可以携带一个不定长度的附件数据的(在消息队列章节中没有讲到),通常的做法是邮箱中传输两个4字节数据,第一个数据表示附件的大小(或类型),第二个数据表示附件的指针,如果在消息队列中使用邮箱,可以利用结构体模拟一个类似的附件,但直接任务通知中数据区的大小只有4字节,也就是说数据区域只能放一个指针。原创 2024-01-15 09:14:29 · 861 阅读 · 0 评论 -
S1-08 流和消息缓冲区
流缓冲区一般用在不同设备或者不同进程间的通讯,为了提高数据处理效率和性能,设置的一定大小的缓冲区,流缓冲区可以用来存储程序中需要处理的数据、对象、报文等信息,使程序对可以对这些信息进行预处理、排序、过滤、拆分等操作,从而提供程序的效率和处理速度。流缓冲区主要应用于数据输入输出(I/O)操作中,例如读取和写入文件、网络通信等场景。在数据读取方面,缓冲区可以让程序一次读取较大量的数据,而不是多次读取小量数据,在提高读取效率的同时减少了系统调用的次数和内存访问的延迟。在数据写入方面,通过缓冲区将一部分或全部数据原创 2024-01-14 12:44:29 · 900 阅读 · 0 评论 -
S1-07 事件组
回到我们厨子和吃货的世界中,本次出场的只有厨子,另外还有一些服务员,服务员负责给厨子配菜,这时候厨子做一个汉堡需要等待三样东西,分别是面包、肉饼、蔬菜,做蔬菜的服务员等肉饼做好后再做蔬菜,做肉饼的则要等待做面包的,而做面包的需要等待厨子的号令,一切是那么的竟然有序。: 指定事件组中要测试的一个或多个事件位的按位值,可以用 | 运算指定多个,例如,等待第0位则为1,等待第二位则为2,等待第三位则为4,等待第四位则为8,如果等待第1位和第三位,则为1|3=5。原创 2024-01-14 09:50:45 · 891 阅读 · 0 评论 -
S1-06 消息队列
在实际项目开发中,消息队列用的最多的地方就是与外部的通讯,因为在代码中,不同的线程都可能用到同一个外设,之前我们的做法是通过互斥信号量的方式对资源进行保护,我们也可以通过消息队列等方式实现,把所有操作设备的行为封装在一个任务中,其他如果有需要操作设备的,都以消息的方式发送到消息队列中,设备任务依次对消息队列中消息进行处理。lcd_task 现成模拟了显示屏,每间隔100ms就向消息队列请求,看是否有新的消息到达,如果在1秒钟之内获得不了新的消息,则取消等待,如果发现有新的消息后,将消息取出并打印在屏幕上。原创 2024-01-13 08:54:18 · 871 阅读 · 0 评论 -
S1-05二进制信号量和计数器信号量
但问题就在于,原来我们在LED任务中,我妈是通过 xSemaphoreTake 实现等待的,而此时CPU已经让出给其他线程,我们的CPU利用率是很低的,但在上述例程中,采用了轮训的方式,每间隔一段时间就扫描一次按键是否被按下了,这种效率是极低的,在多任务情况下,轮训线程占用了CPU其他程序就得让路,这就造成了不必要的资源浪费,所以我们在开发过程中尽量使用二值信号量来代替线程间的通讯,减少资源消耗。前面讲过,二进制信号量用于在两个任务间传递数据,也就是我们可以在一个任务中释放信号量,另一个任务中获取信号量。原创 2024-01-13 08:51:58 · 963 阅读 · 0 评论 -
S1-04 OLED和MPU6050
u8g2是一个基于monochrome lcd的嵌入式图形库。它可以通过多种接口与mcu交互,支持i2c、spi和并行模式等多种接口,以及若干种字体和绘图函数,可用于创建各种ui界面、菜单、文本等。其具有轻量级,灵活性高,支持多种格式的字体及占用空间小等优点,因此在很多嵌入式产品中得到了广泛的应用。原创 2024-01-12 09:26:50 · 1142 阅读 · 1 评论 -
S1-03 线程间通讯
函数,函数传入两个变量,第一个是互斥信号量的句柄,也就是我们之前创建的那个key,第二个是等待的超时时间,例程中设置的是1000个Tick(注意,这里不是毫秒,而是系统Tick,如果需要使用毫秒,可以用pdMS_TO_TICKS进行运算),如果在固定时间内获得了信号量,则返回pdPASS,如果返回的是pdFalse或其他的值,则表示获取失败。我们假设有一个场景,一个冰箱里放了 100 个汉堡,冰箱旁有两个人,一个是吃货,不停的吃,另一个是厨子,隔一段时间公布一下冰箱里剩余的汉堡数量和被吃货吃掉的汉堡数量。原创 2024-01-11 09:31:30 · 876 阅读 · 0 评论 -
S1-02 FreeRTOS线程控制
这个函数用于删除当前任务,如果缺失了这行代码,程序会报错,因为任务一旦出了入口函数,调度器将不知道向哪运行,FreeRTOS任务,只有运行中、就绪、挂起、阻塞、等待删除五种状态,我们之前的任务都是放在一个while大循环中运行,永远不会退出,但本次的例程中少了while循环,也就意味着任务会退出,当任务退出后,就不属于这五种状态的任何一种,CPU直接懵圈,索性就挂了……:指任务处于运行中,每个CPU同时只会有一个任务处于运行中的状态,可通过delay函数进入阻塞,或通过暂停等进入挂起。原创 2024-01-11 09:30:43 · 981 阅读 · 0 评论 -
S1-01 FreeRTOS
FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。原创 2024-01-11 09:29:23 · 1000 阅读 · 0 评论