FreeRTOS官方移植手册:A free FreeRTOS based source code project for ARM Cortex-M4F based STM32F4xx microcontroller from ST.https://www.freertos.org/zh-cn-cmn-s/FreeRTOS-for-STM32F4xx-Cortex-M4F-IAR.htmlFreeRTOS官网为ST芯片提供的移植教程
按照如上所示的官方的移植手册移植完毕后,程序编译下载均正常,但在STM32开发板上运行没有任何的反应,反复按下复位按钮也没有任何的作用,串口助手也只能接收到单个数字0,除此之外,再无任何反馈。
程序下载运行,打开串口助手后,发现只收到奇怪的数字0,每次按下复位都是输出一个数字0,起初以为是串口程序和FreeRTOS存在冲突,但实际发现并没有影响,最终通过查阅各种前辈经验发现,应该是堆栈空间不足导致的,STM32修改堆栈空间主要在启动文件中进行修改。
如上图所示,将方框中的 Stack_Size 的值修改为0x00000800后,编译下载,设备恢复正常运转。
在这里0x0000800是随便将栈空间数值扩大了,如果工程文件所使用了更大的栈空间资源,需要根据自身需求,将 Stack_Size 的值修改为合适的大小。
Stack_Size EQU 0x00000400 ----》修改为 0x00000800
跑操作系统时候,Stack_size和Heap_size需要做适当的修改。STM32官方手册对STM32F407内存大小的说明。如果是其它芯片,如STM32F1或STM32G4等类型的芯片,需要根据官方手册进行内存的修改。
运行的主程序如下所示:
#include "stm32f4xx.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <stdio.h>
#include "usart.h"
TaskHandle_t app_task1_handle = NULL;
TaskHandle_t app_task2_handle = NULL;
static void app_task1(void* pvParameters);
static void app_task2(void* pvParameters);
int main(void)
{
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
//SysTick_Config(SystemCoreClock/configTICK_RATE_HZ); //开启导致硬件错误中断
USART1_Init(115200);
printf("starting...\r\n");
/* 创建app_task1任务 */
xTaskCreate((TaskFunction_t )app_task1, /* 任务入口函数 */
(const char* )"app_task1", /* 任务名字 */
(uint16_t )512, /* 任务栈大小 */
(void* )NULL, /* 任务入口函数参数 */
(UBaseType_t )2, /* 任务的优先级 */
(TaskHandle_t* )&app_task1_handle); /* 任务控制块指针 */
/* 创建app_task2任务 */
xTaskCreate((TaskFunction_t )app_task2, /* 任务入口函数 */
(const char* )"app_task2", /* 任务名字 */
(uint16_t )512, /* 任务栈大小 */
(void* )NULL, /* 任务入口函数参数 */
(UBaseType_t )2, /* 任务的优先级 */
(TaskHandle_t* )&app_task2_handle); /* 任务控制块指针 */
/* 开启任务调度 */
vTaskStartScheduler();
}
static void app_task1(void* pvParameters)
{
int cnt = 0;
for(;;)
{
printf("app_task1 is running %d...\r\n", cnt);
vTaskDelay(1000);
cnt++;
}
}
static void app_task2(void* pvParameters)
{
int cnt = 0;
for(;;)
{
printf("app_task2 is running %d...\r\n", cnt);
vTaskDelay(1000);
cnt++;
}
}
程序正常运行图如下所示: