【02】FreeRTOS获取10.4.6源码+移植到STM32F429步骤

2023-05-16

目录

1.获取FreeRTOS源码

1.1 FreeRTOS官网下载步骤

1.2FreeRTOS源码内容

 1.3FreeRTOS内核文件

 1.3.1Demo文件夹

 1.3.2Source文件夹

2.FreeRTOS移植

2.1添加FreeRTOS源码

2.1.1复制FreeRTOS源码

 2.1.2将文件添加到工程

 2.1.3添加头文件路径

 2.2添加FreeRTOS.h

2.3修改SYSYTEM文件 

2.3.1sys.h

2.3.2usart.c 

 2.3.3delay.c

 2.4修改中断相关文件

2.5可选步骤

2.5.1修改工程名称

2.5.2移除USMART调试组件

2.5.3添加定时器驱动

 2.6添加应用程序

3.系统配置文件说明

4.总结


1.获取FreeRTOS源码

1.1 FreeRTOS官网下载步骤

        进入网址:FreeRTOS官网

         点击DownLoad FreeRTOS,上图页面中两个按钮可以二选一

        选择下载FreeRTOS,点击图中的DownLoad

        即可出现下图的下载图,如果多次下载不成功,可能需要挂梯子,这里我是用挂梯子才下载成功的。

1.2FreeRTOS源码内容

          最重要的是FreeRTOS的内核文件,移植相关都需要此文件夹。

FreeRTOS源码介绍
名称描述
FreeRTOSFreeRTOS内核(我们移植FreeRTOS的必要文件
FreeRTOS.PlusFreeRTOS组件
tools工具
GitHub-FreeRTOS-HomeFreeRTOS的GitHub仓库链接
Quick_Start_Guide快速入门指南官方文档链接
Upgrading-to-FreeRTOS-xxx升级到指定FreeRTOS版本官方文档链接
History.txtFreeRTOS历史更新记录
其他其他

 1.3FreeRTOS内核文件

        打开FreeRTOS的内核文件会出现以下内容:

FreeRTOS内核文件
名称 描述
DemoFreeRTOS官方提供的演示例程
LicenseFreeRTOS相关许可(未用到
SourceFreeRTOS源码
Test公用以及移植层测试代码(未用到

 1.3.1Demo文件夹

        Demo文件夹里面是FreeRTOS的演示例程,如下所示:

         通过以上文件可以看出FreeRTOS支持多种芯片架构、支持多种不同型号芯片,对于入门学习 FreeRTOS 是十分有帮助的,在学习移植FreeRTOS 的过程中就可以参考这些演示工程。

 1.3.2Source文件夹

        Source文件夹中是FreeRTOS的源码,FreeRTOS是一种轻量级的、可被裁剪的OS。以下是Source文件夹中的内容:

         除了用不到,可以不添加的文件,其他文件是FreeRTOS必须涉及的文件。

Soure文件夹
名称描述
include内包含了FreeRTOS的头文件
portable内包含了FreeRTOS的移植文件
croutine.c协程相关文件(不用可以不添加
event_groups.c事件相关文件(不用可以不添加
list.c列表相关文件
queue.c队列相关文件
stream_buffer.c流式缓冲区相关文件(不用可以不添加
tasks.c任务相关文件
timers.c软件定时器相关文件(不用可以不添加

portable文件夹

         FreeRTOS操作系统归根到底是一个软件层面的东西,那FreeRTOS是如何跟硬件联系在一起的呢?portable文件夹里面的东西就是连接桥梁,由于我们使用MDK开发STM,因此这里只重点介绍其中的部分移植文件。

名称

描述

Keil

指向RVDS文件夹,对应MDK开发

RVDS

不同内核芯片的移植文件(由于Keil文件夹中内容指向RVDS,所以需要此文件,连接硬件的桥梁所在文件,根据不同的内核芯片去选择不同的桥梁)

MemMang

内存管理文件

2.FreeRTOS移植

        目的:实现全STM32的FreeRTOS移植。

移植准备:

1.FreeRTOS源码

2.由于后续实验需要使用LED、LCD、定时器、内存管理等所以我们使用正点原子HAL库版本的内存管理的实验工程为基础工程进行FreeRTOS的移植。由于内存管理实验例程的BSP文件夹中可能不包含定时器的驱动文件,因此如果内存管理实验例程的BSP文件夹不包括TIMER文件夹的话,需要从定时器相关的BSP文件夹中拷贝一份TIMER到FreeRTOS移植基础工程中。使用普通的跑马灯实验例程作为基础工程也是没有问题的,这里使用内存管理实验是为了方便后续例程。

 移植步骤:

1.添加FreeRTOS源码:将FreeRTOS源码添加至基础工程、头文件路径等。(比如之前提到 三个主要联系文件:队列、列表、任务相关,以及连接桥梁、头文件等)

2.FreeRTOSConfig.h:添加FreeRTOSConfig.h配置文件(此文件主要是用来拆解FreeRTOS的功能,以及一些API函数的使能都是通过此文件实现)

3.修改SYSTEM文件:修改SYSYTEM文件中的sys.c、delay.c、usart.c(正点原子中这三个文件是基于裸机以及UCOS-III是实现的,FreeRTOS是不能直接使用的,需要进行修改

4.修改中断相关文件:修改Systick中断、SVC中断、PendSV中断(这些中断和任务切换相关)

5.添加应用程序:验证移植是否成功

2.1添加FreeRTOS源码

2.1.1复制FreeRTOS源码

        此项目程序依赖正点原子A盘中的HAL库版本例程的38-内存管理实验7-定时器中断实验此处使用的代码和2022年正点原子发行的视频中使用的程序版本不同,但是原理一致。

        将38-内存管理实验文件夹改为“FreeRTOS移植”,在文件夹中创建FreeRTOS文件夹,将FreeRTOS源码Source中的文件全部拷贝到FreeRTOS文件中,并删除.gitmodules文件,只保留.c文件。

         连接桥梁portable文件夹,在开发STM32时只用到了上文中提到的三个文件夹,其余用不到的文件,可以自行决定是否删除,这里将其他未用到的文件删除掉了。

 2.1.2将文件添加到工程

        打开工程,在项目中新建两个文件分组。

         向两个分组中添加文件。FreeRTOS_CORE文件夹放FreeRTOS的内核C源码文件,FreeRTOS_PORT中存放内核的移植文件,内存管理文件heap_x.c和连接桥梁port.c文件。port.c文件需要根据处理器型号的不同选择不同文件下的port.c文件。

STM32不同型号芯片与port.c的对应关系

STM32芯片类型

port.c所在文件
STM32F1ARM_CM3
STM32F4ARM_CM4F
STM32F7ARM_CM7/r0p1
STM32H7ARM_CM7/r0p1

        添加后的工程目录如下图所示: 

 2.1.3添加头文件路径

        头文件地 目录包含FreeRTOS源码的头文件include和连接桥梁port.c的头文件。

 2.2添加FreeRTOS.h

        FreeRTOSConfig.h时FreeRTOS操作系统的配置文件,FreeRTOS是可裁剪的,通过将FreeRTOS.h文件中用不到的功能可以通过宏定义为0去掉。

1、FreeRTOSConfig.h获取途径一

        用户自行编写,根据自己的需求编写FreeRTOSConfig.对FreeRTOS操作系统进行裁剪。对新手来说,并不友好,新手并不知道FreeRTOS有哪些功能。官方网址:FreeRTOS配置网址   网址中对各个配置项进行了描述,是官方提供的FreeRTOSConfig.h的模板。

2、FreeRTOSConfig.h获取途径二

        FreeRTOS内核的Demo工程中获取。Demo文件夹包含了FreeRTOS官方提供的演示工程,在这些演示工程中就包括了每个演示工程对应的FreeRTOSConfig.h,注意有些演示工程使用的是老版本的FreeRTOS,因此FreeRTOSConfig.h并不能够很好的适用新版本的FreeRTOS。

 3、FreeRTOSConfig.h获取途径三

        从正点原子配套例程“FreeRTOS移植实验”的FreeRTOS/include文件夹下找到FreeRTOSConfig.h文件。这里和2022年出品的正点原子FreeRTOS视频有区别。复制到移植工程的USER文件夹下,如下图所示:

2.3修改SYSYTEM文件 

        SYSTEM文件夹中的文件是正点原子一开始针对\mu C/OS编写,所以用于FreeRTOS,需要作相应的修改。SYSTEM文件中一共需要修改三个文件,分别是sys.h,usart.c,delay.c。

2.3.1sys.h

        将以下宏定义改为1,表示支持OS。

//0,不支持os
//1,支持os
#define SYSTEM_SUPPORT_OS		1		//定义系统文件夹是否支持OS

2.3.2usart.c 

        需要修改两个地方,首先是串口中的中断服务函数,原本在\mu C/OS使用时,进入和退出中断需要添加OSIntEnter()和OSIntExit()两个函数,这是\mu C/OS对于中断的相关处理机制,而FreeRTOS并没有这种机制,因此需要将这两行代码删除,修改后的串口中断服务函数如下所示

//串口1中断服务程序
void USART1_IRQHandler(void)                	
{ 
	u8 Res;

	if((__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_RXNE)!=RESET))  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
	{
        HAL_UART_Receive(&UART1_Handler,&Res,1,1000); 
		if((USART_RX_STA&0x8000)==0)//接收未完成
		{
			if(USART_RX_STA&0x4000)//接收到了0x0d
			{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了 
			}
			else //还没收到0X0D
			{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
				{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
				}		 
			}
		}   		 
	}
	HAL_UART_IRQHandler(&UART1_Handler);	
 											 
} 

        usart.c要修改的第二个地方时导入的头文件,因为在串口的中断服务函数中已经删除了\mu C/OS的相关代码,并且FreeRTOS也没有使用相关代码,因此将usart.c中包含的关于OS的头文件删除,要删除的代码如下

//如果使用os,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h"					//os 使用	  
#endif

 2.3.3delay.c

        delay.c文件需要改动的地方比较多,大致可以分为三个步骤:1)删除适用于\mu C/OS但不适用与FreeRTOS的代码;2)添加FreeRTOS的相关代码;3)修改部分内容。

1) 删除适用于\mu C/OS但不适用与FreeRTOS的代码

        一共需要删除1个全局变量、6个宏定义、3个函数,这些要删除的代码在使用\mu C/OS时候会用到,但是在使用FreeRTOS的时候无需使用,要删除的代码如下所示,还需删除SysTick_Handler函数后的#endif

#if SYSTEM_SUPPORT_OS		
    static u16 fac_ms=0;				        //ms延时倍乘数,在os下,代表每个节拍的ms数
#endif

#if SYSTEM_SUPPORT_OS							//如果SYSTEM_SUPPORT_OS定义了,说明要支持OS了(不限于UCOS).
//当delay_us/delay_ms需要支持OS的时候需要三个与OS相关的宏定义和函数来支持
//首先是3个宏定义:
//delay_osrunning:用于表示OS当前是否正在运行,以决定是否可以使用相关函数
//delay_ostickspersec:用于表示OS设定的时钟节拍,delay_init将根据这个参数来初始哈systick
//delay_osintnesting:用于表示OS中断嵌套级别,因为中断里面不可以调度,delay_ms使用该参数来决定如何运行
//然后是3个函数:
//delay_osschedlock:用于锁定OS任务调度,禁止调度
//delay_osschedunlock:用于解锁OS任务调度,重新开启调度
//delay_ostimedly:用于OS延时,可以引起任务调度.

//本例程仅作UCOSII和UCOSIII的支持,其他OS,请自行参考着移植
//支持UCOSII
#ifdef 	OS_CRITICAL_METHOD						//OS_CRITICAL_METHOD定义了,说明要支持UCOSII				
#define delay_osrunning		OSRunning			//OS是否运行标记,0,不运行;1,在运行
#define delay_ostickspersec	OS_TICKS_PER_SEC	//OS时钟节拍,即每秒调度次数
#define delay_osintnesting 	OSIntNesting		//中断嵌套级别,即中断嵌套次数
#endif

//支持UCOSIII
#ifdef 	CPU_CFG_CRITICAL_METHOD					//CPU_CFG_CRITICAL_METHOD定义了,说明要支持UCOSIII	
#define delay_osrunning		OSRunning			//OS是否运行标记,0,不运行;1,在运行
#define delay_ostickspersec	OSCfg_TickRate_Hz	//OS时钟节拍,即每秒调度次数
#define delay_osintnesting 	OSIntNestingCtr		//中断嵌套级别,即中断嵌套次数
#endif


//us级延时时,关闭任务调度(防止打断us级延迟)
void delay_osschedlock(void)
{
#ifdef CPU_CFG_CRITICAL_METHOD   			//使用UCOSIII
	OS_ERR err; 
	OSSchedLock(&err);						//UCOSIII的方式,禁止调度,防止打断us延时
#else										//否则UCOSII
	OSSchedLock();							//UCOSII的方式,禁止调度,防止打断us延时
#endif
}

//us级延时时,恢复任务调度
void delay_osschedunlock(void)
{	
#ifdef CPU_CFG_CRITICAL_METHOD   			//使用UCOSIII
	OS_ERR err; 
	OSSchedUnlock(&err);					//UCOSIII的方式,恢复调度
#else										//否则UCOSII
	OSSchedUnlock();						//UCOSII的方式,恢复调度
#endif
}

//调用OS自带的延时函数延时
//ticks:延时的节拍数
void delay_ostimedly(u32 ticks)
{
#ifdef CPU_CFG_CRITICAL_METHOD
	OS_ERR err; 
	OSTimeDly(ticks,OS_OPT_TIME_PERIODIC,&err); //UCOSIII延时采用周期模式
#else
	OSTimeDly(ticks);						    //UCOSII延时
#endif 
}
 

2)添加FreeRTOS相关代码

         只需要在delay.c文件中使用extern关键字导入一个FreeRTOS函数——xPortSysTickHandler()即可,这个函数是用于处理FreeRTOS系统时钟节拍的,本文将SysTick作为FreeRTOS操作系统的心跳,因此需要在SysTick的中断服务函数中调用这个函数,因此将代码添加到SysTick中断服务函数之前,修改后的代码如下

extern void xPortSysTickHandler(void);
//systick中断服务函数,使用OS时用到
void SysTick_Handler(void)
{	
    HAL_IncTick();
	if(delay_osrunning==1)					//OS开始跑了,才执行正常的调度处理
	{
		OSIntEnter();						//进入中断
		OSTimeTick();       				//调用ucos的时钟服务程序               
		OSIntExit();       	 				//触发任务切换软中断
	}
}

3)修改部分内容

        修改的内容包括两个,分别是包括头文件和4个函数。

        修改的4个函数分别是:SysTick_Handler()、delay_init()、delay_us()和delay_ms()。

3-1)SysTick_Handler()

        滴答定时器中断服务函数SysTick_Handler()中需要调用之前(2)中添加的代码。修改后的代码如下

//systick中断服务函数,使用OS时用到
void SysTick_Handler(void)
{	
    HAL_IncTick();
	if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)	//OS开始跑了,才执行正常的调度处理
	{
		xPortSysTickHandler();
	}
}

 3-2)delay_init()

        delay_init()主要用于初始化SysTick。在后续调用vTaskStartScheduler()函数时,FreeRTOS会按照FreeRTOSConfig.h文件的配置对SysTick进行初始化,因此delay_init()函数对于SysTick的初始化主要使用在FreeRTOS开始任务调度之前。函数delay_init()要修改的部分主要是为SysTick的重装载值以及删除用不到的代码,修改后的代码如下所示(F1和F4/F7/H7系列修改后不同,此处为F4/F7/H7修改后的代码):

void delay_init(u8 SYSCLK)
{
#if SYSTEM_SUPPORT_OS 						//如果需要支持OS.
	u32 reload;
#endif
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK
	fac_us=SYSCLK;						//不论是否使用OS,fac_us都需要使用
#if SYSTEM_SUPPORT_OS 						//如果需要支持OS.
	reload=SYSCLK;					    //每秒钟的计数次数 单位为K
	/*使用configTick_RATE_HZ计算重装载值
	 *configTick_RATE_HZ在FreeRTOSConfig.h中定义
	 */
	reload*=1000000/configTICK_RATE_HZ;	//根据configTICK_RATE_HZ设定溢出时间
											//reload为24位寄存器,最大值:16777216,在180M下,约合0.745s左右	
	/*删除不用的g_fac_ms相关代码*/
	SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//开启SYSTICK中断
	SysTick->LOAD=reload; 					//每1/OS_TICKS_PER_SEC秒中断一次	
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
#else
#endif
}		

         在正点原子STM32系列开发板的标准例程源码中,STM32F1系列的函数delay_init()将SysTick的时钟频率设置为CPU时钟频率的1/8,而STM32F4/F7/H7系列的函数delay_init则将SysTick的时钟频率设置为与CPU相同的时钟频率,由于FreeRTOS在配置SysTick时,并不会配置SysTick的时钟源,因此这将导致正点原子STM32F1系列和正点原子STM32F4/F7/H7系列的FreeRTOSConfig.h文件有所差异,并且也只有这一点存在差异

3-3)delay_us()

        函数delay_us()用于微秒级的CPU忙延时,原本的函数delay_us()延时的前后加入了自定义函数delay_osschedlock()delay_osschedunlock()用于锁定和解锁\mu C/OS的任务调度器,让延时更加准确。在FreeRTOS中可以不用加入这两个函数,但是这会让函数delay_us(0的微妙延时的精度有所下降,修改后的代码如下所示(同时需要删除delay_osschedlock()delay_osschedunlock()两个函数)

void delay_us(u32 nus)
{		
	u32 ticks;
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;				//LOAD的值	    	 
	ticks=nus*fac_us; 						//需要的节拍数 
	/*删除适用于uC/OS用于锁定任务调度器的自定义函数*/
	told=SysTick->VAL;        				//刚进入时的计数器值
	while(1)
	{
		tnow=SysTick->VAL;	
		if(tnow!=told)
		{	    
			if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.
			else tcnt+=reload-tnow+told;	    
			told=tnow;
			if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.
		}  
	};
	/*删除用于解锁任务调度器的自定义函数*/										    
}  

 3-4)delay_ms()

        函数delay_ms()用于毫秒级的CPU忙延时,原本的函数delay_ms()会判断\mu C/OS是否在运行,如果正在运行则使\mu C/OS的OS延时进行毫秒级延时,否则就调用delay_us()进行毫秒级的CPU忙延时。在FreeRTOS中,可以将函数delay_ms()定义为CPU忙延时,当需要OS延时时,调用FreeRTOS提供的OS延时函数vTaskDelay()delay_ms()函数修改后的代码如下

void delay_ms(u16 nms)
{	
	uint32_t i;
	for(i=0;i<nms;i++)
	{
		delay_us(1000);
	}
}

3-5)包含头文件

        根据上述步骤的修改,delay.c文件中使用到了FreeRTOS的相关函数,因此需要在该文件中包含FreeRTOS的相关头文件,并且移除原本存在的\mu C/OS相关头文件。先看一下改之前delay.c文件中包含的\mu C/OS相关的头文件:

//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h"					//ucos 使用	  
#endif

        修改后的内容如下

//如果使用FreeRTOS,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "FreeRTOS.h"
#include "task.h"
#endif

 2.4修改中断相关文件

        在FreeRTOS的移植过程中会用到三个重要重要中断,分别任FreeRTOS系统时基定时器中断(SysTick中断)、SVC中断、PendSV中断。对于不同型号的STM32,中断服务函数所在文件名字有所不同,具体如下:

STM32系列中断服务函数所在文件
STM32F1stm32f2xx_it.c
STM32F4stm32f4xx_it.c
STM32F7stm32f4xx_it.c
STM32H7stm32h7xx_it.c

        SysTick的中断服务函数在delay.c中已经定义了,并且FreeRTOS也提供了SVC和PendSV的中断服务函数,因此需要将HAL库提供的这三个中断服务函数注释掉,这里采用宏开关的方式让HAL库中的这三个中断服务函数不加入注释,使用的宏在sys.h中定义,因此还得导入sys.h头文件。 添加头文件后的代码如下所示

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f4xx_it.h"
/*导入 sys.h 头文件*/
#include "sys.h"

        并且将sys.h的以下宏定义改为1:

#define SYSTEM_SUPPORT_OS		1		//定义系统文件夹是否支持OS

        在SVC_Handler、PendSV_Handler、SysTick_Handler函数外加入宏开关。修改后的代码如下

/**
  * @brief  This function handles SVCall exception.
  * @param  None
  * @retval None
  */
#if(!SYSTEM_SUPPORT_OS)
void SVC_Handler(void)
{
}
#endif
/**
  * @brief  This function handles Debug Monitor exception.
  * @param  None
  * @retval None
  */
void DebugMon_Handler(void)
{
}

/**
  * @brief  This function handles PendSVC exception.
  * @param  None
  * @retval None
  */
#if(!SYSTEM_SUPPORT_OS)
void PendSV_Handler(void)
{
}
#endif
/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
#if(!SYSTEM_SUPPORT_OS)
void SysTick_Handler(void)
{
  HAL_IncTick();
}
#endif

         最后,还需修改FreeRTOSConfig.h文件,文件中有如下定义(由于前面并没有添加FreeRTOSConfig.h到项目文件夹中,所以需要编译才能打开):

#define configPRIO_BITS       		__NVIC_PRIO_BITS

        对于这个宏定义,在下文讲解到ARM Corten-M和FreeRTOS中断的时候会具体分析。可以看到,这个宏定义将configPRIO_BITS定义成__NVIC_PRIO_BITS,而__NVIC_PRIO_BITS在HAL库中有相关定义,对于不同的STM32型号,__NVIC_PRIO_BITS定义在不同的文件中,具体的对应关系如下表所示:

不同型号STM32与__NVIC_PRIO_BITS所在文件的对应关系
STM32型号__NVIC_PRIO_BITS所在文件
STM32F1stm32f103x3.h
STM32F4stm32f407xx.h或stm32f429xx.h
STM32F7stm32f750xx.h或stm32f767xx.h
STM32H7stm32h750xx.h或stm32h743xx.h

         虽然不同类型的芯片对应的文件不同,但是__NVIC_PRIO_BITS都被定义成立相同的值,如下所示:

#define __NVIC_PRIO_BITS          4U       /*!< STM32F4XX uses 4 Bits for the Priority Levels */

        这个值是正确的,但是如果将__NVIC_PRIO_BITS定义成4U的话,在编译FreeRTOS工程的时候,Keil会报错,解决方法就是将4U改成4,代码修改后如下图所示(在源码中我并不需要修改,因为本身就是4,这里和2022正点原子FreeRTOS教程有所不同):

#define __NVIC_PRIO_BITS          4       /*!< STM32F4XX uses 4 Bits for the Priority Levels */

        此时编译文件将不再报错。 

2.5可选步骤

2.5.1修改工程名称

2.5.2移除USMART调试组件

         同时删除main函数中的关于USMAT的头文件,usmart.h。并且删除main函数中调用USMART的相关代码。

2.5.3添加定时器驱动

        将实验7-基本定时器中断实验中的TIMER文件夹复制到HARDWARE文件夹下。并且在工程中添加.c文件。

 2.6添加应用程序

        移植好FreeRTOS后需要测试移植是否成功。将测试源码拷贝到工程文件USER下。测试程序下载链接:

        在工程中添加freertos.c文件,并且在main函数中添加头文件freertos.h,修改后如下所示

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"

#include "malloc.h"
#include "freertos_demo.h"

        在freertos.c中创建了两个任务,task1和task2,每隔1s翻转LED0亮灭状态和每隔1s翻转LED1的亮灭状态,外设的初始化在led.h中。这里所使用的程序是老版本程序项目,并没有2022正点原子FreeRTOS中的LED0_TOGGLE()LED0_TOGGLE()两个函数,并且led.h文件并不相同。所以如果想达到任务要求,只需要将TOGGLE函数改成LED灯状态取反即可。修改后的程序如下所示:

void task1(void *pvParameters)
{    
    while(1)
    {
        LED0=~LED0;                                                     /* LED0闪烁 */
        vTaskDelay(1000);                                               /* 延时1000ticks */
    }
}
void task2(void *pvParameters)
{
    while(1)
    {
        LED1=~LED1;
        vTaskDelay(500);                           /* 延时500ticks */
    }
}

         在main()函数中调用freertos_demo()函数,可能会产生Error:L6406E错误,只需删除main函数中调用的其他函数即可,修改后main函数如下所示

int main(void)
{
    
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED 
	freertos_demo();
}

        在正点原子STM32F429阿波罗开发板上,会显示LED0亮1s灭1s,而LED1亮0.5s灭0.5s,移植程序验证成功。

3.系统配置文件说明

        FreeRTOSCofig.h配置文件作用:对FreeRTOS进行功能配置和裁剪,以及API函数的使能。

学习途径:

1.官方的在线文档有详细的说明:FreeRTOS官方说明文档地址

2.正点原子《FreeRTOS开发指南》第三章的内容——FreeRTOS系统配置

 相关宏可以大致分为三类:

“INCLUDE”:配置FreeRTOS中可选的API函数

“config”:完成FreeRTOS的功能配置和裁剪

其他配置项:PendSV中断服务函数宏定义、SVC终端服务函数宏定义(宏定义供port.c进行调用)

4.总结

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【02】FreeRTOS获取10.4.6源码+移植到STM32F429步骤 的相关文章

  • uboot开篇 — arm-linux-gcc安装及编译uboot

    最近由于工作的原因需要研究下uboot在2440上的移植 xff0c 于是乎今天开始着手 首先下载了uboot的源码 xff08 源码下载官网http www icdev com cn batch viewlink php itemid 6
  • Halcon 找到产品上 圆圈中的7个点

    文章目录 1 关键实现环节演示 2 完整代码 及 原图 文章目录 1 关键实现环节演示 2 完整代码 及 原图 找到下图 圆圈中的7个点 思路 先找到圆圈外面的矩形 再找到里面的圆圈 最后找到圆圈里面的 圆点 1 关键实现环节演示 二值化
  • 安装endnote 之后打开word出现乱码

    文章目录 1 安装endnote 之后打开word出现乱码3 EndNote X9 插入参考文献常见问题总结4 EndNote X9 快速上手教程 xff08 毕业论文参考文献管理器 xff09 1 安装endnote 之后打开word出现
  • EndNote X9 引用参考 单击文献编号,不能跳转到文尾文献列表处,咋解决?文献编号 不能跳转 ,怎么办?

    文章目录 1 正常情况下 引用文献编号 是可以跳转的2 问题分析3 解决方法4 EndNote X9 插入参考文献常见问题总结5 EndNote X9 快速上手教程 xff08 毕业论文参考文献管理器 xff09 1 正常情况下 引用文献编
  • EndNote X9 参考文献附录列表 格式调整

    文章目录 1 参考文献附录列表 格式调整2 EndNote X9 插入参考文献常见问题总结3 EndNote X9 快速上手教程 xff08 毕业论文参考文献管理器 xff09 1 参考文献附录列表 格式调整 注意 xff1a 这里讲的是对
  • EndNote X9 导入知网文献 插入引用文献 方法

    文章目录 1 EndNote X9 导入知网文献2 EndNote X9 插入参考文献常见问题总结3 EndNote X9 快速上手教程 xff08 毕业论文参考文献管理器 xff09 1 EndNote X9 导入知网文献 下载知网参考文
  • endNote X9 导入英文文献(谷歌学术、web of science 等)

    文章目录 1 导入英文文献 xff08 谷歌学术 web of science 等 xff09 2 EndNote X9 插入参考文献常见问题总结3 EndNote X9 快速上手教程 xff08 毕业论文参考文献管理器 xff09 1 导
  • endNote X9 增加 / 删除参考文献 文献编号自动更新

    文章目录 1 增插参考文献2 删减参考文献3 EndNote X9 插入参考文献常见问题总结4 EndNote X9 快速上手教程 xff08 毕业论文参考文献管理器 xff09 1 增插参考文献 61 61 61 61 61 61 61
  • windows10 通过vnc方式远程连接服务器

    以下摘抄至腾讯云文档 xff0c 记录一下 腾讯云 文档中心 轻量应用服务器 最佳实践 搭建Ubuntu可视化界面 VNC xff08 Virtual Network Console xff09 是虚拟网络控制台的缩写 它是一款优秀的远程控
  • UART串口接收设计

    一 设计思路 1 端口设置 为实现UART串口接收 xff0c 所设计的模块应具有如下端口 xff1a 时钟 复位 波特率设置 串行数据输入 并行数据输出 一次数据接收完成标志 如图 xff1a module span class toke
  • (十)性能分析工具的使用(上)

    性能分析工具的使用 1 数据库服务器的优化步骤2 查看系统性能参数3 统计SQL的查询成本 xff1a last query cost4 定位执行慢的 SQL xff1a 慢查询日志4 1 开启慢查询日志参数1 开启slow query l
  • uboot1.1.6/lowlevel.S详解

    TEXT BASE word TEXT BASE 这个TEXT BASE是在uboot1 1 6 board smdk2410 config mk内定义的 xff0c TEXT BASE 61 0x33F80000 config mk内有注
  • 杨辉三角(Pascal‘s Triangle)

    6 杨辉三角 xff08 Pascal 39 s Triangle xff09 1 每个数等于它上方两数之和 直角模式等于上方和左上方元素之和 2 每行数字左右对称 xff0c 由1开始逐渐变大 3 第一行有1个元素 xff0c 第n行有n
  • A*算法在matlab上的实现

    先看看算法的效果 图中蓝绿色大圆为障碍物 xff0c 蓝色小圆为路径节点 xff0c 红色号为目的地 xff0c 蓝色为起点 算法下载位置 xff1a https gitee com bingobinlw volans tree maste
  • 数学知识---数论(质数和约数)

    文章目录 1 质数1 1质数的判定 试除法1 2分解质因数 试除法 1 3筛质数2 约数2 1试除法求约数2 2约数个数2 3约数之和2 4最大公约数 欧几里得算法 xff08 辗转相除法 xff09 1 质数 质数是针对所有大于1的自然数
  • ccie入门学习day1

    写信的例子 Source Name Source address Destination Name Destination address 数据从源端A送达目的端B xff1a 网络地址 xff1a IP地址 网络当中的任何网络设备的标识符
  • OSI七层模型 端到端通信

    免费DNS 电信 xff1a 114 114 114 114 google xff1a 8 8 8 8 xff0c 4 4 2 2 阿里 百度 腾讯 数据的端到端通信 xff1a 1 封装 xff1a encapsulation 2 解封装
  • 常见安全事件

    一 钓鱼 xff1b 1 诱惑性标题 xff1b 2 仿冒真实网站 xff1b 3 骗取用户账号 xff1b 4 骗取用户资料 xff1b 篡改 网页 Tampering 关键字 xff1a Hacked by 搜索引擎语法 xff1a I
  • 局域网技术,涉及到VLAN,TRUNK,链路聚合,VLAN间路由,单臂路由,

    Ethernet xff1a 以太网 构建一个网络 xff08 迷你型 小型 中型 大型 巨型 xff09 集线器 xff08 hub xff09 xff1a 物理层的设备 xff0c 半双工通信 xff0c 泛洪 xff08 floodi
  • ACL 网安基础

    ACL xff1a access control list 访问控制列表 网络当中哪些流量可以通过 xff0c 哪些流量不能通过 xff0c 哪些用户可以登录 xff0c 哪些用户拒绝登录 permit 允许 deny 拒绝 flow co

随机推荐

  • SONiC-P4实验搭建及研究SONiC管理的交换机

    首先需建立在虚拟机上部署SONiC P4仿真环境 xff0c 关于部署SONiC P4 xff0c 详情可以参考https github com sonic net SONiC wiki SONiC P4 Software Switch x
  • Linux操作系统指令

    Linux简介 Linux xff0c 全称GNU Linux xff0c 是一种免费使用和自由传播的类UNIX操作系统 xff0c 其内核由林纳斯 本纳第克特 托瓦兹于1991年10月5日首次发布 xff0c 它主要受到Minix和Uni
  • ubuntu 10.04下的配置tftp服务器

    转载自 http www cnblogs com geneil archive 2011 11 24 2261653 html 第1步 xff1a 安装tftp所需的软件 首先需要安装tftp hpa xff0c tftpd hpa xff
  • 【每天学习一点新知识】如何绕过CDN查真实ip

    1 什么是CDN 为了防止流量过大网络堵塞 xff0c 我们就在靠近用户的地方 xff0c 建一个缓存服务器 xff0c 把远端的内容复制一份 xff0c 放在这里 xff0c 简单来说就是将内容缓存在终端用户附近 2 怎么绕过cdn找到远
  • hadoop集群启动后datanode没有启动

    今天启动hadoop集群后 xff0c 查看进程发现名称节点的NameNode进程启动了 xff0c 但是数据节点的DataNode进程没有启动 xff0c 如下 xff1a 这个问题是个常见问题 xff0c 对于自学的初学者来说 xff0
  • 局域网组网 实验7 MPLS VNP

    配置 xff1a AR1 xff1a interface GigabitEthernet0 0 0 ip address 10 1 2 1 255 255 255 0 interface GigabitEthernet0 0 1 inter
  • 数字逻辑电路(四)

    数字逻辑电路 xff08 四 xff09 目录 组合逻辑电路 1 组合逻辑电路的分析 设计 2 数值计算电路 3 编码器 4 译码器 编码的逆过程 5 数值比较器 6 数据选择器 7 组合逻辑电路分析 组合逻辑电路 1 组合逻辑电路的分析
  • 2020-10-27

    云计算是什么 1 水龙头观点论 xff1a 当需要的时候 xff0c 你别管水是怎么来的 xff0c 电是怎么发的 xff0c 扭开水龙头用水 xff0c 插上插头用电 xff0c 只需要操心交水电费就是了 xff01 当你需要用一个软件时
  • 2020-11-03

    云计算的服务类型 当今IT信息时代 xff0c 云计算激流勇进 xff0c 稳步发展都离不开云计算服务 云计算的服务类型有 1 SaaS 软件即服务 SaaS 软件即服务 xff0c 是指用户获取软件服务的一种新形式 它不需要用户将软件产品
  • 2020-11-03

    云计算五大特点 云计算 xff0c 是一种基于互联网的计算方式 xff0c 通过这种方式 xff0c 共享的软硬件资源和信息可以按需提供给计算机和其他设备 典型的云计算提供商往往提供通用的网络业务应用 xff0c 可以通过浏览器等软件或者其
  • 2020-11-17

    大数据的就业前景还是很不错的 大数据的价值体现在以下几个方面 xff1a xff08 1 xff09 对大量消费者提供产品或服务的企业可以利用大数据进行精准营销 xff1b xff08 2 xff09 做小而美模式的中小微企业可以利用大数据
  • 2020-11-25

    网格计算和云计算有相似之处 xff0c 特别是计算的并行与合作的特点 xff1b 但他们的区别也是明显的 主要有以下几点 xff1a 首先 xff0c 网格计算的思路是聚合分布资源 xff0c 支持虚拟组织 xff0c 提供高层次的服务 x
  • 2020-12-22

    云计算主要包含哪些关键技术 xff1f 1 虚拟化技术 xff1a 云计算的虚拟化技术不同于传统的单一虚拟化 xff0c 它是涵盖整个IT架构的 xff0c 包括资源 网络 应用和桌面在内的全系统虚拟化 xff0c 它的优势在于能够把所有硬
  • ubuntu nfs服务器设置-调试成功

    转载地址 xff1a http www cnblogs com doctorqbw archive 2012 02 03 2337411 html 1 安装nfs服务 xff0c apt get install nfs common nfs
  • 2020-12-28

    大数据发展必备三个条件 大数据概念的横空出世 xff0c 有赖于短短几年出现的海量数据 据统计 xff0c 互联网上的数据每两年翻一番 xff0c 而目前世界上90 以上的数据都是最近几年才产生的 当然 xff0c 海量数据仅仅是 大数据
  • Casbin

    Model Model语法 Model CONF 至少应包含四个部分 request definition policy definition policy effect matchers 如果 model 使用 RBAC 还需要添加 ro
  • STM32串口发送字符串

    在STM32串口学习中 xff0c 串口发送字符串是必不可少的 xff0c 但是 在学习过程中可能会遇到下面这个问题 xff0c 就由我来给大家分享一下吧 下面是封装的串口发送字符串的函数 xff1a void Usart SendStri
  • 树莓派4b安装Ubuntu20.04+ROS-noetic(也适用于历史版本)

    树莓派4b安装Ubuntu20 04 43 ros noetic 前言一 镜像下载二 烧录系统1 插入tf卡 xff0c 首先对tf卡进行格式化2 烧录镜像方法1 官方烧录软件 Raspberry Pi Imager方法2 Win32Dis
  • vscode 项目中安装配置webpack及其插件

    1 安装webpack 在终端运行如下的命令 xff0c 安装webpack相关的两个包 xff1a npm install webpack 64 5 42 1 webpack cli 64 4 7 2 D D表示 xff1a npm安装完
  • 【02】FreeRTOS获取10.4.6源码+移植到STM32F429步骤

    目录 1 获取FreeRTOS源码 1 1 FreeRTOS官网下载步骤 1 2FreeRTOS源码内容 1 3FreeRTOS内核文件 1 3 1Demo文件夹 1 3 2Source文件夹 2 FreeRTOS移植 2 1添加FreeR