0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

实时操作系统FreeRTOS移植教程

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2022-06-08 09:23 次阅读

1.FreeRTOS简介

Free 即免费的,RTOS 全称是 Real Time Operating System,中文就是实时操作系统。注意,RTOS 不是指某一个确定的系统,而是指一类系统。比如 uC/OS,FreeRTOS,RTX,RT-Thread 等这些都是 RTOS 类操作系统。
FreeRTOS 是 RTOS 系统的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,当然,FreeRTOS 不仅局限于在微控制器中使用。但从文件数量上来看 FreeRTOS 要比uC/OSII 和 uC/OSIII 小的多。
FreeRTOS特点

  • FreeRTOS 的内核支持抢占式,合作式和时间片调度。
  • 提供了一个用于低功耗的 Tickless 模式。
  • 系统的组件在创建时可以选择动态或者静态的 RAM,比如任务、消息队列、信号量、软件定时器等等。
  • FreeRTOS 系统简单、小巧、易用,通常情况下内核占用 4k-9k 字节的空间。
  • 高可移植性,代码主要 C 语言编写。
  • 高效的软件定时器、强大的跟踪执行功能、堆栈溢出检测功能。
  • 任务数量不限。

FreeRTOS源码下载:FreeTOS源码下载地址

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

2.FreeRTOS移植

1.打开下载好的FreeRTOS文件夹,我们发现会有两个FreeRTOS的文件夹,我们这里以最基本的源码作为移植示例。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

2.打开FreeRTOS/Source,此文件夹中保存的即为FreeRTOS源码,接下来我们找一个简洁的工程移植FreeRTOS系统。将Source复制到我们要移植的工程中。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

3.在要移植的工程中创建FreeRTOS文件夹。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

4.将源码复位到该文件夹中。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

5.删除不需要的文件:在portable中只保留下面两个文件夹即可。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

RVDS中只保留ARM_CM3文件

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

6.打开工程,添加.c文件到工程中,添加头文件路径。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

在官方的参考例程里面我们发现有这个,将这个文件拷贝到我们要移植的工程下。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

存放路径可以随便选择,只要在KEIL中添加好相应路径即可。重新编译工程。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70pYYBAGKW5TeAcmWDAACm8hFxmyM000.png

7.提供系统心跳值函数。

#include "FreeRTOS.h"					//FreeRTOS使用		  
#include "task.h" 
extern void xPortSysTickHandler(void);
/*****************滴答定时器初始化******************/
void SysTick_Init(void)
{
	SysTick->CTRL&=~(1<<2);//外部时钟源9MHZ
	SysTick->CTRL|=1<<1;//开中断
	SysTick->VAL=0;
	SysTick->LOAD=9000*configTICK_RATE_HZ;//1s
	SysTick->CTRL|=1<<0;//使能定时器
}
/*滴答定时器中断,为FreeRTOS提供节拍数*/
void SysTick_Handler(void)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)
	{
		xPortSysTickHandler();
	}
}
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

在FreeRTOSconfig.h中设置相应的宏

/*FreeRTOS与软件定时器相关配置*/
#define configUSE_TIMERS	 1       //为1时启用软件定时器
#define configTIMER_TASK_PRIORITY	 (configMAX_PRIORITIES-1)  //软件定时器优先级
#define configTIMER_QUEUE_LENGTH		 5   //软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH	 (configMINIMAL_STACK_SIZE*2)    //软件定时器任务堆栈大小
#define INCLUDE_xTaskGetSchedulerState     1   
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

8.延时函数修改

(1)可以直接调用FreeRTOS中提供的延时函数,不过调用该函数会在延时时会进行任务切换,若不想在延时中进行任务切换,则可调用下面的模拟延时函数。通过设置宏FreeRTOS_OS。

/**************微妙延时函数*************/
void Delay_Us(int time)
{
	#ifdef FreeRTOS_OS
	u32 ticks;
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;				//LOAD的值	    	 
	ticks=time*9; 						//需要的节拍数 
	told=SysTick->VAL;        //刚进入时的计数器值
	while(1)
	{
		tnow=SysTick->VAL;
		if(tnow!=told)	
		{
			if(tnow=ticks)break;			//时间超过/等于要延迟的时间,则退出.
		}
	}
	#else
	int i,j;
	for(i=0;i

(2)微妙延时函数

/**************微妙延时函数*************/
void Delay_Us(int time)
{
	#ifdef FreeRTOS_OS
	u32 ticks;
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;				//LOAD的值	    	 
	ticks=time*9; 						//需要的节拍数 
	told=SysTick->VAL;        //刚进入时的计数器值
	while(1)
	{
		tnow=SysTick->VAL;
		if(tnow!=told)	
		{
			if(tnow=ticks)break;			//时间超过/等于要延迟的时间,则退出.
		}
	}
	#else
	int i,j;
	for(i=0;i

9.任务设置模板

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

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

#define key_TASK_PRIO 2     //任务优先级
#define key_STK_SIZE 50      //任务堆栈大小
TaskHandle_t keyTask_Handler; //任务句柄
void key_task(void);          //任务函数

int main()
{
	SysTick_Init();
	Beep_Init();
	Led_Init();
	Key_Init();
	Usartx_Init(USART1,115200,72);
	TIMx_Init(TIM2,72,20*1000);
	printf("USART1初始化完成\r\n");
	
	//创建任务
	xTaskCreate( (TaskFunction_t)start_task,//任务函数
								(const char *)"start_task",//任务名称
								 (uint16_t)START_STK_SIZE,//堆栈大小
									NULL,           //传递给任务函数的参数
								 (UBaseType_t)START_TASK_PRIO,//任务优先级
								 (TaskHandle_t *)&StartTask_Handler);//任务句柄
		vTaskStartScheduler();     //开启任务调度
}

10.任务函数

/*开始任务函数*/
void start_task(void *pvParameters)
{
	taskENTER_CRITICAL();  //进入临界区
	//创建LED0任务
	xTaskCreate( (TaskFunction_t  )LED0_task,//任务函数
								(const char    *)"start_task",//任务名称
								 (uint16_t)LED0_STK_SIZE,//堆栈大小
									NULL,           //传递给任务函数的参数
								 (UBaseType_t   )LED0_TASK_PRIO,//任务优先级
								 (TaskHandle_t *)&LED0Task_Handler);//任务句柄

	xTaskCreate(  (TaskFunction_t )key_task,//任务函数
								(const char    *)"KEYt_task",//任务名称
								(uint16_t )key_STK_SIZE,//堆栈大小
								NULL,           //传递给任务函数的参数
								(UBaseType_t    )key_TASK_PRIO,//任务优先级
								(TaskHandle_t  *)&keyTask_Handler);//任务句柄
	vTaskDelete(StartTask_Handler); //删除开始任务	
	taskEXIT_CRITICAL();            //退出临界区						
}

11.任务执行

void LED0_task(void)
{
	while(1)
	{
		LED1=!LED1;
		vTaskDelay(500);
	}
}
void key_task(void)//任务函数
{
	u8 key=0;
	while(1)
	{
		key=Key_Scan();
		if(key)
		{
			printf("key=%d\n",key);
		}
		vTaskDelay(10);
	}
}


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348735
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118794
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61347
  • 实时操作系统

    关注

    1

    文章

    184

    浏览量

    30515
收藏 人收藏

    评论

    相关推荐

    嵌入式操作系统上的FreeRTOS操作系统分析

    。由于rtos需占用一定的系统资源(尤其是ram资源),只有μc/os-ii、embos、salvo、freertos等少数实时操作系统能在小ram单片机上运行。相对于c/os-ii、
    发表于 07-01 08:19

    请问freertos是硬实时操作系统吗?

    freertos是硬实时操作系统吗?都有哪些硬实时操作系统啊?
    发表于 06-13 09:00

    FreeRTOS实时操作系统

    FreeRTOS实时操作系统,Nabto正在努力建立一个强大的FreeRTOS + Nabto组合的解决方案。我们最新推出AppMyProduct应用平台可帮助您快速开发远程控制设备
    发表于 08-04 07:58

    FreeRTOS实时操作系统是如何进行移植的呢

    FreeRTOS 是什么?FreeRTOS实时操作系统是如何进行移植的呢?有哪些步骤?
    发表于 10-27 06:25

    如何将FreeRTOS实时操作系统移植到STM32单片机中

    前言本文主要讲解如何将FreeRTOS实时操作系统移植到STM32单片机中,在本文之前已经基于MDK集成开发环境移植了stm32标准库并新建
    发表于 01-11 08:15

    嵌入式实时操作系统FreeRTOS基本概述

    嵌入式实时操作系统FreeRTOS基本概述在嵌入式领域当中,实时操作系统的应用越来越广泛了,目前嵌入式
    发表于 02-16 07:12

    实时操作系统到Linux系统移植

    从一个操作系统到另一个操作系统应用程序的移植即使在最好的情况下也经常是一个艰巨的任务。把一个实时的嵌入式应用程序移植到一个新的
    发表于 05-06 10:27 1173次阅读

    嵌入式操作系统FreeRTOS的原理与实现

    。由于RTOS需占用一定的系统资源(尤其是RAM资源),只有C/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对于C/OS-II、e
    发表于 12-04 15:01 1366次阅读

    嵌入式操作系统FREERTOS移植.

    嵌入式操作系统FREERTOS移植.(济南嵌入式开发招聘)-嵌入式操作系统FREERTOS移植
    发表于 07-30 12:01 15次下载
    嵌入式<b class='flag-5'>操作系统</b><b class='flag-5'>FREERTOS</b>的<b class='flag-5'>移植</b>.

    嵌入式实时操作系统FreeRTOS在ARM7上移植实现

    嵌入式实时操作系统FreeRTOS在ARM7上移植实现(嵌入式开发工程师待遇)-嵌入式实时操作系统
    发表于 07-30 12:05 18次下载
    嵌入式<b class='flag-5'>实时</b><b class='flag-5'>操作系统</b><b class='flag-5'>FreeRTOS</b>在ARM7上<b class='flag-5'>移植</b>实现

    嵌入式操作系统FreeRTOS的原理与移植实现

    少的小型操作系统,常见的主要有uC/os-Il eCos,FreeRTOS等,与uC/Os-1 eCcos等商业收费的操作系统不同,FreeRTOS
    发表于 08-04 13:50 16次下载
    嵌入式<b class='flag-5'>操作系统</b><b class='flag-5'>FreeRTOS</b>的原理与<b class='flag-5'>移植</b>实现

    嵌入式操作系统FREERTOS移植

    嵌入式操作系统FREERTOS移植(嵌入式开发环境包含哪几个主要部分)-19.1FreeRTOS简介FreeRTOS是一个可
    发表于 08-04 14:48 6次下载
    嵌入式<b class='flag-5'>操作系统</b><b class='flag-5'>FREERTOS</b><b class='flag-5'>移植</b>

    FreeRTOS操作系统移植教程

    本章教程将为大家介绍基于 MDK 的 FreeRTOS 操作系统移植移植工作比较简单,只需要用户添加 需要的源码文件,不需要做任何的底层工作,再添加三个宏定义即可。
    发表于 08-28 14:59 2次下载

    FreeRTOS操作系统移植文件

    FreeRTOS操作系统移植文件,不会官网下载的,可以这里下载
    发表于 08-28 14:58 1次下载

    FreeRTOS:一个迷你的实时操作系统内核

    ** 1、FreeRTOS** FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量
    的头像 发表于 06-29 17:15 518次阅读
    <b class='flag-5'>FreeRTOS</b>:一个迷你的<b class='flag-5'>实时</b><b class='flag-5'>操作系统</b>内核