FreeRTOS_移植和配置

news2025/1/19 3:02:44

目录

1. 什么是FreeRTOS?

2. FreeRTOS 特点

3. FreeRTOS 移植

3.1 验证程序


1. 什么是FreeRTOS?

        我们先看 FreeRTOS 的名字,可以分成两部分:Free 和 RTOS,Free 就是免费的、自由的、不受约束的意思,RTOS 全称是 Real Time Operating System,中文名就是实时操作系统RTOS 不是指某一个确定的系统,而是指一类系统。比如说 UCOS,FreeRTOS,RTX,RT - Thread 等这些都是 RTOS 类操作系统。

        操作系统允许多个任务同时运行,叫做多任务,实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务,任务调度在各个任务之间的切换非常快!给人们造成了同一时刻有多个任务同时运行的错觉。

        操作系统的分类方式可以由任务调度器的工作方式决定,比如有的操作系统给每个任务分配同样的运行时间,时间到了就轮到下一个任务,Unix操作系统就是如此。RTOS 的任务调度器被设计为可预测的,而这正是嵌入式实时操作系统所需要的,实时环境中要求操作系统必须对某一个事件做出实时的响应,因此系统任务调度器的行为必须是可预测的。像 FreeRTOS 这种传统的 RTOS 类操作系统是由用户给每个任务分配一个任务优先级,任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务。

        FreeRTOS 是 RTOS 系统的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,当然,FreeRTOS 不仅局限于在微控制器中使用。

2. FreeRTOS 特点

FreeRTOS 是一个可裁剪的小型 RTOS 系统,包括:

  •         FreeRTOS的内核支持抢占式,合作式和时间片调度。
  •         SafeRTOS衍生自FreeRTOS,SafeRTOS在代码完整性上相比 FreeRTOS 更胜一筹。
  •         提供了一个用于低功耗的 Tickless 模式。
  •         系统的组件在创建时可以选择动态或者静态的 RAM ,比如 任务、消息队列、信号量、软件定时器等等。
  •         已经在超过 30 种架构的芯片上进行了移植。
  •         FreeRTOS-MPU 支持 Cortex-M 系列中的 MPU单元,如STM32F407.
  •         FreeRTOS 系统简单、小巧、易用,通常情况下内核占用 4k-9k字节的空间。
  •         高可移植性,代码主要 C 语言编写。
  •         支持实时任务和协程(co-routines 也有称为合作式、协同程序)
  •         任务与任务、任务与中断之间可以使用任务通知、消息队列、二值信号量、数值型信号量、递归互斥信号量和互斥信号量进行通信和同步。
  •         创新的事件组(或者事件标志)。
  •         具有优先级继承特性的互斥信号量。
  •         高效的软件定时器。
  •         强大的跟踪执行功能。
  •         堆栈溢出检测功能。
  •         任务数量不限。
  •         任务优先级不限。

3. FreeRTOS 移植

        首先需要先创建一个STM32F407的基本工程,完成初始的配置;

        FreeRTOS的移植需要在工程中添加 FreeRTOS_COREFreeRTOS_PORTABLE 文件;(具体文件的内容去FreeRTOS官方或者正点原子的资料中都有,直接移植即可)

        紧接着要在原有的基础之上,修改 stm32f4xx_it.c 、delay.c、sys.c 和 uart.c 文件

3.1 验证程序

        该程序在移植完成 FreeRTOS 的基础之上,实现 LED0 和 LED1 闪烁,且闪烁的频率不同;

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "LED.h"
#include "FreeRTOS.h"
#include "task.h"



//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);

//任务优先级
#define LED0_TASK_PRIO		2
//任务堆栈大小	
#define LED0_STK_SIZE 		50  
//任务句柄
TaskHandle_t LED0Task_Handler;
//任务函数
void led0_task(void *pvParameters);

//任务优先级
#define LED1_TASK_PRIO		3
//任务堆栈大小	
#define LED1_STK_SIZE 		50  
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);

//任务优先级
#define FLOAT_TASK_PRIO		4
//任务堆栈大小	
#define FLOAT_STK_SIZE 		128
//任务句柄
TaskHandle_t FLOATTask_Handler;
//任务函数
void float_task(void *pvParameters);

int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	delay_init(168);		//初始化延时函数
	uart_init(115200);     	//初始化串口
	LED_Init();		        //初始化LED端口
	
	//创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          //开启任务调度
}
 
//开始任务任务函数,用来创建其他三个任务
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
    //创建LED0任务
    xTaskCreate((TaskFunction_t )led0_task,     	
                (const char*    )"led0_task",   	
                (uint16_t       )LED0_STK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )LED0_TASK_PRIO,	
                (TaskHandle_t*  )&LED0Task_Handler);   
    //创建LED1任务
    xTaskCreate((TaskFunction_t )led1_task,     
                (const char*    )"led1_task",   
                (uint16_t       )LED1_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )LED1_TASK_PRIO,
                (TaskHandle_t*  )&LED1Task_Handler);        
    //浮点测试任务
    xTaskCreate((TaskFunction_t )float_task,     
                (const char*    )"float_task",   
                (uint16_t       )FLOAT_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )FLOAT_TASK_PRIO,
                (TaskHandle_t*  )&FLOATTask_Handler);  
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}

//LED0任务函数,控制LED0闪烁,提示系统正在运行
void led0_task(void *pvParameters)
{
    while(1)
    {
        LED0=~LED0;
        vTaskDelay(500);
    }
}   

//LED1任务函数,控制LED1的闪烁
void led1_task(void *pvParameters)
{
    while(1)
    {
        LED1=0;
        vTaskDelay(200);
        LED1=1;
        vTaskDelay(800);
    }
}

//浮点测试任务,用于测试STM32F4的FPU是否工作正常
void float_task(void *pvParameters)
{
	static float float_num=0.00;
	while(1)
	{
		float_num+=0.01f;
		printf("float_num的值为: %.4f\r\n",float_num);
        vTaskDelay(1000);
	}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/523536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

016-fty_crkme3

运行程序 check错误 查壳 有UPX壳,ESP定律脱壳 载入OD分析 搜索字符串 向上找,找到段首 开始分析算法 搜先判断输入是否为空 再下面开始判断输入的字符除了 “-” 是不是满足0-9 如果满足的话,要再判断长度,0x9 到 0xB&#x…

【计算机组成原理】第一章 计算系统概论

系列文章目录 第一章 计算系统概论 第二章 运算方法和运算器 第三章 多层次的存储器 第四章 指令系统 第五章 中央处理器 第六章 总线系统 第七章 外围设备 文章目录 系列文章目录前言第一章 计算机系统概论1.1 计算机的分类1.2 计算机发展简史1.2.1 计算机的五代变化1.2.2 半…

19 KVM管理虚拟机-虚拟机生命周期管理命令

文章目录 19 KVM管理虚拟机-虚拟机生命周期管理命令19.1 概述19.2 前提条件19.3 命令使用说明 19 KVM管理虚拟机-虚拟机生命周期管理命令 19.1 概述 用户可以使用virsh命令工具管理虚拟机生命周期。本节介绍生命周期相关的命令以指导用户使用。 19.2 前提条件 执行虚拟机生…

uboot symbol value ‘‘ invalid for SYS_TEXT_BASE 解决方法

环境 Win10 64位 ubuntu 20.04 虚拟机 VMware Workstation 16 Pro gcc 交叉编译工具链: ARM 官方 gcc version 11.2.1 20220111 NUC980 uboot 版本 :尝试移植到 u-boot-2019.10,官方当前 u-boot 版本为 2016.11 问题描述 升级 u-boot …

ThinkPHP6 模板引擎普通标签中,模板引擎运算符函数,循环标签,判断标签的使用,及一些特殊标签

ThinkPHP6 模板引擎普通标签中,模板引擎运算符函数,循环标签,判断标签的使用,及一些特殊标签 模板引擎支持普通标签和XML标签方式两种标签定义,分别用于不同的目的: 标签类型描述普通标签主要用于输出变量…

Linux 安装 JDK、MySQL、Tomcat(图文并茂)

所需资料 下载 1.1 软件安装方式 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布,只要解压,修改配置即可rpm安装软件已经按照re…

Unity里URP项目的介绍和创建

大家好,我是阿赵,接下来会介绍一下URP的使用 一、URP的介绍 URP(Universal Render Pipeline)通用渲染管线,是Unity在2019.3版本之后推出的一种新的渲染管线。 对比起默认的渲染管线,他的使用上会产生了一些变化,包括…

RS485电路及程序设计

一、电路原理图 图中 A、B 总线接口,用于连接 485 总线。RO 是接收输出端,DI 是发送数据收入端,RE是接收使能信号(低电平有效),DE 是发送使能信号(高电平有效)。RE DE接在一起就是高…

jenkins安装配置--持续集成

目录 1.什么是持续集成 1.1持续集成 Continuous integration ,简称CI 1.2持续集成具有的特点: 1.3持续集成的作用 2.jenkins简介 2.1概述 2.2特点 3.jenkins安装 1.下载Jenkins 2.下载jdk 3.网盘安装包载 4.创建软件安装目录 5.上传jdk和Jen…

C-内存管理

内存管理 堆,栈,静态区 c程序地址空间分布规则: 栈是从高地址向低地址延伸的,后创建的变量,后入栈,那么地址就越小. 静态变量,作用域不变,声明周期发生改变.本质原因是存储位置发生改变.编译器编译的时候放到了全局数据区. #include<stdio.h> #include<stdlib.h>…

虾皮Shopee商品详情接口(item_get-根据ID取商品详情)代码封装

item_get-根据ID取商品详情接口 通过代码封装该接口可以拿到商品标题&#xff0c;商品价格&#xff0c;商品促销信息&#xff0c;商品优惠价&#xff0c;商品库存&#xff0c;sku属性&#xff0c;商品图片&#xff0c;desc图片&#xff0c;desc描述&#xff0c;sku图片&#xf…

基于阿里云服务器安装宝塔Linux面板详细流程(有图)

使用阿里云服务器安装宝塔面板教程&#xff0c;阿里云百科以ECS云服务器CentOS操作系统为例&#xff0c;安装宝塔Linux面板&#xff0c;先远程连接到云服务器&#xff0c;然后执行宝塔面板安装命令&#xff0c;系统会自动安装宝塔面板&#xff0c;安装完成后会返回面板地址、账…

JS数据分组

JS对数据进行分组_js数据分组_柳宁依的博客-CSDN博客 原理没看懂&#xff0c;增加分组显示数据部分。 <html> <head> <style> select { display: block; margin: auto; } table { border-collapse: collapse; margin: auto; } th, td { border: 1px solid b…

“裸奔”时代下,我们该如何有效应对网络攻击、数据泄露和隐私侵犯

随着互联网的普及&#xff0c;越来越多的个人信息被上传到互联网上&#xff0c;而网络攻击、数据泄露和隐私侵犯等问题也日益严重。在这个“裸奔”时代&#xff0c;如何保护我们的网络隐私成为了一项紧迫的任务。本文将介绍一些实用的技巧和工具&#xff0c;帮助我们有效应对网…

不强制存储的ListModel和ComboBoxModel

主方法代码&#xff1a; package com.aynu.layout;import com.aynu.model.NumberComboBoxListModel; import com.aynu.model.NumberListModel;import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import j…

从零开始 Spring Boot 28:资源

从零开始 Spring Boot 28&#xff1a;资源 图源&#xff1a;简书 (jianshu.com) Resource 接口 Spring中的资源被抽象为一个Resource接口&#xff1a; public interface Resource extends InputStreamSource {boolean exists();boolean isReadable();boolean isOpen();boole…

【人像抠图】使用vs2022,onnxruntime框架进行部署(视频和多图片处理)

一、人像抠图的应用场景 1. 图像编辑:在图像编辑软件中,人像抠图是常用操作之一。通过抠图可以将人物从原背景中分离出来,放到新背景中,实现人物换背景的效果。这在电影后期特效、游戏角色置换等领域有很广泛的应用。 2. 视频特效:在视频编辑与特效制作中,人像抠图也是关键技术…

Python的标准库argparse讲解

argparse 是 Python 的标准库之一&#xff0c;用于解析命令行参数。通过 argparse&#xff0c;你可以轻松定义你的脚本或应用程序所需的命令行参数&#xff0c;并从命令行中获取这些参数的值。 import argparse# 创建解析器 parser argparse.ArgumentParser()# 添加命令行参数…

【react 全家桶】高级指引(下)

本人大二学生一枚&#xff0c;热爱前端&#xff0c;欢迎来交流学习哦&#xff0c;一起来学习吧。 <专栏推荐> &#x1f525;&#xff1a;js专栏 &#x1f525;&#xff1a;vue专栏 &#x1f525;&#xff1a;react专栏 文章目录 13【react高级指引&#xff08;下&…

是哟Git时报错OpenSSL SSL_read: Connection was reset, errno 10054

文章目录 修改hosts的ip多尝试解除SSL验证 报错如下所示 遇到这个问题首先可以考虑开魔法或者开魔法加换个网比如开手机热点 解除SSL验证我没有试过, 我就在hosts文件中加上了ip的配置就好了 修改hosts的ip 根据网上的教程, 我试了试修改C盘中hosts文件的GitHub相关访问域名的…