首页 > 其他分享 >七个项目掌握freertos

七个项目掌握freertos

时间:2024-03-16 10:29:57浏览次数:25  
标签:七个 include FreeRTOS freertos 掌握 int void xQueue NULL

1、闪烁LED:


最基本的示例项目,涉及到创建一个简单的任务,用于控制LED的闪烁。这个项目会教你如何初始化FreeRTOS并创建任务。

#include "FreeRTOS.h"
#include "task.h"
#define LED_PIN (某个GPIO引脚)

void vBlinkTask(void *pvParameters) {
    while(1) {
        // Toggle LED状态
        gpio_set_level(LED_PIN, !gpio_get_level(LED_PIN));
        
        // 500毫秒延时
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}

int main(void) {
    // 初始化硬件
    gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);

    // 创建闪烁LED的任务
    xTaskCreate(vBlinkTask, "BlinkTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL);
    
    // 启动调度器
    vTaskStartScheduler();

    // 如果执行到这里,那么会有问题
    for( ;; );
}


2、任务通信:

创建两个任务,使用队列来在它们之间传递消息。这个项目可以帮助你理解FreeRTOS中的任务同步和通信机制。

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

QueueHandle_t xQueue;

void vSenderTask(void *pvParameters) {
    int32_t lValueToSend = 0;
    while(1) {
        // 发送一个值到队列中
        xQueueSend(xQueue, &lValueToSend, 0);
        lValueToSend++;
        
        // 间隔一秒
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void vReceiverTask(void *pvParameters) {
    int32_t lReceivedValue;
    while(1) {
        // 从队列中接收数据
        if(xQueueReceive(xQueue, &lReceivedValue, portMAX_DELAY)) {
            // 成功接收到数据,lReceivedValue有新值
        }
    }
}

int main(void) {
    // 创建队列,长度为1,数据大小为int32_t
    xQueue = xQueueCreate(1, sizeof(int32_t));
    
    // 创建两个任务
    xTaskCreate(vSenderTask, "SenderTask", 1000, NULL, 1, NULL);
    xTaskCreate(vReceiverTask, "ReceiverTask", 1000, NULL, 1, NULL);
    
    // 启动调度器
    vTaskStartScheduler();
    
    return 0;
}


3、多任务管理:


创建多个任务,包括周期性任务和响应外部事件(如按钮按下)的任务。这有助于你学习任务优先级和调度。

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

void vTaskFunction(void *pvParameters) {
    for (;;) {
        // 任务具体的代码

        vTaskDelay(一个时间周期);
    }
}

int main(void) {
    xTaskCreate(vTaskFunction, "Task1", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
    xTaskCreate(vTaskFunction, "Task2", configMINIMAL_STACK_SIZE, NULL, 2, NULL);

    vTaskStartScheduler();

    return 0;
}


4、利用信号量控制资源访问:


用一个或多个任务来模拟资源(如串口)的访问,并使用信号量来同步对该资源的访问。

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

SemaphoreHandle_t xSemaphore;

void vTaskFunction(void *pvParameters) {
    for (;;) {
        // 获取信号量
        if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) {
            // 访问资源

            // 释放信号量
            xSemaphoreGive(xSemaphore);
        }
    }
}

int main(void) {
    xSemaphore = xSemaphoreCreateMutex();
    xTaskCreate(vTaskFunction, "Task1", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
    xTaskCreate(vTaskFunction, "Task2", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

    vTaskStartScheduler();

    return 0;
}


5、模拟温度监控系统:

创建任务来模拟温度传感器的读取,并通过队列将数据发送给数据处理任务。

#include "FreeRTOS.h"
#include "queue.h"

QueueHandle_t xQueue;

void vSensorTask(void *pvParameters) {
    float temperature;

    for (;;) {
        // 模拟读取温度传感器数据
        temperature = getTemperature();

        // 将数据放入队列
        xQueueSend(xQueue, &temperature, portMAX_DELAY);
    }
}

int main(void) {
    xQueue = xQueueCreate(10, sizeof(float));

    xTaskCreate(vSensorTask, "SensorTask", configMINIMAL_STACK_SIZE, NULL, 2, NULL);

    vTaskStartScheduler();

    return 0;
}


6、FreeRTOS内存管理:

学习和实践FreeRTOS的内存分配和释放,理解不同内存管理方案的使用。

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

// 声明两个任务的函数原型
void vProducerTask(void *pvParameters);
void vConsumerTask(void *pvParameters);

// 定义全局队列句柄
QueueHandle_t xQueue;

int main(void) {
    // 创建一个队列,能够存储10个int类型的指针
    xQueue = xQueueCreate(10, sizeof(int *));

    if (xQueue != NULL) {
        // 创建任务
        xTaskCreate(vProducerTask, "Producer", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
        xTaskCreate(vConsumerTask, "Consumer", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

        // 启动调度器
        vTaskStartScheduler();
    }

    // 在这里应该永远执行不到
    for (;;);
}

void vProducerTask(void *pvParameters) {
    int *piValue;
    while (1) {
        // 动态分配内存
        piValue = (int *) pvPortMalloc(sizeof(int));
        
        if (piValue != NULL) {
            // 在分配的内存中存储数值
            *piValue = rand() % 100;

            // 将内存指针发送到队列
            if(xQueueSend(xQueue, &piValue, portMAX_DELAY) != pdPASS) {
                // 如果发送失败则释放内存
                vPortFree(piValue);
            }
        }

        // 模拟生产者速率
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

void vConsumerTask(void *pvParameters) {
    int *piValue;
    while (1) {
        if (xQueueReceive(xQueue, &piValue, portMAX_DELAY) == pdPASS) {
            // 从队列中接收到内存指针, 处理数据
            processValue(*piValue);
            
            // 释放内存
            vPortFree(piValue);
        }
    }
}

void processValue(int value) {
    // 在这里实现数据处理
}


7、FreeRTOS软件定时器:

配置和使用FreeRTOS的软件定时器,进行周期性任务的调度。

#include "FreeRTOS.h"
#include "timers.h"

// 定时器的回调函数
void vTimerCallback(TimerHandle_t xTimer);

int main(void) {
    // 初始化硬件,根据具体平台进行相应初始化,例如GPIO、中断等。

    // 创建定时器
    TimerHandle_t xExampleTimer;

    // 定时器的ID,没有特殊用途时可以设置为NULL
    const uint32_t timerID = 0;

    // 创建软件定时器,设置定时500毫秒, 自动重载,timerID为定时器ID,vTimerCallback为回调函数
    xExampleTimer = xTimerCreate("Timer", pdMS_TO_TICKS(500), pdTRUE, (void *)timerID, vTimerCallback);

    // 启动定时器,定时器会在启动后的500毫秒后执行回调函数。0表示不等待命令发送到定时器命令队列。
    if (xExampleTimer != NULL) {
        xTimerStart(xExampleTimer, 0);
    }

    // 启动调度器,开始执行任务
    vTaskStartScheduler();

    // 如果程序执行到这里,那么可能是因为内存不足导致调度器无法启动。
    for (;;);

    return 0;
}

// 定义回调函数
void vTimerCallback(TimerHandle_t xTimer) {
    // 这里执行定时器到期时需要执行的代码
    // 比如Toggle一个LED的状态、读取传感器数据、或要发送一个心跳消息等。

    // TimerHandle_t可以用来获取定时器的ID
    uint32_t timerID = (uint32_t) pvTimerGetTimerID(xTimer);

    // 根据timerID进行相应的处理,若timerID没有用到,则可以忽略
}

标签:七个,include,FreeRTOS,freertos,掌握,int,void,xQueue,NULL
From: https://blog.csdn.net/weixin_40345245/article/details/136665323

相关文章

  • FreeRTOS入门基础
    RTOS是为了更好地在嵌入式系统上实现多任务处理和时间敏感任务而设计的系统。它能确保任务在指定或预期的时间内得到处理。FreeRTOS是一款免费开源的RTOS,它广泛用于需要小型、预测性强、灵活系统的嵌入式设备。创建第一个任务任务函数:任务是通过函数来定义的。函数通常看起......
  • 快速上手Python爬虫,轻松掌握技巧!
    很多人都听说过爬虫,我也不例外。曾看到别人编写的爬虫代码,虽然没有深入研究,但感觉非常强大。因此,今天我决定从零开始,花费仅5分钟学习入门爬虫技术,以后只需轻轻一爬就能查看所有感兴趣的网站内容。广告?不存在的,因为我看不见。爬虫只会获取我感兴趣的信息,不需要的内容对我而言只......
  • 掌握 Kubernetes 故障排除技巧:kubectl命令的基本指南
    Kubernetes彻底改变了容器编排,简化了应用程序的管理和扩展。然而,与任何复杂系统一样,Kubernetes集群也会遇到问题,需要及时解决才能保持最佳性能和可靠性。在本文中,我们将深入探讨必要的kubectl命令,这些命令是诊断和排除Kubernetes集群问题不可或缺的工具。无论您是新手还是经......
  • 5分钟上手Python爬虫:从干饭开始,轻松掌握技巧
    很多人都听说过爬虫,我也不例外。曾看到别人编写的爬虫代码,虽然没有深入研究,但感觉非常强大。因此,今天我决定从零开始,花费仅5分钟学习入门爬虫技术,以后只需轻轻一爬就能查看所有感兴趣的网站内容。广告?不存在的,因为我看不见。爬虫只会获取我感兴趣的信息,不需要的内容对我而言只是一......
  • 掌握Python库的Bokeh,就能让你的交互炫目可视化
    本文分享自华为云社区《Bokeh图形魔法:掌握绘图基础与高级技巧,定制炫目可视化》,作者:柠檬味拥抱。Bokeh是一个用于创建交互式可视化图形的强大Python库。它不仅易于使用,而且功能强大,适用于各种数据可视化需求。本文将介绍Bokeh库的绘图可视化基础入门,重点说明常用的参数,并通过实例......
  • .NET项目轻松配置:掌握Packages.props和Build.props的利用
     概述:`Directory.Packages.props`和`Directory.Build.props`是.NET项目中的配置文件,分别用于统一管理NuGet包引用和自定义MSBuild构建过程。它们提高了解决方案的可维护性,通过集中配置,简化了项目文件,使团队协作更一致,同时避免了在每个项目中重复相同的配置,提高了开发效率。在......
  • 【10分钟掌握深度学习2】机器学习基础14
    2.30聚类和降维有什么区别与联系?聚类用于找寻数据内在的分布结构,既可以作为一个单独的过程,比如异常检测等等。也可作为分类等其他学习任务的前驱过程。聚类是标准的无监督学习。在一些推荐系统中需确定新用户的类型,但定义“用户类型”却可能不太容易,此时往往可先对原油......
  • 网安人掌握这个能力,比别人多50%的岗位机会!
    前言看了众多安全招聘信息,发现有这几个能力,能比别人多50%的岗位机会!更多70%的工作薪资!1、代码审计某大厂中在招聘【高级安全工程师】时,特意将“代码审计”写进招聘需求,并开出了最高4W的月薪。2、云安全现在是云的时代,云开发、云运维,自然也有云安全。具备云安全能力的......
  • 3分钟告诉你如何成为一名黑客?|零基础到黑客入门指南,你只需要掌握这五点能力
    文章目录什么是黑客?成为一名黑客需要具备哪些能力?第一点,了解黑客的思维方式第二点,学习一门编程语言第三点,学习网络安全基础知识第四点,实战操作第五点,懂法律,懂法律,懂法律!说到黑客,大家心中的形象是不是都是这样的?是啊。仅仅通过一台电脑就能操纵他人手机,获取全球最高......
  • 买房掌握这9大妙招 认清开发商的套路!
    相对于开发商来说,购房者往往属于弱势群体。由于很多购房者缺乏对房产知识以及法律知识的了解,很容易被开发商所“忽悠”。更有甚者发生纠纷时,购房者不知如何处理,导致自己的合法权益受到损害。那么想要明明白白买房,认清开发商的套路需要掌握哪些知识一、看五证了解开发商实力鉴别......