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

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

**

FreeROTS源码获取及基于Stm32移植

**

获取源码

其实找资料没有那么复杂,官网就是最好的地方了,FreeRTOS的官网是.FreeRTOS官网,当然了,这个网站是全英文的,不过没关系,我们可以简单了解一下。如下图:

20190331184420157.png

在这个网页里点击左侧导航栏中的“Quick Start”,就是介绍如何快速上手FreeRTOS,这个大家可以看一下,对这个有个了解。这里导航栏中有一个"Suppotred MCUs"可以查看FreeRTOS所支持的MCU,打开后如图所示。20190331184812643.png

从这里就根据我们所使用的MCU型号可以找到官方已经制作好的FreeRTOS移植方法及demo可以参考。这里还有很多相关资料,大家可以详细了解。

点击官网标题下的Download可以去下载我们今天需要的FreeRTOS源码。进入下面的页面点击下载就能够下载了

在这里插入图片描述

20190331185711208.png

20190331185811654.png

下载下来后双击打开,点击“Extract”就能够自动下载FreeRTOS源码,下载过程如下。

2019033119000250.png

20190331190026925.png

下载完成后下载器会自动关闭,这个时候打开刚刚设置的下载路径查看会看到源码已经下载好了,文件分布如下。

20190331190229413.png

FreeRTOS文件夹中有三个文件夹,Demo、License、Source,从文件名可以知道他们都是什么。其中Source自然就是我们需要的源码了。可以看出,相比于UCOS,FreeRTOS的文件非常少,include文件夹是一些头文件,移植的时候需要,其他的.c文件就是源码文件,肯定也是需要的。

这里面有个portable文件夹,这里面的东西就是FreeRTOS系统和具体的硬件直接的连接库,也就是不同的编译环境针对不同的portable文件夹。

到这里我们已经把FreeRTOS系统的源码下载准备好了,接下来就是正式进行移植建立工程了。


针对Keil工程移植FreeRTOS


准备基础工程


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

FreeRTOS移植


向工程中添加相应文件代码

1)添加FreeRTOS源码

在基础工程下新建一个FreeRTOS的文件夹,如下:

20190331191349285.png

将之前下载好的FreeRTOS的源码都复制到这个文件夹中。


20190331191442664.png

其中portable文件夹中,只需要留下keil、MemMang和RVDS这三个文件夹,其他都删掉。

然后打开keil工程,想工程目录新建分组并添加文件。如下

20190331191714817.png

新建分组FreeRTOS_CORE和FreeRTOS_PORTABLE,并添加文件后,设置添加相应的头文件路径。

20190331191905155.png

添加完头文件后可以编译一下,这时候会提示打不开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);
}



修改完成后编译一下,发现会有重复定义的函数错误。

20190331194823386.png

将这三个函数在stm32f10x_it.c中注释掉就好了。

烧写验证

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

相关文章
|
9月前
|
存储 编译器 C语言
STM32开发 -- Keil基本使用
STM32开发 -- Keil基本使用
360 0
|
6天前
|
传感器 数据采集 人工智能
【STM32+k210项目】基于AI技术智能语音台灯的设计(完整工程资料源码)
【STM32+k210项目】基于AI技术智能语音台灯的设计(完整工程资料源码)
24 1
|
6天前
|
存储 算法 测试技术
【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)(二)
【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)(二)
11 0
|
6天前
|
存储 搜索推荐 安全
【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)(一)
【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)(一)
16 0
|
29天前
|
存储 安全 芯片
STM32单片机实现Bootloader跳转的关键步骤
STM32单片机实现Bootloader跳转的关键步骤
75 0
|
8月前
|
API 芯片
嵌入式 STM32 实现STemwin移植+修改其配置文件,驱动LCD显示文本 (含源码,建议收藏)
嵌入式 STM32 实现STemwin移植+修改其配置文件,驱动LCD显示文本 (含源码,建议收藏)
|
11月前
STM32 Keil工程中使用abs函数报警告 warning: #223-D: function "abs" declared implicitly
STM32 Keil工程中使用abs函数报警告 warning: #223-D: function "abs" declared implicitly
598 0
|
C++
STM32bug【 KEIL安装新版本后编译出现无法打开 core_cm3.h 问题 】
STM32bug【 KEIL安装新版本后编译出现无法打开 core_cm3.h 问题 】
402 0
STM32最小系统使用FlyMcu烧写步骤
使用的是FlyMcu操作软件,首先搜索串口,点击搜索到之后选择,三个点选择即将要烧录的hex文件,找到STMISP,选择校验与编程后执行,将BOOT0置1(跳线帽变动),BOOT1不用管,下面选择DTR的低电平复位,RTS高电平进BootLoader,然后点击开始编程,如果软件无动作,可以按一下单片机上的按键,编程结束之后,将BOOT0置0。然后再按一下单片机中的按键及即可运行新程序了。
948 0
STM32最小系统使用FlyMcu烧写步骤
|
安全 芯片
STM32在keil下开发时候文件options配置的一些小技巧
STM32在keil下开发时候文件options配置的一些小技巧
232 1
STM32在keil下开发时候文件options配置的一些小技巧