FreeRTOS移植(STM32F103C8T6)

一、获取源码

官网下载

官网地址:https://www.freertos.org

二、下载完解压

三、获取需要移植的文件

点来FreeRTOS文件夹,只需要看Source

 1.打开Source文件夹

 include文件夹 :包含了一些我们需要移植的头文件

portable文件夹:包含一些适配不同内核的东西,我们需要用到以下框选的文件

 内存管理选择移植 heap_4.c 

 内核管理选择移植 CM3内核的文件 

2.找到 FreeRTOSConfig.h     配置文件

 

 四、打开一个keil工程

1、创建group,添加相应的文件,添加头文件路径

2、修改相关用到的FreeRTOS的配置和中断

1)系统配置文件修改

FreeRTOSConfig.h 中添加如下3个配置:

#define xPortPendSVHandler 	PendSV_Handler
#define vPortSVCHandler 	SVC_Handler
#define INCLUDE_xTaskGetSchedulerState  1

 2)修改 stm32f1xx_it.c 文件

1.引入头文件

2.注释掉2个中断函数(由于 FreeRTOS 已经实现了)

3.将 Systick_Handler 中断和 FreeRTOS关联起来

extern void xPortSysTickHandler(void);
  
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
  {
    xPortSysTickHandler();
  }

 五、移植完成

关于Systick 可能会出现的问题:系统时钟HAL和FreeRTOS共同使用systick?

void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();    //hal库的时间函数依赖这个
  /* USER CODE BEGIN SysTick_IRQn 1 */
  if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
  {
    xPortSysTickHandler();    //freertos依赖这个函数
  }
  /* USER CODE END SysTick_IRQn 1 */
}

FreeRTOS有些地方会屏蔽中断,造成 delay 不准--》出现这种情况时 可以将 Sys 配置的 Timebase Source 由原来默认的 Systick 改为其他 TIM(定时器)!!!

六、测试工程

1.main.c中简单创建两个任务

//1.包含头文件
/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"	
//2.任务相关
static TaskHandle_t AppTaskCreate_Handle;/* 创建任务句柄 */
static TaskHandle_t LED_Task_Handle;	   /* LED任务句柄 */
static void AppTaskCreate(void);         /* 用于创建任务 */
static void LED_Task(void* pvParameters);/* LED_Task任务实现 */

int main(void)
{
  HAL_Init();

  BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
  /* 配置优先级分组为4 */
	HAL_NVIC_SetPriorityGrouping( NVIC_PRIORITYGROUP_4 );
  /* Configure the system clock */
  SystemClock_Config();
  /* Initialize all configured peripherals */
  LED_GPIO_Config();
  /* 创建 AppTaskCreate 任务 */
  xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,  /* 任务入口函数 */
                        (const char*    )"AppTaskCreate",/* 任务名字 */
                        (uint16_t       )128,  /* 任务栈大小 */
                        (void*          )NULL,/* 任务入口函数参数 */
                        (UBaseType_t    )1, /* 任务的优先级 */
                        (TaskHandle_t*  )&AppTaskCreate_Handle);/* 任务控制块指针 */ 
  if(pdFAIL != xReturn)/* 创建成功 */
    vTaskStartScheduler();   /* 启动任务,开启调度 */

  while (1)
  {

  }
  /* USER CODE END 3 */
}

2.实现两个任务

/***********************************************************************
  * @ 函数名  : AppTaskCreate
  * @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面
  * @ 参数    : 无  
  * @ 返回值  : 无
  **********************************************************************/
static void AppTaskCreate(void)
{
  BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
  taskENTER_CRITICAL();           //进入临界区

  /* 创建LED_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )LED_Task, /* 任务入口函数 */
                        (const char*    )"LED_Task",/* 任务名字 */
                        (uint16_t       )512,   /* 任务栈大小 */
                        (void*          )NULL,	/* 任务入口函数参数 */
                        (UBaseType_t    )2,	    /* 任务的优先级 */
                        (TaskHandle_t*  )&LED_Task_Handle);/* 任务控制块指针 */
	if(pdFAIL != xReturn)/* 创建成功 */
  {
    //...
  }
  vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
  
  taskEXIT_CRITICAL();            //退出临界区
}

/**********************************************************************
  * @ 函数名  : LED_Task
  * @ 功能说明: LED_Task任务主体
  * @ 参数    :   
  * @ 返回值  : 无
  ********************************************************************/
static void LED_Task(void* parameter)
{	
    while (1)
    {
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
        vTaskDelay(500);   /* 延时500个tick */
        
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);  
        vTaskDelay(500);   /* 延时500个tick */		 		
    }
}

3.编译烧入程序,可以看到 LED(PC13) 按指定的delay 闪烁!!!

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeRTOS移植STM32F103C8T6微控制器上需要一些步骤。下面是大致的移植指南: 1. 了解STM32F103C8T的硬件资源和特性:包括内核、外设、时钟等。这将帮助你适配FreeRTOS到特定的硬件平台上。 2. 准备开发环境:安装适当的集成开发环境(IDE)和编译器,例如Keil MDK、IAR Embedded Workbench等。确保你能够成功编译和烧录STM32F103C8T6芯片。 3. 下载和配置FreeRTOS:从FreeRTOS官方网站下载最新的FreeRTOS源代码,并解压到你的项目目录中。在源代码中,你可以找到针对不同处理器架构的移植文件夹,如ARM Cortex-M3。 4. 配置FreeRTOS:根据STM32F103C8T6的硬件特性,修改FreeRTOS配置文件(FreeRTOSConfig.h)以适配你的系统。这包括调整任务堆栈大小、优先级和其他配置参数。 5. 创建启动文件:根据你的编译器和开发环境,创建适当的启动文件(startup.s或startup_stm32f10x_md.s)并配置启动向量表、堆栈设置等。 6. 编写硬件相关的启动代码:根据STM32F103C8T6的特性,编写硬件初始化和启动代码,例如初始化系统时钟、外设等。 7. 编写FreeRTOS任务:根据你的应用需求,编写FreeRTOS任务代码,并使用FreeRTOS提供的API创建和管理任务。你可以利用STM32F103C8T6的外设和中断来实现任务间的通信和同步。 8. 编译和烧录:使用你的编译器编译项目,并将生成的可执行文件烧录到STM32F103C8T6芯片上。 以上是一个大致的移植流程。具体的步骤可能因开发环境和需求而有所不同。在进行移植之前,建议先阅读FreeRTOS的官方文档,了解更多关于移植和配置的详细信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值