datasheet

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任务  内存分配

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/ic467684.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32又添一虎将,一芯双核,性能飙升

自2007年意法半导体(ST)在北京发布首款STM32产品以来已有10年之久,在这风雨十年里,STM32出货量高达30亿颗,成为中国第一大微控制器品牌。不止于此,随着IoT的应用趋势逐渐明显,对其中的MCU需求也日益增加。为此,在ST的战略中,最终目标是要打造一个宏伟的战略生态系统,成为产业领导者。  ST不断扩充着STM32系列,2019年7月,ST在北京召开新品发布会,推出了首款双核MCU——STM32H7。来自ST微控制事业部高级市场经理Renaud Bouzereau详细介绍了它的性能优势。  STM32H7采用Arm Cortex-M系列中性能最高的480MHz
发表于 2019-07-15
STM32又添一虎将,一芯双核,性能飙升

STM32开发笔记45:看门狗驱动程序的移植

单片机型号:STM32F070F6P6本文介绍将看门狗驱动程序移植到自己工程中的方法,本项目使用的是独立看门狗IWDG。1、在STM32CubeMX中使能看门狗,如下图所示。2、查看看门狗时钟。3、对看门狗进行设置,这里主要的是设置IWDG down-counter reload value。IWDG counter clock prescaler为分频系数,我现在项目设置的IWDG的时钟是40KHz,所以分频后为40000/64=625Hz,我先在项目需要使用5秒的看门狗,则625*5=3125,就是IWDG down-counter reload value的数值。4、在自己的工程中引入stm32
发表于 2019-07-15
STM32开发笔记45:看门狗驱动程序的移植

STM32开发笔记46:STM32F0低功耗设计

单片机型号:STM32F070F6P6项目中需要使单片机STM32F070F6P6进入低功耗模式,本文记录整个过程。1、STM32F070的低功耗模式:2、低功耗模式描述,在项目中希望外部中断予以唤醒,所以三种低功耗模式,都可以使用。3、进入Stop模式的代码如下,实际测得进入Stop模式后,8.0uA。在这里需要注意的是,我选用的单片机STM32F070F6P6,仅有端口A、端口B和端口F。我使用参考例程,没有注意里面的具体写法,增加了端口C和端口D,则一直进入不了Stop模式,网上说需要停止SysTick,这些都是不正确的。只有进入Sleep模式,才需停止SysTick,在Stop模式中,不需事先关闭SysTick。程序开始
发表于 2019-07-15
STM32开发笔记46:STM32F0低功耗设计

STM32开发笔记47:STM32F4+DP83848以太网通信指南系列(一)

单片机型号:STM32F407VGT本章为系列指南第一章,主要是介绍一下项目思路,并且尽可能列出从零开始着手开发这个项目过程中,所需要理解的各类知识点,关于这些知识点,如果需要更详细的介绍,请列为看官自行百度谷歌。STM32F407简介STM32F407主频168MHz,主频这个数值的意义可以这么理解:每秒执行168,000,000步简单指令,也就是每毫秒168,000次,每微秒168次。我们工业以太网进入实时通信后的数据传输周期大概每2ms交互4次,每次60个Byte,最差的算法复杂度计算下来需要每毫秒4 / 2 * 60byte = 120步(事实上用不了这么多步),而这颗STM32F07的芯片提供每毫秒168,000次操作
发表于 2019-07-15
STM32开发笔记47:STM32F4+DP83848以太网通信指南系列(一)

STM32开发笔记48:STM32F4+DP83848以太网通信指南系列(二):系

本章为系列指南第二章,主要是介绍一下STM32F4的时钟配置。时钟是一个嵌入式产品从零开始开发的基石,一切逻辑都在时钟的节奏中安静地弹奏着,时钟为整个电路带来了欢快的「心跳」。开发者如果对时钟没有控制能力,就会把脉不准整个旋律的节奏,从而导致诸如通信波特率、通信时序、延时操作等关键功能全都紊乱,系统的构建也就无从谈起。时钟如此重要,那么普通开发者,需要对时钟有多深的认知呢?STM32F4的时钟配置到底复不复杂?几行代码能搞定?不要着急,我下面将用最简单的白话文来剖析STM32的时钟系统。不过在这之前,我们应该先吃一颗定心丸,因为在STM32中配置时钟是非常简单的,简单到我们甚至不需要写一行代码就能配置好,因为从标准库3.5版本
发表于 2019-07-15
STM32开发笔记48:STM32F4+DP83848以太网通信指南系列(二):系

STM32开发笔记49:STM32F4+DP83848以太网通信指南系列(三)

本章为系列指南的第三章,这一章将会在正式进入以太网的配置和使用之前,复习一下STM32的中断以及中断向量,因为我们以后要在中断中响应以太网收包。中断—嵌入式中的多线程从51单片机到ARM架构的32位微芯片,到树莓派、Ardunio等单板机,中断的概念对于这些芯片都非常重要。本人是纯软件工程师出身,科班学习时根本没有接触过嵌入式开发,学的都是C++,C#,JAVA,Go这些语言。在我看来嵌入式中的中断就相当于这些高级语言中的多线程,main()函数定义了一条主线程,然后各种配置出来的中断Handle就是游离在主线程之外的各种事件的回调函数,他们会在不同的事件下响应并触发,一旦触发中断,CPU的运算逻辑将会在主线程中打个断点,并立
发表于 2019-07-15

小广播

何立民专栏

单片机及嵌入式宝典

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

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