前言
演示STM32F103移植FreeRTOS完整过程,文末提供移植好的完整工程,
1.下载源码
下载FreeRTOSv9.0.0.zip解压如下图
只用关注第一个文件夹FreeRTOS中的内容
Demo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。
Source是源文件。
2.拷贝源码
在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port
将Source/include文件夹拷贝到FreeRTOS下
将Source中的C文件拷贝到FreeRTOS/src下
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,
其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。
3.添加到工程
新建FreeRTOS/src和FreeRTOS/port组
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和
FreeRTOS\port\RVDS\ARM_CM3中的port.c
添加头文件路径
拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程
4.修改配置
在FreeRTOSConfig.h中添加
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断
最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
extern void xPortSysTickHandler(void);
void SysTick_Handler(void)
{
#if (INCLUDE_xTaskGetSchedulerState == 1 )
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
{
#endif /* INCLUDE_xTaskGetSchedulerState */
xPortSysTickHandler();
#if (INCLUDE_xTaskGetSchedulerState == 1 )
}
#endif /* INCLUDE_xTaskGetSchedulerState */
}
5.验证demo
#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"
#include "portmacro.h"
#include "bsp_led.h"
#include "log.h"
static TaskHandle_t led_task_handle = NULL;
void led_task(void *arg)
{
while(1)
{
led_status_set(LED_STATUS_ON);
LOG_DEBUG("LED_STATUS_ON\r\n");
vTaskDelay(500/portTICK_PERIOD_MS);
led_status_set(LED_STATUS_OFF);
LOG_DEBUG("LED_STATUS_OFF\r\n");
vTaskDelay(500/portTICK_PERIOD_MS);
}
}
int main(void)
{
led_init();
xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);
// 开启调度
vTaskStartScheduler();
while(1);
}
6.完整工程
亲测可用,完整工程地址。
版权声明:本文为CSDN博主「无聊到发博客的菜鸟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36973838/article/details/121754908
暂无评论