完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
今天看了原子哥讲的FreeRTOS关于内存管理方面的书和视频,看完之后有个疑问一直不明白,贴出来大家分析一下。原子哥也讲了,实际在应用中,尤其是简单的单片机应用中,用的最多的内存管理方式还是静态分配内存,即在创建任务前就分配好各个任务需要的内存,信号量,队列等内容,代码运行过程中不再需要动态创建任务,不需要动态分配内容。而这种方式在FreeRTOS的内存管理文件里面应该用heap_1.c。
那么问题来了,heap_1.c里面只有分配内存功能,没有释放内存功能。那么我在每个任务里申请的内存(相当于裸跑的时候的局部变量)岂不是每运行一次都静态分配一次,那么很快内存就会用完了。还是使用heap_1.c的时候都需求在创建任务前都分配好内存,就像裸跑的时候的全局变量那样。那么在任务里用的类似局部变量的内存就不用申请了? 第二个文件就是关于局部变量的问题,在使用了FreeRTOS后,应该还是能继续使用传统方式定义局部变量和全局变量的,我也测试过了,确实可行。那么这些变量应该是分配到的了ucheap[]外面了,不受内存管理函数管理了。这样的应用方式有没有问题。传统定义方式和使用OS之后的内存管理共存的话会不会有什么问题?有什么需要注意的地方? 这两个问题其实都是关于静态内存的使用,也就是原子哥说的80%的应用中的实际使用方法,原子哥能不能给讲一下怎么用比较好! 谢谢! |
|
相关推荐
6个回答
|
|
我的理解:每个任务里申请的内存只分配一次且分配在它对应的堆栈中,然后任务开始运行进入while死循环,何来的“每运行一次都静态分配一次”?刚刚实验过了,原子的例程静态创建任务,如下图,打印了task1和task2的任务堆栈地址和大小,task1和task2运行时定义了局部变量,分配打印task1和task2局部变量的地址,局部变量的地址位于任务堆栈里面。
|
|
|
|
在使用了FreeRTOS后,还是能继续使用传统方式定义局部变量和全局变量的。但是访问的时候有共享的麻烦,你任务A使用全局变量时阻塞了,任务B又修改了这个全局变量的值,然后任务A运行了,你想要的全局变量的值已经被修改过了,肯定出错。最好还是用FreeRTOS里提供的消息队列。
|
|
|
|
谢谢!~
每个任务里申请的内存只分配一次且分配在它对应的堆栈中,然后任务开始运行进入while死循环,何来的“每运行一次都静态分配一次”?这个问题是我发帖的时候想错了,确实是只申请一次。 我开始还是没有理解原子哥的实验程序的意思,不过经你这么一提醒就明白了。局部变量是分配任务的时候已经分配给任务的堆栈。pvPortMalloc()函数分配的内存是总内存堆里剩余的内存,也就是任务堆栈外剩余的内存。这样理解没有问题吧?一会儿我也尝试着写一个 测试程序试一下。再次感谢! |
|
|
|
while循环确实没有在分配,但之前分配的内存也没有释放啊,这样不会出问题吗?
|
|
|
|
那种分配方式本来就是对应的程序中不删除任务的应用,任务还在,内存当然不用释放了。
|
|
|
|
你在你的task任务中定义一个局部变量,它也是需要分配内存的,分配在任务堆栈里,你的while里面是要一直用这个变量的,你干嘛把它释放了?
|
|
|
|
只有小组成员才能发言,加入小组>>
684 浏览 0 评论
1100 浏览 1 评论
2465 浏览 5 评论
2799 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2638 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
650浏览 9评论
648浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
777浏览 6评论
622浏览 5评论
663浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 00:40 , Processed in 1.043228 second(s), Total 89, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号