FreeRTOS入门总结

本文介绍了RTOS的主要好处,如防止流水式代码导致的响应慢,以及其核心功能,包括任务的动态和静态创建,任务删除,延时函数,以及任务间通信的队列、信号量和事件组等机制。此外,还详细阐述了队列的创建、复位和删除,以及读写操作。
摘要由CSDN通过智能技术生成

大纲

目前学习RTOS的好处:使代码不断交替任务执行,防止流水式代码带来的响应速度慢。

RTOS总结:创建多个任务代码;不同代码之间通信;资源管理。

一、创建代码

动态创建

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数
const char * const pcName, // 任务的名字
const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节
void * const pvParameters, // 调用任务函数时传入的参数
UBaseType_t uxPriority, // 优先级
TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用它来操作这个任务

静态创建

    TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
                                    const char * const pcName, /*lint !e971 Unqualified har types are allowed for strings and single characters only. */
                                    const uint32_t ulStackDepth,
                                    void * const pvParameters,
                                    UBaseType_t uxPriority,
                                    StackType_t * const puxStackBuffer,
                                    StaticTask_t * const pxTaskBuffer )

其他函数

任务删除函数

void vTaskDelete( TaskHandle_t xTaskToDelete );
/*
自杀: vTaskDelete(NULL)
被杀:别的任务执行 vTaskDelete(pvTaskCode) ,pvTaskCode是自己的句柄
杀人:执行 vTaskDelete(pvTaskCode) ,pvTaskCode是别的任务的句柄
*/

延时函数

/*
vTaskDelay:至少等待指定个数的Tick Interrupt才能变为就绪状态
vTaskDelayUntil:等待到指定的绝对时刻,才能变为就绪态。
*/
void vTaskDelay( const TickType_t xTicksToDelay ); /* xTicksToDelay: 等待多少给
Tick */
/* pxPreviousWakeTime: 上一次被唤醒的时间
* xTimeIncrement: 要阻塞到(pxPreviousWakeTime + xTimeIncrement)
* 单位都是Tick Count
*/
BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,
const TickType_t xTimeIncrement );

空闲任务

 vTaskStartScheduler() ;//这个函数运行时,会创建空闲任务

二、不同代码之间通信

内核对象生产者消费者数据/状态说明
队列ALLALL

数据:若干个数据
谁都可以往队列里扔数据,

谁都可以从队列里读数据

用来传递数据,
发送者、接收者无限制,

一个数据只能唤醒─个接收者

事件组ALLALL

多个位:或、与
谁都可以设置(生产)多个位,

谁都可以等待某个位、若干个位

用来传递事件,

可以是N个事件,
发送者、接受者无限制,

可以唤醒多个接收者:像广播

信号量ALLALL

数量:0~n
谁都可以增加一个数量,

谁都可消耗一个数量

用来维持资源的个数,

生产者、消费者无限制,

1个资源只能唤醒1个接收者

任务通知ALL只有我

数据、状态都可以传输,

使用任务通知时,
必须指定接受者

N对1的关系:

发送者无限制,
接收者只能是这个任务

互斥量只能A上锁ALL

位:0、1
我上锁:1变为0,
只能由我开锁:0变为1

就像个空厕所,

谁使用谁上锁,

也只能由他开锁

1.队列

动态分配内存

/*
uxQueueLength 队列长度,最多能存放多少个数据(item)
uxItemSize 每个数据(item)的大小:以字节为单位
返回值 非0:成功,返回句柄,以后使用句柄来操作队列
NULL:失败,因为内存不足
*/
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );

静态分配内存

/*
uxQueueLength:队列长度,最多能存放多少个数据(item)
uxItemSize:每个数据(item)的大小:以字节为单位
pucQueueStorageBuffer:如果uxItemSize非0,pucQueueStorageBuffer必须指向一个uint8_t数组,此数组大小至少为"uxQueueLength*uxItemSize"
pxQueueBuffer:必须执行一个StaticQueue_t结构体,用来保存队列的数据结构
返回值:非0:成功,返回句柄,以后使用句柄来操作队列 NULL:失败,因为pxQueueBuffer为NULL
*/
QueueHandle_t xQueueCreateStatic(
                                UBaseType_t uxQueueLength,
                                UBaseType_t uxItemSize,
                                uint8_t *pucQueueStorageBuffer,
                                StaticQueue_t *pxQueueBuffer
                                );

复位

/* pxQueue : 复位哪个队列;
* 返回值: pdPASS(必定成功)
*/
BaseType_t xQueueReset( QueueHandle_t pxQueue);

删除

void vQueueDelete( QueueHandle_t xQueue );

写队列

/* 等同于xQueueSendToBack
* 往队列尾部写入数据,如果没有空间,阻塞时间为xTicksToWait
*/
BaseType_t xQueueSend(
QueueHandle_t xQueue,
const void *pvItemToQueue,这些函数用到的参数是类似的,统一说明如下:
TickType_t xTicksToWait
);
/*
* 往队列尾部写入数据,如果没有空间,阻塞时间为xTicksToWait
*/
BaseType_t xQueueSendToBack(
QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait
);
/*
* 往队列尾部写入数据,此函数可以在中断函数中使用,不可阻塞
*/
BaseType_t xQueueSendToBackFromISR(
QueueHandle_t xQueue,
const void *pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken
);
/*
* 往队列头部写入数据,如果没有空间,阻塞时间为xTicksToWait
*/
BaseType_t xQueueSendToFront(
QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait
);
/*
* 往队列头部写入数据,此函数可以在中断函数中使用,不可阻塞
*/
BaseType_t xQueueSendToFrontFromISR(
QueueHandle_t xQueue,
const void *pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken
);

读队列

BaseType_t xQueueReceive( QueueHandle_t xQueue,
void * const pvBuffer,
TickType_t xTicksToWait );
BaseType_t xQueueReceiveFromISR(
QueueHandle_t xQueue,
void *pvBuffer,
BaseType_t *pxTaskWoken
);

2.信号量

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FreeRTOS是一个开源的实时操作系统内核,广泛应用于嵌入式设备中。它提供了一种轻量级的任务调度机制,使得多个任务可以同时运行,实现了任务之间的时间分配。在开发中,我们常常需要对FreeRTOS进行入门学习,掌握其基本的使用方法。 首先,我们需要下载和安装FreeRTOS的开发环境。可以从FreeRTOS的官方网站上下载到最新的版本,并根据所用的开发板和编译器进行相应的配置和安装。 接下来,我们可以开始编写我们的第一个FreeRTOS程序。首先,我们需要定义几个任务,并为每个任务分配一个任务函数。任务函数是我们要执行的具体任务逻辑。 然后,我们需要使用FreeRTOS提供的API来创建和管理任务。通过调用API函数,我们可以创建任务、删除任务、挂起任务、恢复任务等等。在任务的创建过程中,我们可以设置任务的优先级、栈大小、堆栈溢出保护等参数。 在任务执行的过程中,我们可以使用FreeRTOS提供的同步机制来实现任务间的通信和同步。例如,使用队列来传递数据,使用信号量来实现任务间的互斥。 最后,我们可以将编写好的代码进行编译和下载到目标设备上进行测试。通过观察任务的执行情况和输出结果,我们可以验证我们的FreeRTOS程序是否正常运行。 总结起来,去水印Freertos入门需要下载和安装FreeRTOS的开发环境,编写任务函数,使用API函数来创建和管理任务,使用同步机制来实现任务间的通信和同步,最后进行编译和下载测试。通过这个过程,我们可以初步掌握FreeRTOS的基本使用方法,并能够编写简单的FreeRTOS应用程序。 ### 回答2: FreeRTOS是一个小型的实时操作系统(RTOS),广泛应用于嵌入式系统开发中。它提供了一套功能丰富且易于使用的API,允许开发人员创建基于多任务的应用程序。 要开始使用FreeRTOS,首先需要选择适合项目需求的硬件平台和开发工具。目前,FreeRTOS支持多种硬件平台,包括ARM、MIPS和RISC-V等。开发工具可以是基于命令行、Eclipse或者IAR Embedded Workbench等集成开发环境。 在项目初始化过程中,需要将FreeRTOS的源代码和配置文件添加到开发环境中。然后,开发者可以根据自己的需求进行配置,并选择所需的功能模块,如任务、信号量、消息队列等。 在编码阶段,通过编写任务函数,开发者可以实现系统中的各个任务。任务函数可以通过任务调度器自动地在合适的时候被调度执行。通过任务之间的调度,可以有效地实现多任务并发执行。 在FreeRTOS中,还可以使用信号量来实现任务之间的同步和互斥。信号量既可以用于同步任务,也可以用于保护共享资源,确保多个任务之间的有序访问。 此外,还可以使用消息队列来在任务之间传递数据。消息队列提供了一种方便的方式,可以实现任务间的无阻塞通信,从而提升系统的效率。 总的来说,FreeRTOS是一个简单而强大的实时操作系统,可以帮助开发人员轻松地创建基于多任务的嵌入式应用程序。 ### 回答3: FreeRTOS是一个开源的实时操作系统内核,广泛应用于嵌入式系统中。它具有轻量级、高性能和可移植性等特点,且易于学习和使用。 要学习FreeRTOS入门知识,可以按照以下步骤进行: 1. 确定学习目标:明确自己学习FreeRTOS的目的和动机,了解它的应用领域和优势,有助于更有目标性地进行学习。 2. 下载安装FreeRTOS:从FreeRTOS官方网站上下载最新版本的FreeRTOS源码,然后解压缩到本地文件夹中。 3. 阅读文档:FreeRTOS提供了详尽的官方文档,包含了对API接口、数据结构等的详细解释。强烈建议初学者先阅读官方文档,从整体了解FreeRTOS的特性和使用方法。 4. 学习基本概念:阅读FreeRTOS的概念和特性部分,包括任务、队列、信号量、定时器等基本概念。了解这些概念对于后续学习和使用非常关键。 5. 示例程序:FreeRTOS提供了多个示例程序,用于展示FreeRTOS的用法和特性。可以运行示例程序,并阅读它们的源代码,逐步理解任务的创建、调度和通信等过程。 6. 实践项目:根据自己的兴趣和需要,选择一个适合的项目来进行实践,如LED控制、串口通信等。在实践中掌握FreeRTOS的使用方法,并逐步熟悉其各个组件的功能和特性。 7. 资源学习:除了官方文档外,还可以参考一些书籍、论坛、博客等资源来进行深入学习。通过阅读他人的经验分享和教程,可以更好地理解FreeRTOS的使用和技巧。 总之,学习FreeRTOS需要有一定的耐心和实践经验。通过逐步学习和实践,你将逐渐掌握FreeRTOS的基本使用方法和高级特性,为嵌入式系统的开发提供良好的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值