OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3032|回复: 6

关于FreeRTOS操作系统中全局变量存放的位置

[复制链接]

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2021-8-9
在线时间
16 小时
发表于 2023-9-8 17:20:37 | 显示全部楼层 |阅读模式
1金钱
求大佬解答。用的是FreeRTOS操作系统,在某个.c文件中定义了几个较大的数组,为全局变量。但发现这几个数组所消耗的空间太大了,在FreeRTOS运行的第一个任务中就会触发堆栈溢出,在删掉一些数组之后,就不会触发堆栈溢出。求助应该怎么改,是应该在程序最开始就把这几个数组进行malloc吗

最佳答案

查看完整内容[请看2#楼]

感谢各位大佬的解答,问题已经找到了,是某个任务里面的函数使用到了这个模拟FIFO的结构体,而这个模拟FIFO的结构体占用空间又比较大;当时直接使用的结构体变量进行传参,所以会造成堆栈溢出,只要把函数传参的内容改成结构体指针就行了。 另外在之前的在线调试里面,单步调试的话看到的是在第一个任务里面的函数触发的堆栈溢出,实际上在堆栈溢出的钩子函数里面打印任务名字却发现是另外一个函数触发的堆栈溢出。md属实有点坑 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2021-8-9
在线时间
16 小时
 楼主| 发表于 2023-9-8 17:20:38 | 显示全部楼层
感谢各位大佬的解答,问题已经找到了,是某个任务里面的函数使用到了这个模拟FIFO的结构体,而这个模拟FIFO的结构体占用空间又比较大;当时直接使用的结构体变量进行传参,所以会造成堆栈溢出,只要把函数传参的内容改成结构体指针就行了。

另外在之前的在线调试里面,单步调试的话看到的是在第一个任务里面的函数触发的堆栈溢出,实际上在堆栈溢出的钩子函数里面打印任务名字却发现是另外一个函数触发的堆栈溢出。md属实有点坑。而且第一个任务的优先级是最高的,进操作系统之后也是首先运行第一个任务。
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1036
金钱
1036
注册时间
2022-4-20
在线时间
372 小时
发表于 2023-9-8 17:53:27 | 显示全部楼层
不知道你具体是怎么用的,但我觉得可以先改这里试试

屏幕截图 2023-09-08 175219.png
又菜又爱指点
回复

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1036
金钱
1036
注册时间
2022-4-20
在线时间
372 小时
发表于 2023-9-8 17:59:27 | 显示全部楼层
又菜又爱指点
回复

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2021-8-9
在线时间
16 小时
 楼主| 发表于 2023-9-9 15:15:46 | 显示全部楼层
驭剑的秘密 发表于 2023-9-8 17:53
不知道你具体是怎么用的,但我觉得可以先改这里试试

感谢大佬解答,我调一下试试。程序里面用了一个软件模拟FIFO的代码,在一个.c文件里定义了五个软件模拟FIFO的结构体,占用空间大概是896*5=4480个字节。然后您说的这个系统栈原本是调成了0x4000,系统堆调成了0xB000;FreeRTOS操作系统总堆的空间给了20480字节
回复

使用道具 举报

10

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1549
金钱
1549
注册时间
2017-10-9
在线时间
131 小时
发表于 2023-9-12 09:38:21 | 显示全部楼层
看三个地方:两个地方就是2楼说的,另外一个就是FreeRTOSConfig.h文件的configTOTAL_HEAP_SIZE
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3502
金钱
3502
注册时间
2016-3-19
在线时间
846 小时
发表于 2023-9-12 14:10:51 | 显示全部楼层
第一,全局变量和FreeRTOS定义的configTOTAL_HEAP_SIZE都不会影响到Stack_Size      只要单片机的SRAM够用

第二,一般情况下  任务栈是指创建任务时分配的,来源于 configTOTAL_HEAP_SIZE

第三,使用FreeRTOS情况下,如果中断函数,非任务中使用的函数等等   内部未使用大的数据    默认值基本上够用   更改更大的值   会浪费SRAM

所以SRAM很大的情况下,可以随便使用,如果SRAM有限的话   需要提前规划一下整体的使用情况
Nothing is impossible
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 06:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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