欢迎来到我司Viking代理产品网站!
如何提高FreeRTOS的速度和RAM大小
Viking代理 2024-03-29

作者| ”>在嵌入式专栏共享之前,“在FreeRTOS V10.4.0中更新了哪些功能? ”,今天我将详细介绍以下知识点之一:FreeRTOS直接任务(消息)通知,其目的是减少RAM占用空间并加快执行速度。

1写在前面几乎所有的RTOS操作系统都提供队列和信号量功能。

对于大多数新手来说,使用队列和信号量是一项必不可少的技能。

然而,在大多数情况下,它们使用“中间对象”来代替。

而不是“直接任务消息”进行通信沟通。

通过“中介对象”,为了进行通信,将为每组队列或信号量分配一部分内存(消息缓冲区和流缓冲区)。

有一个问题。

如果有更多的队列或信号量,将不可避免地导致更大的内存开销。

但是,如果您通过“直接消息”进行通信,本文所述,您将节省大量内存。

2什么是直接任务通知?大多数任务间通信方法使用中间对象,例如队列,信号量或事件组。

发送任务写入通信对象,接收任务从通信对象读取。

例如,在FreeRTOS队列通信中,必须先定义一个队列,然后再创建队列:QueueHandle_t xQueue; xQueue = xQueueCreate(10,sizeof(/ *长度* /));并且该队列包含许多中间对象:您可以将这个“中间”对象数为1。

“对象”需要多少RAM空间?占?通过代码图了解中介对象的通信:直接任务通知:顾名思义,使用直接任务通知时,发送任务将通知直接发送给接收任务,而无需中介对象。

通过代码图了解:从FreeRTOS V10.4.0开始,每个任务都有一系列通知。

每个通知包含一个32位值和一个布尔状态,这两个状态加在一起仅占用5个字节的RAM。

正如任务可以防止二进制信号量等待信号量变为“可用”一样,任务可以防止通知等待通知状态变为“待处理”。

同样,就像任务可以阻止信号量计数以等待信号量的计数变为非零一样,任务可以阻止通知等待信号量的计数变为非零。

下面的第一个示例演示了这种情况。

通知不仅可以传达事件,而且还可以通过多种方式传达数据。

3直接任务通知的进一步分析通过比较FreeRTOS V10.4.0和以前的版本,您会发现V10.4.0具有更多的API,例如ulTask​​NotifyTake / ulTask​​NotifyTakeIndexed:在官方网站上也有关于这些API的详细介绍和说明,如以及应用程序代码示例:直接任务通信API描述地址:https://www.freertos.org/RTOS-task-notification-API.html 4使用直接任务通知的性能优势以及使用受限任务通知的灵活性使他们能够创建单独的二进制队列,用于信号量,数字信号量或事件组。

与使用中间对象(例如信号量)取消阻止任务相比,使用直接通知取消阻止RTOS任务的速度(根据官方数据)提高了45%,并且使用的RAM更少。

当然,凭借这些性能优势,肯定存在一些局限性:仅当只有一个任务可以作为事件的接收者时,才可以使用RTOS任务通知。

但是,在大多数实际用例中都可以满足此条件。

例如,当中断中断执行任务处理的任务时,该任务将处理该中断接收的数据。

仅当使用RTOS任务通知而不是队列时:接收任务可以等待“阻塞”消息中的通知。

状态(因此不占用任何CPU时间),并且发送任务不能等待消息“阻塞”中的消息。

状态。

如果无法立即完成传输,则传输已完成。

5如何使用实际上,使用方法非常简单,只要您可以使用RTOS队列和信号灯,就可以通过查看官方示例来基本使用它。

我还在此处以一个官方示例进行说明:/ *& nbsp; main()& nbsp;创建的两个任务的原型* / static void prvTask1(void * pvParameters);静态void prvTask2(void * pvParameters); / *& nbsp;处理由main()创建的任务的句柄* / static TaskHandle_t xTask1 = NULL,xTask2 = NULL; / *& nbsp;创建两个任务,来回发送通知,然后启动RTOS调度程序* / void main(void){xTaskCreate(prvTask1,“ Task1”,200,NULL,tskIDLE_PRIORITY,& amp; amp; ;