STM32-FreeRTOS源码下载及移植步骤(基于Keil)

**

FreeROTS源码获取及基于Stm32移植

**

获取源码

其实找资料没有那么复杂,官网就是最好的地方了,FreeRTOS的官网是.FreeRTOS官网,当然了,这个网站是全英文的,不过没关系,我们可以简单了解一下。如下图:
FreeRTOS官网
在这个网页里点击左侧导航栏中的“Quick Start”,就是介绍如何快速上手FreeRTOS,这个大家可以看一下,对这个有个了解。这里导航栏中有一个"Suppotred MCUs"可以查看FreeRTOS所支持的MCU,打开后如图所示。
在这里插入图片描述
从这里就根据我们所使用的MCU型号可以找到官方已经制作好的FreeRTOS移植方法及demo可以参考。这里还有很多相关资料,大家可以详细了解。
点击官网标题下的Download可以去下载我们今天需要的FreeRTOS源码。进入下面的页面点击下载就能够下载了
在这里插入图片描述

下载页面在这里插入图片描述
下载下来后双击打开,点击“Extract”就能够自动下载FreeRTOS源码,下载过程如下。
打开源码下载器
源码下载
下载完成后下载器会自动关闭,这个时候打开刚刚设置的下载路径查看会看到源码已经下载好了,文件分布如下。
文件分布
FreeRTOS文件夹中有三个文件夹,Demo、License、Source,从文件名可以知道他们都是什么。其中Source自然就是我们需要的源码了。可以看出,相比于UCOS,FreeRTOS的文件非常少,include文件夹是一些头文件,移植的时候需要,其他的.c文件就是源码文件,肯定也是需要的。
这里面有个portable文件夹,这里面的东西就是FreeRTOS系统和具体的硬件直接的连接库,也就是不同的编译环境针对不同的portable文件夹。
到这里我们已经把FreeRTOS系统的源码下载准备好了,接下来就是正式进行移植建立工程了。

针对Keil工程移植FreeRTOS

准备基础工程

  • 要移植FreeRTOS肯定需要一个基础工程,这个基础工程之前我们已经介绍过了,在此就不多说了。

FreeRTOS移植

  • 向工程中添加相应文件代码
    1)添加FreeRTOS源码
    在基础工程下新建一个FreeRTOS的文件夹,如下:

在这里插入图片描述
将之前下载好的FreeRTOS的源码都复制到这个文件夹中。
添加源码
其中portable文件夹中,只需要留下keil、MemMang和RVDS这三个文件夹,其他都删掉。
然后打开keil工程,想工程目录新建分组并添加文件。如下
添加文件
新建分组FreeRTOS_CORE和FreeRTOS_PORTABLE,并添加文件后,设置添加相应的头文件路径。
添加头文件
添加完头文件后可以编译一下,这时候会提示打不开FreeRTOSConfig.h这个文件,这是因为缺少这个文件,这个文件也就是FreeRTOS的配置文件,可以自己创建,也可以从FreeRTOS官方移植工程的Demo文件夹中找到相应的配置文件,这里我们采用第二种方法找到对于芯片的配置文件,添加过来。为了方便,放到了FreeRTOS\include文件夹下,这时候再编译一次,一般情况下可能会发送跟之前的基础工程重定义的一些函数,我们把之前的重定义的函数注释掉就好了。

** 修改SYSTEM文件**

  • 修改sys.h文件
    将宏SYSTEM_SUPPORT_OS改为1就可以了。
  • 修改usart.c文件
    这个文件主要两处地方,一个是头文件需要包含FreeRTOS.h,还有就是中断服务函数,与UCOS中断服务函数不同,FreeRTOS中断不需要OSIntEnter和OSIntExit这两个函数的调用,所以需要注意。
  • 修改delay.c文件
    这个文件的改动比较大,因为涉及到FreeRTOS的系统时钟,delay.c文件中的四个函数,首先是SysTick_Handler,这个函数是滴答定时器的中断服务函数,代码如下:
void SysTick_Handler(void)
{	
    if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
    {
        xPortSysTickHandler();	
    }
}
FreeRTOS的心跳是由滴答定时器产生的,根据FreeRTOS的系统时钟节拍设置好滴答定时器的周期,这样就会周期触发滴答定时器中断了。在滴答定时器中断服务函数中调用FreeRTOS的API   xPortSysTickHandler();
delay_init()是用来初始化滴答定时器和延时函数,代码如下:
void delay_init()
{
	u32 reload;
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟  HCLK
	fac_us=SystemCoreClock/1000000;				//不论是否使用OS,fac_us都需要使用
	reload=SystemCoreClock/1000000;				//每秒钟的计数次数 单位为M  
	reload*=1000000/configTICK_RATE_HZ;			//根据configTICK_RATE_HZ设定溢出时间
												//reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右	
	fac_ms=1000/configTICK_RATE_HZ;				//代表OS可以延时的最少单位	   

	SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;   	//开启SYSTICK中断
	SysTick->LOAD=reload; 						//每1/configTICK_RATE_HZ秒中断一次	
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;   	//开启SYSTICK    
}

之前滴答定时器的时钟频率设置是AHB的1/8,这里为了兼容FreeRTOS将滴答定时器的时钟频率改成了AHB,也就是72MHz,接下来三个函数都是延时的,代码如下:

void delay_us(u32 nus)
{		
	u32 ticks;
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;				//LOAD的值	    	 
	ticks=nus*fac_us; 						//需要的节拍数 
	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;			//时间超过/等于要延迟的时间,则退出.
		}  
	};										    
}  
//延时nms
//nms:要延时的ms数
//nms:0~65535
void delay_ms(u32 nms)
{	
	if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
	{		
		if(nms>=fac_ms)						//延时的时间大于OS的最少时间周期 
		{ 
   			vTaskDelay(nms/fac_ms);	 		//FreeRTOS延时
		}
		nms%=fac_ms;						//OS已经无法提供这么小的延时了,采用普通方式延时    
	}
	delay_us((u32)(nms*1000));				//普通方式延时
}

//延时nms,不会引起任务调度
//nms:要延时的ms数
void delay_xms(u32 nms)
{
	u32 i;
	for(i=0;i<nms;i++) delay_us(1000);
}

修改完成后编译一下,发现会有重复定义的函数错误。
错误提示
将这三个函数在stm32f10x_it.c中注释掉就好了。

烧写验证

这里已经能够编译成功了,我们通过keil或者串口烧写工具烧写到板子上就可以完成FreeRTOS在STM32上的移植了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值