[应用相关]

移植FreeRTOS到现有工程的方法(转载)

[复制链接]
835|18
手机看帖
扫描二维码
随时随地手机跟帖
木木guainv|  楼主 | 2019-6-18 13:37 | 显示全部楼层 |阅读模式

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

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


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:38 | 显示全部楼层

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Fpbmd3dWZlaXlhbmcxMjM0Ng==,size_16,color_FFFFFF,t_70.jpg


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:38 | 显示全部楼层

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

2018112100292253.jpg


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:38 | 显示全部楼层

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

20181121003058536.jpg


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:39 | 显示全部楼层

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Fpbmd3dWZlaXlhbmcxMjM0Ng==,size_16,color_FFFFFF,t_70.jpg


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:39 | 显示全部楼层

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Fpbmd3dWZlaXlhbmcxMjM0Ng==,size_16,color_FFFFFF,t_70.jpg


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:39 | 显示全部楼层

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Fpbmd3dWZlaXlhbmcxMjM0Ng==,size_16,color_FFFFFF,t_70.jpg


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:39 | 显示全部楼层

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Fpbmd3dWZlaXlhbmcxMjM0Ng==,size_16,color_FFFFFF,t_70.jpg


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:40 | 显示全部楼层

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Fpbmd3dWZlaXlhbmcxMjM0Ng==,size_16,color_FFFFFF,t_70.jpg

20181121004458761.jpg


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:40 | 显示全部楼层

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

20181121004654167.jpg


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:40 | 显示全部楼层
11、至此,可以对2_bsp工程进行正确编译。

使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:41 | 显示全部楼层

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Fpbmd3dWZlaXlhbmcxMjM0Ng==,size_16,color_FFFFFF,t_70.jpg


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:41 | 显示全部楼层
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);


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:41 | 显示全部楼层
14、在main.cpp中添加,定时器变量的定义

extern TIM_HandleTypeDef htim1;


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:42 | 显示全部楼层
15、在main.cpp中,添加定时器的中断服务处理函数

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


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:42 | 显示全部楼层
16、在main.cpp中,添加任务的声明

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


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:42 | 显示全部楼层
17、在main.cpp的main函数中,添加任务建立和操作系统调度函数。

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



使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:43 | 显示全部楼层
18、在main.cpp中添加缺省任务的逻辑实现。

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


使用特权

评论回复
木木guainv|  楼主 | 2019-6-18 13:43 | 显示全部楼层
19、到此,对程序进行正确的编译,然后将程序下载到单片机中,应能够看到L1以1秒为间隔闪烁。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

3820

帖子

5

粉丝