STM32开发笔记71: 解决FreeRTOS任务的内存分配问题

发布者:艺泉阁最新更新时间:2019-07-13 来源: eefocus关键字:STM32  FreeRTOS任务  内存分配 手机看文章 扫描二维码
随时随地手机看文章

单片机型号:STM32F091RCT6


在使用FreeRTOS进行程序设计时,遇到任务不能运行的问题,具体程序如下:


DebugOutput("启动USB通讯线程...rnrn");

osThreadDef(usbTask, StartUsbTask, osPriorityNormal, 0, 128);

usbTaskHandle = osThreadCreate(osThread(usbTask), NULL);

DebugOutput("启动雷达红外通讯线程...rnrn");

osThreadDef(irdaTask, StartIrdaTask, osPriorityNormal, 0, 128);

irdaTaskHandle = osThreadCreate(osThread(irdaTask), NULL);

DebugOutput("启动GPRS通讯线程...rnrn");

osThreadDef(gprsTask, StartGprsTask, osPriorityNormal, 0, 128);

gprsTaskHandle = osThreadCreate(osThread(gprsTask), NULL);

程序创建了3个线程,但是第3个任务不能正常运行。尝试多种方法解决,最后发现问题在于任务的堆栈的分配上,减小任务分配的堆栈大小,3个线程可以正常运行。


我现在使用的是STM32F091RCT6单片机,RAM为32K,所以确认不是硬件问题,应该和FreeRTOS的配置有关。


通过FreeRTOS的官方手册,最后确认到配置的参数为configTOTAL_HEAP_SIZE,其解释为静态分配内存的大小,其在FreeRTOSConfig.h中,增大其值后程序正常运行。


#define configUSE_PREEMPTION                     1

#define configSUPPORT_STATIC_ALLOCATION          0

#define configSUPPORT_DYNAMIC_ALLOCATION         1

#define configUSE_IDLE_HOOK                      0

#define configUSE_TICK_HOOK                      0

#define configCPU_CLOCK_HZ                       ( SystemCoreClock )

#define configTICK_RATE_HZ                       ((TickType_t)1000)

#define configMAX_PRIORITIES                     ( 7 )

#define configMINIMAL_STACK_SIZE                 ((uint16_t)128)

#define configTOTAL_HEAP_SIZE                    ((size_t)4 * 1024)

#define configMAX_TASK_NAME_LEN                  ( 16 )

#define configUSE_16_BIT_TICKS                   0

#define configUSE_MUTEXES                        1

#define configQUEUE_REGISTRY_SIZE                8



关键字:STM32  FreeRTOS任务  内存分配 引用地址:STM32开发笔记71: 解决FreeRTOS任务的内存分配问题

上一篇:STM32开发笔记72: 使用命名空间解决类名冲突问题
下一篇:STM32开发笔记70: 传递参数时,为何要对套接字地址进行强制

推荐阅读最新更新时间:2024-10-28 13:41

单片机常用的STM32五个时钟源讲解
在单片机中,比如我们常用的STM32是有五个时钟源的,分别是:HSI,LSI,HSE,LSE,PLL。 这些时钟源都体现在时钟树,我们知道每个型号的单片机手册都有时钟树的展示,这样让我们能清楚知道应用到的外设是通过哪个时钟源分频或倍频得来的。我们以ST推出的STM32G030为例来看下: 1、HSI是高速内部时钟,RC振荡器,频率为16MHz。 2、LSI是低速内部时钟,RC振荡器,频率为32KHz。 3、HSE是高速外部时钟,可接晶体/陶瓷振荡器,或者接外部时钟源(Bypass模式),频率范围是4-48MHz。 4、LSE是低速外部时钟,接频率为32.768KHz的石英或谐振器,或者使用旁路模式引入外部时钟源。 5、PL
[单片机]
单片机常用的<font color='red'>STM32</font>五个时钟源讲解
IAR首次给单片机STM32下载解锁flash
新板子焊接好后,在编译下载的时候第一次遇到了这样的问题: Warning:STack pointer issetupto incorrect alignment. Stack addr = 0xAAAAAAAA 开始以为是调试器的问题,我用的Jlink的SWD接口模式,换了STLink还是这个毛病,后来提示需要板子初始化,试了无果,后来查看IAR的帮助文档发现是Flash被保护了,以下摘自Help文档: 按照说明,在IAR安装目录下找到指定的运行程序JLinkSTM32.exe(D:Program Files (x86)IAR SystemsEmbedded Workbench 6.0armbin)在JLink与
[单片机]
IAR首次给单片机<font color='red'>STM32</font>下载解锁flash
STM32进阶-红外遥控器的应用详细步骤
红外遥控器概述 红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。 同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。 红外遥控的编码目前广泛使用的是:NEC Protocol 的PWM(脉冲宽度调制)和Philips RC-5 Protocol 的PPM(脉冲位置调制)。 NEC协议的特征: 1、8位地址和8位指令长度; 2、地址和命令两次传输;(确保可靠性) 3、PWM脉冲宽度调制,以发射红外载波的占空比代表“0”和“1”; 4、载波频率为38KHz 5、位时
[单片机]
<font color='red'>STM32</font>进阶-红外遥控器的应用详细步骤
stm32-afio的使用
1. AFIO的功能 为了优化64脚或100脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现引脚的重新映射。这时,复用功能不再映射到它们的原始分配上。 简言之,AFIO实现了复用功能的重新映射。 2. 在什么情况下,需要开启AFIO时钟? 参考手册中写道:对寄存器AFIO_EVCR, AFIO_MAPR和AFIO_EXTICRX进行读写操作前,应当首先打开AFIO的时钟。 在数据手册的引脚定义中(pin definitions),复用功能 Alternate functions 栏下分为两栏:默认 Default 和重映射 R
[单片机]
stm32-afio的使用
STM32实现DAC输出的相关设置
STM32 DAC简介 大容量的STM32F103具有内部DAC,战舰STM32选择的是STM32F103ZET6属于大容量产品,所以是带有DAC模块的。 STM32的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型的DAC。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。 STM32的DAC模块主要特点有: ① 2个DAC转换器:每个
[单片机]
<font color='red'>STM32</font>实现DAC输出的相关设置
使用STM32调试FMSDR模块及解调FM电台(2)
2. 调试整体思路 当我们使用FPGA或者STM32模块配合FMSDR模块使用的时候,需要从零开始调试这个电路,逐步完成:硬件好坏判断、8027和MSI001寄存器控制、波形采集、FM解调、滤波器设计和声音回放,这需要我们有一个清晰的调试思路:使用已知来调试未知。 很多同学一上来就调试MSI001收电台,几乎都收到的都是杂音,看到毫无规律的IQ信号无从下手,因为这里可能出错的地方很多:SPI时序错误,寄存器配置错误,ADC配置错误,解调算法错误,滤波算法错误,抽取算法错误,DAC程序错误等等,任意一步出问题都会导致最终结果不对。 更难受的是,即使是正常解调的电台,无论是IQ波形,解调后波形,还是滤波后波形,都是杂乱无章的(如下图)
[单片机]
使用<font color='red'>STM32</font>调试FMSDR模块及解调FM电台(2)
STM32是如何进入中断函数xxx_IRQHandler的
STM32是如何进入中断函数xxx_IRQHandler的,如:void USART1_IRQHandler(void) 前段时间开始接触STM32的时候遇到这样一个问题,程序里面配置好中断设置时,程序运行的时候是怎么进入中断函数的(当然这里所说的中断都是硬件中断),因为跑C程序的时候,本人的理解是,你总得有个“接力棒”或者一个“入口”吧,它才能进入到下一个函数中去。 以uart1配置作为例子, //中断初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStru
[单片机]
STM32定时器溢出的工作原理是什么?
从来没有一个外设能够这么骚~那说的就是定时器了,或者说没有了定时器的MCU就不完整。 只能说没有定时器的单片机不值得被爱 OKOK,不骚了,这篇文章就是回答几个在我研究过程中比较疑惑的问题。 所以是可以确定一点的就是,如果你想让你的定时器非常精确,那你一定要有一个很稳的时基,这里就是时钟树。 痛苦的回忆来了,具体要查你的定时器在哪里挂着 还想骂的一点是,不知道为什么定时器还排起了辈分按说是从简单到难,但是ARM构架似乎是一把梭哈。 事实上大多数文章都是拿这个图说事情的,我也不能免俗 这个可编程定时器的主要部分是一个带有自动重装载的16位累加计数器,计数器的时钟通过一个预分频器得到。 软件可以读写计数器、自动重装
[单片机]
<font color='red'>STM32</font>定时器溢出的工作原理是什么?
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved