发新帖我要提问
12
返回列表
打印
[其他ST产品]

FreeRTOS移植到STM32

[复制链接]
楼主: lvuu
手机看帖
扫描二维码
随时随地手机跟帖
21
lvuu|  楼主 | 2022-12-31 20:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
F4系列就拷贝port\RVDS\ARM_CM4,然后我们将工程文件中 FreeRTOS 的内容添加到工程中去,按照已经新建的分组添加 我们的 FreeRTOS 工程源码。 在 FreeRTOS/port 分组中添加 MemMang 文件夹中的文件只需选择其中一个即可,我 们选择“heap_4.c”,这是 FreeRTOS 的一个内存管理源码文件。同时,需要根据自己的开 发板型号在 FreeRTOS\port\RVDS\ARM_CM?中选择,“?”表示 3、4 或者 7,具体选择 哪个得看你使用的是哪个型号的 STM32 开发板。

使用特权

评论回复
22
lvuu|  楼主 | 2022-12-31 20:51 | 只看该作者

使用特权

评论回复
23
lvuu|  楼主 | 2022-12-31 20:51 | 只看该作者

然后在 user 分组中添加我们 FreeRTOS 的配置文件“FreeRTOSConfig.h”,因为这是 头文件(.h),所以需要在添加时选择文件类型为“All files (*.*)”,至此我们的 FreeRTOS 添加到工程中就已经完成,效果图如下

使用特权

评论回复
24
lvuu|  楼主 | 2022-12-31 20:53 | 只看该作者
指定 FreeRTOS 头文件的路径

这一步不过多解释,用过STM32的人都知道

使用特权

评论回复
25
lvuu|  楼主 | 2022-12-31 20:54 | 只看该作者
FreeRTOSConfig.h 文件修改

       FreeRTOSConfig.h 头文件的内容修改的不多,具体是:修改与对应开发板的头文件 , 如果是使用野火 STM32F1 的开发板,则包含 F1 的头文件#include "stm32f10x.h",同理是 使用了其它系列的开发板,则包含与开发板对应的头文件即可,当然还需要包含我们的串 口的头文件“bsp_usart.h”,因为在我们 FreeRTOSConfig.h 中实现了断言操作,需要打印 一些信息。其他根据需求修改即可,

使用特权

评论回复
26
lvuu|  楼主 | 2022-12-31 20:55 | 只看该作者
修改 stm32f10x_it.

SysTick 中断服务函数是一个非常重要的函数,FreeRTOS 所有跟时间相关的事情都在 里面处理,SysTick 就是 FreeRTOS 的一个心跳时钟,驱动着 FreeRTOS 的运行,就像人的 心跳一样,假如没有心跳,我们就相当于“死了”,同样的,FreeRTOS 没有了心跳,那么 它就会卡死在某个地方,不能进行任务调度,不能运行任何的东西,因此我们需要实现一 个 FreeRTOS 的心跳时钟,FreeRTOS 帮我们实现了 SysTick 的启动的配置:在 port.c 文件 中已经实现 vPortSetupTimerInterrupt()函数,并且 FreeRTOS 通用的 SysTick 中断服务函数 也实现了:在 port.c 文件中已经实现

使用特权

评论回复
27
lvuu|  楼主 | 2022-12-31 20:56 | 只看该作者
xPortSysTickHandler()函数,所以移植的时候只需要我 们在 stm32f10x_it.c 文件中实现我们对应(STM32)平台上的 SysTick_Handler()函数即可。 FreeRTOS 为开发者考虑得特别多,PendSV_Handler()与 SVC_Handler()这两个很重要的函 数都帮我们实现了,在 port.c 文件中已经实现 xPortPendSVHandler()与 vPortSVCHandler() 函数,防止我们自己实现不了,那么在 stm32f10x_it.c 中就需要我们注释掉 PendSV_Handler()与 SVC_Handler()这两个函数了,具体看一下代码

使用特权

评论回复
28
lvuu|  楼主 | 2022-12-31 21:02 | 只看该作者
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
#include "FreeRTOS.h"                                        //FreeRTOS使用                  
#include "task.h"
/** @addtogroup STM32F10x_StdPeriph_Template
  * @{
  */
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
/*            Cortex-M3 Processor Exceptions Handlers                         */
/******************************************************************************/
/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  This function handles NMI exception.
  * @param  None
  * @retval None
  */
void NMI_Handler(void)
{
}

/**
  * @brief  This function handles Hard Fault exception.
  * @param  None
  * @retval None
  */
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}
/**
  * @brief  This function handles Memory Manage exception.
  * @param  None
  * @retval None
  */
void MemManage_Handler(void)
{
  /* Go to infinite loop when Memory Manage exception occurs */
  while (1)
  {
  }
}
/**
  * @brief  This function handles Bus Fault exception.
  * @param  None
  * @retval None
  */
void BusFault_Handler(void)
{
  /* Go to infinite loop when Bus Fault exception occurs */
  while (1)
  {
  }
}
/**
  * @brief  This function handles Usage Fault exception.
  * @param  None
  * @retval None
  */
void UsageFault_Handler(void)
{
  /* Go to infinite loop when Usage Fault exception occurs */
  while (1)
  {
  }
}
/**
  * @brief  This function handles SVCall exception.
  * @param  None
  * @retval None
  */
//void SVC_Handler(void)
//{
//}
/**
  * @brief  This function handles Debug Monitor exception.
  * @param  None
  * @retval None
  */
void DebugMon_Handler(void)
{
}
extern void xPortSysTickHandler(void);
//systick中断服务函数
void SysTick_Handler(void)
{       
    #if (INCLUDE_xTaskGetSchedulerState  == 1 )
      if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
      {
    #endif  /* INCLUDE_xTaskGetSchedulerState */  
        xPortSysTickHandler();
    #if (INCLUDE_xTaskGetSchedulerState  == 1 )
      }
    #endif  /* INCLUDE_xTaskGetSchedulerState */
}
/******************************************************************************/
/*                 STM32F10x Peripherals Interrupt Handlers                   */
/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */
/*  available peripheral interrupt handler's name please refer to the startup */
/*  file (startup_stm32f10x_xx.s).                                            */
/******************************************************************************/
/**
  * @brief  This function handles PPP interrupt request.
  * @param  None
  * @retval None
  */
/*void PPP_IRQHandler(void)
{
}*/

使用特权

评论回复
29
lvuu|  楼主 | 2022-12-31 21:04 | 只看该作者
修改main.c里面的代码
#include "FreeRTOS.h"
#include "task.h"
/* 开发板硬件bsp头文件 */
#include "bsp_led.h"
#include "bsp_usart.h"


int main(void)
{       
  //里面什么都不做
}

使用特权

评论回复
30
lvuu|  楼主 | 2022-12-31 21:04 | 只看该作者
修改好后编译看看有没有错误

使用特权

评论回复
31
lvuu|  楼主 | 2022-12-31 21:59 | 只看该作者

使用特权

评论回复
32
Bowclad| | 2023-1-1 16:13 | 只看该作者
参考一下移植过程

使用特权

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

本版积分规则