打印
[应用相关]

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

[复制链接]
1052|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

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

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


使用特权

评论回复
沙发
木木guainv|  楼主 | 2019-6-18 13:38 | 只看该作者

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


使用特权

评论回复
板凳
木木guainv|  楼主 | 2019-6-18 13:38 | 只看该作者

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


使用特权

评论回复
地板
木木guainv|  楼主 | 2019-6-18 13:38 | 只看该作者

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


使用特权

评论回复
5
木木guainv|  楼主 | 2019-6-18 13:39 | 只看该作者

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


使用特权

评论回复
6
木木guainv|  楼主 | 2019-6-18 13:39 | 只看该作者

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


使用特权

评论回复
7
木木guainv|  楼主 | 2019-6-18 13:39 | 只看该作者

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


使用特权

评论回复
8
木木guainv|  楼主 | 2019-6-18 13:39 | 只看该作者

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


使用特权

评论回复
9
木木guainv|  楼主 | 2019-6-18 13:40 | 只看该作者

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


使用特权

评论回复
10
木木guainv|  楼主 | 2019-6-18 13:40 | 只看该作者

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


使用特权

评论回复
11
木木guainv|  楼主 | 2019-6-18 13:40 | 只看该作者
11、至此,可以对2_bsp工程进行正确编译。

使用特权

评论回复
12
木木guainv|  楼主 | 2019-6-18 13:41 | 只看该作者

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


使用特权

评论回复
13
木木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);


使用特权

评论回复
14
木木guainv|  楼主 | 2019-6-18 13:41 | 只看该作者
14、在main.cpp中添加,定时器变量的定义

extern TIM_HandleTypeDef htim1;


使用特权

评论回复
15
木木guainv|  楼主 | 2019-6-18 13:42 | 只看该作者
15、在main.cpp中,添加定时器的中断服务处理函数

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


使用特权

评论回复
16
木木guainv|  楼主 | 2019-6-18 13:42 | 只看该作者
16、在main.cpp中,添加任务的声明

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


使用特权

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

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



使用特权

评论回复
18
木木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);
    }
}


使用特权

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

使用特权

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

本版积分规则

148

主题

4100

帖子

5

粉丝