STM32F103移植FreeRTOS完整过程

前言

演示STM32F103移植FreeRTOS完整过程,文末提供移植好的完整工程和源码

1.下载源码

下载FreeRTOSv9.0.0.zip解压如下图,如果下载太慢,文末提供移植好的完整工程和源码
STM32F103移植FreeRTOS完整过程_第1张图片
只用关注第一个文件夹FreeRTOS中的内容
STM32F103移植FreeRTOS完整过程_第2张图片
Demo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。
Source是源文件。


2.拷贝源码

在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port
STM32F103移植FreeRTOS完整过程_第3张图片
将Source/include文件夹拷贝到FreeRTOS下

将Source中的C文件拷贝到FreeRTOS/src下
STM32F103移植FreeRTOS完整过程_第4张图片

将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,

其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。
STM32F103移植FreeRTOS完整过程_第5张图片

3.添加到工程

STM32F103移植FreeRTOS完整过程_第6张图片
新建FreeRTOS/src和FreeRTOS/port组

FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加

FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和

FreeRTOS\port\RVDS\ARM_CM3中的port.c


添加头文件路径
STM32F103移植FreeRTOS完整过程_第7张图片
拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程


4.修改配置

在FreeRTOSConfig.h中添加

#define xPortPendSVHandler 	PendSV_Handler
#define vPortSVCHandler 	SVC_Handler

在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断

最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。

/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
*/
extern void xPortSysTickHandler(void);
void SysTick_Handler(void)
{
    #if (INCLUDE_xTaskGetSchedulerState  == 1 )
      if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
      {
    #endif  /* INCLUDE_xTaskGetSchedulerState */  
        xPortSysTickHandler();
    #if (INCLUDE_xTaskGetSchedulerState  == 1 )
      }
    #endif  /* INCLUDE_xTaskGetSchedulerState */
}


5.验证demo

#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"
#include "portmacro.h"
#include "bsp_led.h"  
#include "log.h"

static TaskHandle_t led_task_handle = NULL;

void led_task(void *arg)
{
	while(1)                            
	{
		led_status_set(LED_STATUS_ON);
		LOG_DEBUG("LED_STATUS_ON\r\n");
		vTaskDelay(500/portTICK_PERIOD_MS);
		led_status_set(LED_STATUS_OFF);
		LOG_DEBUG("LED_STATUS_OFF\r\n");
		vTaskDelay(500/portTICK_PERIOD_MS);
	}
}

int main(void)
{
	led_init();

	xTaskCreate(led_task, "led_task", 1024, NULL, 20, &led_task_handle);

	// 开启调度
	vTaskStartScheduler();
	while(1);
}


6.完整工程

亲测可用,完整工程地址。
STM32F103移植FreeRTOS完整过程_第8张图片

你可能感兴趣的:(物联网,单片机,freertos,stm32,单片机,arm,freertos)