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
    +关注

    关注

    2270

    文章

    10900

    浏览量

    355923
  • RTOS
    +关注

    关注

    22

    文章

    812

    浏览量

    119624
  • FreeRTOS
    +关注

    关注

    12

    文章

    484

    浏览量

    62166
  • 实时操作系统

    关注

    1

    文章

    197

    浏览量

    30758
收藏 人收藏

    评论

    相关推荐

    SDCC编译器和FreeRTOS实时操作系统的优缺点及应用研究

    FreeRTOS是为小型嵌入式系统开发的一个开放源代码、免费的实时操作系统内核。其内核大部分使用C语言编程,具有高度的可移植性,目前已经被
    的头像 发表于 09-05 12:16 6958次阅读
    SDCC编译器和<b class='flag-5'>FreeRTOS</b><b class='flag-5'>实时</b><b class='flag-5'>操作系统</b>的优缺点及应用研究

    嵌入式操作系统上的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 是什么?FreeRTOS实时操作系统是如何进行移植的呢?有哪些步骤?
    发表于 10-27 06:25

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

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

    基于FreeRTOS的嵌入式实时操作系统的原理和实现

    FreeRTOS是一个源码公开的免费的嵌入式实时操作系统,通过研究其内核可以更好地理解嵌入式操作系统的实现原理.本文主要阐述FreeRTOS
    发表于 11-18 03:34 6681次阅读

    嵌入式操作系统FreeRTOS的原理以及如何实现移植的方法说明

    针对嵌入式FreeRTOS操作系统进行介绍与分析,并结合时下流行的uC/OS-Ⅱ操作系统进行类比。在移植上,详细分析了FreeRTOS
    发表于 01-14 15:49 24次下载
    嵌入式<b class='flag-5'>操作系统</b><b class='flag-5'>FreeRTOS</b>的原理以及如何实现<b class='flag-5'>移植</b>的方法说明

    STM32芯片移植FreeRTOS操作系统的教程

    的设计,缩短应用的开发周期,保证系统的可靠性和实时性。本文主要研究基于STM32芯片的硬件平台,由于RAM资源的限制,只能使用占用资源少的小型操作系统,常见的主要有uC/os-Il eCos,
    发表于 03-29 12:01 36次下载
    STM32芯片<b class='flag-5'>移植</b><b class='flag-5'>FreeRTOS</b><b class='flag-5'>操作系统</b>的教程

    嵌入式操作系统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 21次下载
    嵌入式<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操作系统移植教程

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

    FreeRTOS操作系统移植文件

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

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

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

    FreeRTOS实时操作系统简述

    FreeRTOS是一个为嵌入式系统设计的开源实时操作系统。它提供了一个多任务内核和一系列组件功能,适合在资源受限的设备上管理实时任务和应用程
    发表于 09-19 12:37 1820次阅读
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>实时</b><b class='flag-5'>操作系统</b>简述