OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 523|回复: 6

FreeRTOS系统中栈大小的设置疑问

[复制链接]

  离线 

2

主题

4

帖子

0

精华

新手入门

积分
37
金钱
37
注册时间
2017-7-27
在线时间
6 小时
发表于 2017-9-25 16:06:32 | 显示全部楼层 |阅读模式
正点原子公众号
在使用FreeRTOS时一直存在对栈设置的疑问,见以下三点疑问:
1、Starup_stm32f40_41xxx.s中的  “Stack_Size      EQU     0x00001000”这里的设置的作用?
2、在工程“options”——“target”设置中IRAM1的start地址、size大小中size大小的用处?
3、在FreeRTOSConfig.h中,宏定义#define configTOTAL_HEAP_SIZE        ((size_t)(55*1024))的作用?三个设置栈大小的地方之间又有何种联系?
4、任务栈与系统栈的关系?多谢指点讨论!!
回复

使用道具 举报

  离线 

62

主题

6378

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
12609
金钱
12609
注册时间
2013-11-13
在线时间
1419 小时
发表于 2017-9-25 16:15:05 | 显示全部楼层
1、.s启动文件Stack_Size是栈的大小,如果没有使用操作系统的话所有的函数都使用这个栈。
2、工程options里面设置的IRAM1是设置你整个板子上可用的RAM
3、configTOTAL_HEAP_SIZE设置的是FreeRTOS系统的动态内存管理所管理的内存大小。
4、不知道你说的任务栈和系统栈是什么意思。
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

  离线 

2

主题

4

帖子

0

精华

新手入门

积分
37
金钱
37
注册时间
2017-7-27
在线时间
6 小时
 楼主| 发表于 2017-9-25 16:31:56 | 显示全部楼层
zuozhongkai 发表于 2017-9-25 16:15
1、.s启动文件Stack_Size是栈的大小,如果没有使用操作系统的话所有的函数都使用这个栈。
2、工程options ...

你好!我是在STM32F4XX上用的FreeRTOS系统:第一个问题1、“.s启动文件Stack_Size是栈的大小,如果没有使用操作系统的话所有的函数都使用这个栈”。可否理解为除操作系统任务以外的全局变量所分配的栈大小吗?对于在任务中用的全局变量,同时还会占用该任务的栈大小吗?第二个问题2、“工程options里面设置的IRAM1是设置你整个板子上可用的RAM”,那么如果芯片RAM是256K,是否应该设置成256K字节大小?如果设置小了,会带来什么问题?第三个问题“configTOTAL_HEAP_SIZE设置的是FreeRTOS系统的动态内存管理所管理的内存大小”,是不是要大于各个任务分配的栈大小之和?第四个问题实际与第三个问题相关,创建任务时所分配的该任务栈大小(个人称任务栈,不知是否准确),系统栈是FreeRTOS操作系统除所创建的任务需分配栈之外,内核等还要必需一部分栈。
回复 支持 反对

使用道具 举报

  离线 

62

主题

6378

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
12609
金钱
12609
注册时间
2013-11-13
在线时间
1419 小时
发表于 2017-9-25 16:55:35 | 显示全部楼层
1、全局变量不是在这个栈中!而是有编译器分配在其它的地址ram中!
2、如果你的板子有256K的ram,那肯定可以设置256K!
3、FreeRTOS的任务堆栈虽然可以用FreeRTOS的内存管理函数来分配,但是内存管理函数所管理的堆栈大小确不是仅仅给任务堆栈用的,所以configTOTAL_HEAP_SIZE的大小肯定要大于系统中所有任务分配的任务堆栈的总和。
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

  离线 

23

主题

676

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
3549
金钱
3549
注册时间
2015-11-5
在线时间
1095 小时
发表于 2017-9-26 23:59:37 | 显示全部楼层
正点原子公众号
求助帖不要发分享帖,谢谢配合!
回复 支持 反对

使用道具 举报

  离线 

1

主题

15

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2016-9-26
在线时间
3 小时
发表于 2017-12-5 19:50:05 | 显示全部楼层
有疑问就对了。我也搞了好久才明白。实际上代码你把
Stack_Size      EQU     0x00001000
改成  Stack_Size      EQU     0

代码依然跑的很好的。

===============


在使用FreeRTOS时一直存在对栈设置的疑问,见以下三点疑问:
1、Starup_stm32f40_41xxx.s中的  “Stack_Size      EQU     0x00001000”这里的设置的作用?
2、在工程“options”——“target”设置中IRAM1的start地址、size大小中size大小的用处?
3、在FreeRTOSConfig.h中,宏定义#define configTOTAL_HEAP_SIZE        ((size_t)(55*1024))的作用?三个设置栈大小的地方之间又有何种联系?
4、任务栈与系统栈的关系?多谢指点讨论!!

先第4条:
这两个没关系。一点不重叠。
这个首先搞懂51单片机,先是通用寄存器组 然后 是 固定的bit,然后是你定义的全局变量和static之类的变量,然后就是栈了。
STM32也是如此。
STM32的那个头文件的  ————heap是ST公司给OS准备的。但是freertos的代码并没有把那个大数组uxheap定义到这里(就是说此时时任务堆栈既没有放到系统堆 也没放到系统栈里),当然你也可以决定地址定位把uxheap定义到--heap的位置(就是说此时时任务堆栈放到系统堆 )。
回复 支持 反对

使用道具 举报

  离线 

1

主题

15

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2016-9-26
在线时间
3 小时
发表于 2017-12-5 19:51:32 | 显示全部楼层
本帖最后由 unsv29 于 2017-12-5 20:14 编辑

2、在工程“options”——“target”设置中IRAM1的start地址、size大小中size大小的用处?

你的代码和内存都是可以随意的定位到一段区域的。
代码code 并不一定要连续啊

RAM也不一定要连续.

这样的好处很多  比如你可以把应用放到指定的一小块,botloader更新程序  就只更新这个小地方就可了。  你编译只编译一小部分就可以了。
比如你提供给用户的话,就提供一小块的bin文件就可以。防止破解
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-5-28 05:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */