初识FreeRTOS入门,对FreeRTOS简介、任务调度、内存管理、通信机制以及IO操作,控制两个led不同频率闪烁

这篇具有很好参考价值的文章主要介绍了初识FreeRTOS入门,对FreeRTOS简介、任务调度、内存管理、通信机制以及IO操作,控制两个led不同频率闪烁。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当代嵌入式系统的开发越来越复杂,实时性要求也越来越高。为了满足这些需求,开发者需要使用实时操作系统(RTOS),其中一个流行的选择是FreeRTOS(Free Real-Time Operating System)。本篇博客将详细介绍FreeRTOS的特性、任务调度、内存管理、通信机制以及一些示例代码。

1. FreeRTOS简介

FreeRTOS是一个开源的实时操作系统,专门设计用于嵌入式系统。它提供了一套任务调度、内存管理、中断处理和通信机制,使开发者能够更方便地开发实时应用程序。FreeRTOS具有以下特点:

  • 开源免费:FreeRTOS遵循GNU通用公共许可证(GPL)的开源协议,可以免费使用和修改。
  • 简单轻量:FreeRTOS的内核非常小巧,适用于资源有限的嵌入式系统。
  • 可移植性:FreeRTOS提供了可移植的API接口,可以在不同的处理器和开发环境中使用。
  • 可裁剪性:FreeRTOS的内核和组件可以根据需求进行裁剪,以减少内存占用和代码大小。

2. 任务调度

FreeRTOS的核心是任务调度器(Task Scheduler),它负责按照一定的调度策略将任务分配给处理器执行。每个任务都是一个独立的函数,可以有不同的优先级和堆栈大小。任务调度器根据任务的优先级和调度策略决定哪个任务被执行。

下面是一个简单的示例代码,展示了如何在FreeRTOS中创建和调度任务:

#include "FreeRTOS.h"
#include "task.h"

// 任务1的函数
void vTask1(void *pvParameters)
{
    while (1)
    {
        // 任务1的代码
    }
}

// 任务2的函数
void vTask2(void *pvParameters)
{
    while (1)
    {
        // 任务2的代码
    }
}

int main()
{
    // 创建任务1
    xTaskCreate(vTask1, "Task 1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);

    // 创建任务2
    xTaskCreate(vTask2, "Task 2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);

    // 启动任务调度器
    vTaskStartScheduler();

    return 0;
}

以上代码中,通过调用xTaskCreate函数创建了两个任务vTask1vTask2。任务函数中的代码会被不断执行,不需要显式地进行任务调度。在main函数中,通过调用vTaskStartScheduler函数启动了任务调度器,使得任务可以被调度执行。

3. 内存管理

FreeRTOS提供了一套内存管理机制,用于动态分配和释放任务堆栈和其他资源。开发者可以使用FreeRTOS提供的内存分配函数,如pvPortMallocvPortFree,来管理内存。

下面是一个示例代码,展示了如何使用FreeRTOS的内存管理函数:

#include "FreeRTOS.h"
#include "task.h"

// 任务的堆栈大小
#define TASK_STACK_SIZE 128

// 任务的优先级
#define TASK_PRIORITY 1

int main()
{
    // 创建任务的堆栈
    StackType_t *taskStack = (StackType_t *)pvPortMalloc(TASK_STACK_SIZE * sizeof(StackType_t));

    // 创建任务
    xTaskCreate(vTask, "Task", TASK_STACK_SIZE, NULL, TASK_PRIORITY, NULL);

    // 启动任务调度器
    vTaskStartScheduler();

    // 释放任务的堆栈
    vPortFree(taskStack);

    return 0;
}

以上代码中,通过调用pvPortMalloc函数动态分配了任务的堆栈空间,然后通过调用vTaskCreate函数创建了任务。在任务执行完毕后,通过调用vPortFree函数释放任务的堆栈空间。

4. 通信机制

FreeRTOS提供了多种通信机制,如信号量、消息队列和事件组,用于实现任务间的通信和同步。

下面是一个示例代码,展示了如何使用FreeRTOS的信号量来实现任务间的同步:

#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"

// 信号量
SemaphoreHandle_t xSemaphore;

// 任务1的函数
void vTask1(void *pvParameters)
{
    while (1)
    {
        // 等待信号量
        xSemaphoreTake(xSemaphore, portMAX_DELAY);

        // 任务1的代码

        // 发送信号量
        xSemaphoreGive(xSemaphore);
    }
}

// 任务2的函数
void vTask2(void *pvParameters)
{
    while (1)
    {
        // 等待信号量
        xSemaphoreTake(xSemaphore, portMAX_DELAY);

        // 任务2的代码

        // 发送信号量
        xSemaphoreGive(xSemaphore);
    }
}

int main()
{
    // 创建信号量
    xSemaphore = xSemaphoreCreateBinary();

    // 创建任务1
    xTaskCreate(vTask1, "Task 1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);

    // 创建任务2
    xTaskCreate(vTask2, "Task 2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);

    // 启动任务调度器
    vTaskStartScheduler();

    // 删除信号量
    vSemaphoreDelete(xSemaphore);

    return 0;
}

以上代码中,通过调用xSemaphoreCreateBinary函数创建了一个二值信号量。任务1和任务2在执行前都会等待信号量,当某个任务执行完毕后,通过调用xSemaphoreGive函数发送信号量,使得另一个任务可以执行。

5. IO操作

任务:使用freertos进行基于stm32的两个任务控制,一个任务是pa0口控制一个led灯每500ms闪烁一次,另一个任务是pa1口控制一个led灯每1s闪烁一次

#include "stm32f4xx.h"
#include "FreeRTOS.h"
#include "task.h"

// 定义任务句柄
TaskHandle_t task1Handle, task2Handle;

// 定义任务1的函数
void Task1(void *pvParameters)
{
    while(1)
    {
        // 控制PA0口的LED灯每500ms闪烁一次
        GPIO_ToggleBits(GPIOA, GPIO_Pin_0);
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}

// 定义任务2的函数
void Task2(void *pvParameters)
{
    while(1)
    {
        // 控制PA1口的LED灯每1s闪烁一次
        GPIO_ToggleBits(GPIOA, GPIO_Pin_1);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

int main()
{
    // 初始化GPIOA的时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 输出模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽输出
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 无上下拉
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 速度50MHz

    // 初始化GPIOA的PA0和PA1口
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 创建任务1
    xTaskCreate(Task1, "Task1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, &task1Handle);

    // 创建任务2
    xTaskCreate(Task2, "Task2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, &task2Handle);

    // 启动任务调度器
    vTaskStartScheduler();

    while(1)
    {
        // 如果任务调度器启动失败,可以在此处处理异常情况
    }

    return 0;
}

以上示例代码中,首先使用STM32的库函数RCC_AHB1PeriphClockCmdGPIO_InitTypeDef初始化GPIO引脚PA0PA1的设置。然后,在任务1和任务2函数中分别控制PA0口和PA1口的LED灯闪烁,通过调用vTaskDelay函数来实现延时。

在main函数中,使用xTaskCreate函数创建任务1和任务2,并分别传入相应的函数指针、任务名称、堆栈大小和优先级。然后通过调用vTaskStartScheduler函数启动任务调度器。

总结

本篇博客详细介绍了FreeRTOS的特性、任务调度、内存管理、通信机制和举例对STM32的IO口进行操作。
FreeRTOS的源代码和文档可以在官方网站(https://www.freertos.org/)上找到。文章来源地址https://www.toymoban.com/news/detail-620598.html

到了这里,关于初识FreeRTOS入门,对FreeRTOS简介、任务调度、内存管理、通信机制以及IO操作,控制两个led不同频率闪烁的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 初识轻量级分布式任务调度平台 xxl-job

    大家好,这里是 Rocky 编程日记 ,喜欢后端架构及中间件源码,目前正在阅读 xxl-job 源码。同时也把自己学习该 xxl-job 笔记,代码分享出来,供大家学习交流,如若笔记中有不对的地方,那一定是当时我的理解还不够,希望你能及时提出。 如果对于该笔记存在很多疑惑,欢迎

    2024年02月10日
    浏览(62)
  • STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)

    学习使用Freertos第二步 在 FreeRTOS 中,任务通信可以通过以下函数来实现: xQueueCreate() :用于创建一个消息队列。可以设置队列长度和每个消息的大小。 xQueueSend() :将一条消息发送到队列中。可以选择阻塞或非阻塞发送。 xQueueReceive() :从队列中接收一条消息。可以选择阻塞

    2024年02月11日
    浏览(32)
  • 【Freertos基础入门】freertos任务的优先级

    本系列基于 stm32 系列单片机来使用freerots 任务管理是实时操作系统(RTOS)的核心功能之一,它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS,它提供了强大的任务管理功能,让开发者能够轻松创建和控制任务。本文将介绍 FreeRTOS 的任务管理功能

    2024年02月13日
    浏览(24)
  • FreeRTOS教程2 任务管理

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCOM V2.6串口助手 一个滑动变阻器 逻辑分析仪nanoDLA 本文主要学习FreeRTOS任务管理的相关知识, 包括FreeRTOS创建/删除任务、任务状态、任务优先级、延时函数、空闲任务和任务

    2024年03月12日
    浏览(32)
  • Freertos任务的管理是何物?

    提示:文章来自正点原子和野火 使用Freertos,创建任务,运行任务,必须知道怎么配置任务的状态,并将其修改运行的状态,做到想让哪个任务保证必须优先的情况下,也能保证其他任务的实时性。所以要知道任务有 几种运行状态 ,还要知道怎么修改任务的状态。 说白了就

    2024年02月15日
    浏览(25)
  • 详解FreeRTOS:FreeRTOS任务管理程序设计思路(基础篇—9)

    目录 1、中断服务函数 2、任务 3、空闲任务 4、任务的执行时间 作为一位RTOS程序开发者,要对自己设计的嵌入式系统要了如指掌,任务的优先级信息,任务与中断的处理,任务的运行时间、逻辑、状态等都要知道,才能设计出好的系统,所以,在设计的时候需要根据需求制定

    2024年02月13日
    浏览(25)
  • 【FreeRTOS】【应用篇】任务管理相关函数

    本篇文章主要对 FreeRTOS 中任务管理相关的函数进行了详解,最最重要的是解析了 绝对延时 vTaskDelayUntil()” 为什么能够确保任务执行周期准确??? 一部分代码和图片参考野火 FreeRTOS 教程。 ① 使用场景 当一个任务暂时不使用时,我们可以将其挂起 挂起的意思就是这个任务不参

    2024年02月11日
    浏览(33)
  • 【初识c语言】地址及其内存的简介

    晚钟悠然追为你 回声两度为你作答 暗夜逆流而上 树根在秘密发电 你的果园亮了 我径直走向你 带领所有他乡之路 当火焰试穿大雪 日落封存帝国 大地之书翻到此刻 ————节选 北岛《路歌》 一. 内存的简介: 在计算机的组成结构中,有一个很重要的部分,就是 储存器 。

    2024年02月02日
    浏览(28)
  • 【Freertos基础教程】任务管理之基本使用

    本freertos是以 stm32 系列为操作的 任务管理是实时操作系统(RTOS)的核心功能之一,它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS,它提供了强大的任务管理功能,让开发者能够轻松创建和控制任务。本文将介绍 FreeRTOS 的任务管理功能,包括任

    2024年02月13日
    浏览(28)
  • FreeRTOS内存管理 基于STM32

    目录 一、内存管理的基本概念 二、内存管理的应用场景 三、heap_4.c 1.内存申请函数 pvPortMalloc() 2.内存释放函数 vPortFree()  四、内存管理的实验 五、内存管理的实验现象       在计算系统中,变量、中间数据一般存放在系统存储空间中,只有在实际使用时才将 它们从存储空

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包