STM32F0开发笔记13: 移植FreeRTOS到现有工程的方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingwufeiyang12346/article/details/84312417

本文详细介绍移植FreeRTOS到现有工程的方法。

1、现有工程的目录结构如下图所示,bsp是STM32固有的驱动库,PSP是自定义的设备驱动,APP是逻辑层。

2、复制FreeRTOS文件夹到自己的工程目录,如下图所示。

3、复制FreeRTOSConfig.h文件到Inc文件夹

4、复制freertos.c和stm32f0xx_hal_timebase_TIM.c文件到src_3_app文件夹。

5、按照下列目录结构加入FreeRTOS的源文件。

6、更改3个工程项目的包含文件路径,如下图所示。

7、去除1_bsp工程的CPP11编译选项,如下图所示。

8、至此,1_bsp应能够正确编译了,编译结果如下图所示。

9、打开2_bsp工程的include.h文件,加入对“cmsis_os.h”的包含语句。

10、打开target.cpp头文件,屏蔽SVC_Handler和PendSV_Handler函数,在SysTick_Handler函数中加入osSystickHandler()中断调用。

11、至此,可以对2_bsp工程进行正确编译。

12、在3_app工程中加入freertos.c和stm32f0xx_hal_timebase_TIM.c文件。

13、在stm32f0xx_it.h中添加定时其的中断函数声明。

void NMI_Handler(void);
void HardFault_Handler(void);
void SVC_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void TIM16_IRQHandler(void);
void USART1_IRQHandler(void);
void USART2_IRQHandler(void);
void TIM1_BRK_UP_TRG_COM_IRQHandler(void);

14、在main.cpp中添加,定时器变量的定义

extern TIM_HandleTypeDef htim1;

15、在main.cpp中,添加定时器的中断服务处理函数

void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&htim1);
}

16、在main.cpp中,添加任务的声明

osThreadId defaultTaskHandle;
void StartDefaultTask(void const * argument);

17、在main.cpp的main函数中,添加任务建立和操作系统调度函数。

osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
	
osKernelStart();

18、在main.cpp中添加缺省任务的逻辑实现。

void StartDefaultTask(void const * argument)
{
    for(;;)
    {
        Target.HAL.L1.Open();
        osDelay(1000);
        Target.HAL.L1.Shut();
        osDelay(1000);
    }
}

19、到此,对程序进行正确的编译,然后将程序下载到单片机中,应能够看到L1以1秒为间隔闪烁。

 

 

原创性文章,转载请注明出处
CSDN:http://blog.csdn.net/qingwufeiyang12346

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qingwufeiyang12346/article/details/84312417