FreeRTOS学习篇一:STM32F103C8T6下的移植,基于Keil、IAR开发环境

FreeRTOS学习篇一:STM32F103C8T6下的移植与基于Keil、IAR开发环境

0.资源

2023-9-12 更新,分享资源文件:
STM32F103C8标准库的源文件,FreeRTOS V9.0.0版本源文件,标准库提取文件(IAR、Keil下),FreeRTOS提取文件(IAR、Keil下):
链接:https://pan.baidu.com/s/1X0tO9DeLZ7tJTpsvtgz-Qw?pwd=3333
提取码:3333
在这里插入图片描述

1.源码下载

FreeRTOS的源代码托管网址:FreeRTOS Real Time Kernel (RTOS) - Browse /FreeRTOS at SourceForge.net

进入到源代码托管网站,找到需要的版本进行下载 —— 下载V9.0.0版本,即下载FreeRTOSv9.0.0.zip文件。
在这里插入图片描述
V10版本相比于V9就是加入了一些物联网相关的组件,内核基本不变。

2.文件结构

解压下载好的FreeRTOSv9.0.0.zip文件后的目录结构如下:
在这里插入图片描述
进入FreeRTOS目录,重点关注里面的Demo目录、Source目录:

  • Demo目录:FreeRTOS 官方为各个单片机平台移植好的工程代码,一些评估板的完整的工程文件等,里面包含了不同开发平台、不同芯片的工程文件,可以参考这些文件来进行移植、开发。
  • Source目录:里面存放着内核源代码,要移植的文件就在这里面。
    Source目录:
    在这里插入图片描述
    portable目录里,主要了解这几个目录即可:Keil、IAR和RVDS。

其它参考资料:

  • Keil目录和RVDS目录:两个目录内的文件是一样的,都是Keil下用的,因此官方只将文件放在了RVDS目录里。RVDS 目录里包含了各种处理器相关的文件目录,根据目录名称可以指定是哪个内核(STM32的M0、M3、M4等内核)的支持文件,里面提供了 cortex-m0、m3、m4 和 m7 等内核的单片机的接口文件。RVDS目录里的文件就是用来将FreeRTOS和MCU联系起来的接口文件。
  • IAR目录,IAR下的cortex-m0、m3、m4 和 m7 等内核的单片机的接口文件。
  • MemMang目录: 存放的是跟内存管理相关的,总共有五个 heap 文件以及一个 readme 说明文件,这五个 heap 文件在移植的时候必须使用一个,因为 FreeRTOS 在创建内核对象的时候使用的是动态分配内存,而这些动态内存分配的函数则在这几个文件里面实现,不同的分配算法会导致不同的效率与结果。(初学,选用heap_4.c即可)

FreeRTOS 是一个软件,单片机是一个硬件,FreeRTOS 要想运行在一个单片机上面,它们就必须关联在一起,如何关联?还是得通过写代码来关联,这部分关联的文件叫接口文件,通常由汇编和 C 联合编写。这些接口文件都是跟硬件密切相关的,不同的硬件接口文件是不一样的,但都大同小异。编写这些接口文件的过程我们就叫移植,移植的过程通常由 FreeRTOS 和 mcu 原厂的人来负责,移植好的这些接口文件就放在 RVDS 这个文件夹的目录下。FreeRTOS 为我们提供了 cortex-m0、m3、m4 和 m7 等内核的单片机的接口文件,只要 是使用了这些内核的 mcu 都可以使用里面的接口文件。

这里使用FreeRTOS,准确来说是使用官方的移植,而不是移植FreeRTOS到xxxMCU。

关于RVDS目录,以里面的ARM_CM3目录为例,里面只有“port.c”与“portmacro.h”两个文件:

  • port.c:里面的内容是由 FreeRTOS 官方的技术人员为 Cortex-M3 内核的处理器写的接口文件,里面核心的上下文切换代码是由汇编语言编写而成。
  • portmacro.h: 则是 port.c 文件对应的头文件,主要是一些数据类型和宏定义。

3.提取FreeRTOS的源码

百度百科:软件工程中,程序往往被视为有生命的机体,将源代码从一种环境下放到另一种环境下运行也可以称为移植。

将FreeRTOS移植到STM32F103C8T6下运行,需要提取的文件有以下三部分:

  • 一:include目录里的和Source目录下的直接子文件、portable目录中MemMang目录里的文件(通常使用里面的heap_4.c)。
  • 二:根据需要从portable的IAR、RVDS目录中提取文件。
  • 三:提取配置文件 —— FreeRTOSConfig.h文件,这时需要用到那个Demo里的文件了。

portable的IAR、RVDS目录及配置文件说明:
1、Keil下进行开发,就选择portable目录中RVDS目录下的文件。
在这里插入图片描述
2、在IAR下进行开发,就选择portable目录中的IAR目录下的文件。
在这里插入图片描述
3、提取 FreeRTOSConfig.h配置文件:点进去后就能找到FreeRTOSConfig.h文件了,如下图
在这里插入图片描述

提取=============>:

提取完成 —— Keil下:(我将源码放到了src文件夹里)
在这里插入图片描述
提取完成 —— IAR下:
在这里插入图片描述
基于STM32F103C8T6下的FreeRTOS源文件提取到这里就结束了。可以分别创建两个文件夹,一个用于存放在Keil下使用的(FreeRTOS_Keil),一个用于存放在IAR下使用的(FreeRTOS_IAR)。

4.提取STM32F1标准库

1、STM32F1固件库下载:STM32标准外设软件库 - 意法半导体STMicroelectronics,下载3.5.0版本。
在这里插入图片描述
2、解压 —— STM32F10x_StdPeriph_Lib_V3.5.0,关注Libraries和Project就可以了:
在这里插入图片描述
3、提取:

①先创建三个文件夹 —— StartStdLibraryUser,用于存放提取出来的文件。

②提取外设库文件,即Libraries目录中STM32F10x_StdPeriph_Driver文件夹里inc和src文件夹里的所有文件,将它们都复制出来放到新建的StdLibrary里即可:
在这里插入图片描述
③提取核心支持文件,即Libraries目录中CMSIS目录里的一些文件,在CMSIS目录中这几个目录里:

  • Libraries\CMSIS\CM3\CoreSupport:这里面的core_cm3.ccore_cm3.h,复制到Start目录。
  • Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup:这里是启动文件,在Keil下就使用arm目录里的启动文件,在IAR开发的话就使用iar目录里的文件;STM32F103C8T6,选择里面的startup_stm32f10x_md.s,复制到Start目录。
    在这里插入图片描述
  • Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x:将这里的stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h复制出来放到Start里。
  • 最终Start目录里的文件:
    在这里插入图片描述
    ④User文件夹,复制Project\STM32F10x_StdPeriph_Template中以下文件进去(红框内的,system_stm32f10x.c已经放到Start里了,不要再添加这个到User里):
    在这里插入图片描述
    ⑤如果在IAR下进行开发,除了第③步要使用iar目录里的启动文件外,还要Project\STM32F10x_StdPeriph_Template\EWARM中的以下文件:(创建一个Config目录来放置该文件)
    在这里插入图片描述
    提取完毕。

5.Keil下移植

1、将提取后的基于Keil平台的FreeRTOS文件、标准库文件都放进一个3.free-rtos_Keil目录里,再创建一个Hardware目录,用于放置自己创建的源代码文件,3.free-rtos_Keil目录内的目录如下:
在这里插入图片描述
2、打开Keil,点击Project → New μVision Project来新建Keil工程,工程保存目录为3.free-rtos_Keil目录,型号选择STM32F103C8,点击完成后弹出的一个包安装管理界面直接关闭即可。
在这里插入图片描述
3、项目里创建好组:
在这里插入图片描述
4、往组里添加好文件:
在这里插入图片描述
5、项目的C/C++编译设置:
①添加头文件包含路径:

点击Project ===> Options for Target ...,选中C/C++后找到Include Paths,然后点击Include Paths那行末尾的...按钮,然后在打开的页面中点击第一个New按钮后再点击出现的...按钮并选中工程目录下的Start目录,OKOK,添加完成。示意图如下:(点这个图标也是打开Options for Target ...

在这里插入图片描述
②添加宏USE_STDPERIPH_DRIVER
在这里插入图片描述
6、项目的Debug设置:
在这里插入图片描述
7、要修改一些文件:
①修改FreeRTOS配置文件,也就是在那个FreeRTOSConfig.h文件里更改:

/* 修改`FreeRTOSConfig.h`,在末尾的`#endif`前添加以下内容即可: */
#define xPortPendSVHandler 	PendSV_Handler
#define vPortSVCHandler 	SVC_Handler
#define xPortSysTickHandler	SysTick_Handler

②修改User组里的stm32f10x_it.c文件,将下面的内容注释掉:

/* 在stm32f10x_it.c文件中找到以下三个函数并注释掉即可 */
void SVC_Handler(void)
{
}
void PendSV_Handler(void)
{
}
void SysTick_Handler(void)
{
}

8、打开main.c,删除里面的所有代码,更改为以下代码用于测试:

#include "stm32f10x.h"                  // Device header

#include "FreeRTOS.h"
#include "task.h"
#include "portmacro.h"
/* 初始化GPIO口 */
static void led_init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/* 定义一个任务句柄 */
static TaskHandle_t led_task_handle = NULL;
/* 声明一个任务 */
static void led_task(void* arg);

int main(void) 
{
	led_init();
    /* 创建任务 */
	xTaskCreate(led_task, "led_task", 512, NULL, 2, &led_task_handle);
    /* 启动FreeRTOS的调度器 */
	vTaskStartScheduler();
	while(1);
}
/* 任务的实现 */
static void led_task(void* arg)
{
    while(1){
		GPIO_SetBits(GPIOC, GPIO_Pin_13);
		vTaskDelay(500); // 相对延时
		GPIO_ResetBits(GPIOC, GPIO_Pin_13);
		vTaskDelay(500);
    }
}

9、编译,烧录进STM32F103C8T6核心板:
在这里插入图片描述
10、最终现象:那个绿色的灯一闪一闪地亮(亮—灭—亮—灭-…)
在这里插入图片描述

6.IAR下移植

懒得整理了,不常用这个。有需要的就来催我一下…

2023-10-11 填坑

https://blog.csdn.net/weixin_45647341/article/details/133776481
IAR下移植FreeRTOS到STM32F103C8T6-CSDN博客

END
整理了一下笔记分享出来,希望可以帮助到首次接触FreeRTOS的小伙伴。

  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值