Free RTOS task运行越来越慢

探讨了嵌入式系统中任务运行缓慢直至宕机的问题,通过Jlink调试发现是由于函数嵌套过深导致栈溢出,关闭相关函数后问题得以解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于嵌入式系统来说,没有复杂的任务,按理说任务运行变慢是不可能的,但是却出现了问题。

现象:

  task运行越来越慢,直至宕机,(调度完全卡死)

调查过程:

  通过Jlink调试发现,该task最终死在栈溢出,

分析:

  task栈溢出,通过Jlink发现是由于函数嵌套太深,导致调用该函数的task运行过慢,

修正:

  关闭函数后,问题解决。

### STM32CubeMX 中配置和使用 FreeRTOS #### 选择并初始化硬件资源 在启动项目前,需选定目标STM32型号,并依据具体需求调整外设选项。对于时钟源的选择,推荐采用外部晶振作为高速时钟输入以提高精度[^1]。为了方便后期调试工作,在系统设定环节应启用Debug模式。 #### 定制化软件组件 针对FreeRTOS的支持,应在中间件部分激活对应选项。值得注意的是,鉴于该操作系统依赖于周期性的中断服务来调度任务,因此建议挑选除SysTick之外的其他定时器(例如TIM16)承担这一角色[^3]。此外,还需指定工程名称、保存位置以及编译环境等基本信息;同时仅引入必要的库文件有助于减小程序体积。 #### 创建任务及其他内核对象 借助CMSIS V2 API简化编程流程,允许开发者轻松定义线程、同步机制及消息传递结构。通过图形界面操作可便捷地新增各类实体——包括但不限于Task(任务)、Mutex(互斥锁)、Semaphore(信号量) 和 Queue(队列)。 #### 自动生成代码框架 完成上述设置后,利用STM32CubeMX内置功能一键生成初始化所需的C/C++源码与头文件。这些自动生成的内容不仅涵盖了所选设备的基础驱动程序实现,还包含了预配置好的RTOS入口点及相关回调函数模板。 #### 测试验证 最后一步则是连接实际硬件平台并通过串行端口监视输出日志确认一切运作正常。当观察到预期的信息流经由UART发送至PC端显示出来时即表明整个过程顺利完成[^2]。 ```cpp // 示例:简单的FreeRTOS任务创建 void StartDefaultTask(void const * argument){ for (;;) { printf("Hello from default task!\r\n"); osDelay(1000); // Delay one second between prints. } } int main(void){ /* USER CODE BEGIN BEFORE HAL INIT */ /* Initialize all configured peripherals & drivers (in project's configuration file)*/ MX_GPIO_Init(); MX_USART1_UART_Init(); MX_FREERTOS_Init(); /* Create the thread(s) */ osThreadDef(default_task, StartDefaultTask, osPriorityNormal, 0, configMINIMAL_STACK_SIZE); osThreadCreate(osThread(default_task), NULL); /* Start scheduler */ osKernelStart(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值