STM32移植FreeRTOS,解决设备崩溃死机无反应

FreeRTOS官方移植手册:A free FreeRTOS based source code project for ARM Cortex-M4F based STM32F4xx microcontroller from ST.icon-default.png?t=N7T8https://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++;
	}
}

程序正常运行图如下所示:

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!感谢您的提问。要将 FreeRTOS 移植STM32 上,可以按照以下步骤进行操作: 1. 配置 STM32 开发环境:安装 STM32CubeMX 和相关的开发工具,如 Keil 或者 STM32CubeIDE。 2. 创建一个新的 STM32 项目:使用 STM32CubeMX 创建一个新的项目,选择您的目标 MCU 型号,并配置相应的外设和时钟设置。 3. 生成代码:根据您的配置,生成初始化代码和 FreeRTOS 的配置文件。 4. 添加 FreeRTOS 文件:将 FreeRTOS 的源码添加到您的项目中。可以从官方网站下载最新版本的 FreeRTOS,并将其添加到您的项目文件夹中。 5. 配置 FreeRTOS:修改 FreeRTOSConfig.h 文件,根据您的需求配置任务堆栈大小、任务优先级等参数。 6. 配置中断:根据您的应用需求,配置合适的中断优先级,并且确保 FreeRTOS 的 tick 中断优先级较低。 7. 编写任务代码:根据您的应用需求,编写任务代码并创建任务。可以使用 FreeRTOS 提供的 API 函数来创建、删除和管理任务。 8. 编译和调试:编译您的项目并下载到 STM32 开发板上进行调试。确保任务能够正确运行并按照预期进行调度。 这些是大致的步骤,具体的移植细节可能会根据您的项目需求和 STM32 型号而有所不同。建议您参考相关的 FreeRTOS 文档和 STM32 的用户手册以获得更详细的信息和指导。希望对您有所帮助!如有任何问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值