硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7962|回复: 10
收起左侧

[FreeRTOS] FreeRTOS使用heap_2,函数pvPortMalloc,vPortFree的疑问

[复制链接]

10

主题

45

回帖

75

积分

初级会员

积分
75
发表于 2015-10-18 22:11:25 | 显示全部楼层 |阅读模式
网上看到这样一个问题,不知大神能否应答一下:
FreeRTOS使用heap_2,函数pvPortMalloc,vPortFree是否可以在中断函数使用?
使用FreeRTOS的queue,配合pvPortMalloc,vPortFree可以实现ucos中消息队列(加osmem)的功能。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2015-10-19 10:01:03 | 显示全部楼层
没有限制。
回复

使用道具 举报

10

主题

45

回帖

75

积分

初级会员

积分
75
 楼主| 发表于 2015-10-19 18:43:18 | 显示全部楼层
那建议程序有关数组的局部变量都通过申请空间来获取的不,这样会不会存在不确定的因数
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2015-10-19 18:50:23 | 显示全部楼层

回 0520kuang 的帖子

0520kuang:那建议程序有关数组的局部变量都通过申请空间来获取的不,这样会不会存在不确定的因数 (2015-10-19 18:43) 
局部变量使用任务栈空间不是更好,进入一个函数会自动为局部变量开辟栈空间,退出函数自动的释放。更加安全可靠。
回复

使用道具 举报

10

主题

45

回帖

75

积分

初级会员

积分
75
 楼主| 发表于 2015-10-19 22:48:46 | 显示全部楼层
局部变量是占任务的堆栈的还是startup_stm32f10x_hd.s【Stack_Size      EQU     0x00001000】的堆栈
如果要开辟4096个数组,那么是增大任务的堆栈 还是startup_stm32f10x_hd.s里的呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2015-10-20 09:25:37 | 显示全部楼层

回 0520kuang 的帖子

0520kuang:局部变量是占任务的堆栈的还是startup_stm32f10x_hd.s【Stack_Size      EQU     0x00001000】的堆栈
如果要开辟4096个数组,那么是增大任务的堆栈 还是startup_stm32f10x_hd.s里的呢
 (2015-10-19 22:48) 
startup_stm32f10x_hd.s增大的是系统堆栈,简单的说就是一旦进入到中断函数以后就是开始使用MSP指针,中断里面用到的所有栈空间都是来自startup_stm32f10x_hd.s。

其它的都是用的任务堆栈。
回复

使用道具 举报

10

主题

45

回帖

75

积分

初级会员

积分
75
 楼主| 发表于 2015-10-20 10:56:06 | 显示全部楼层

回 eric2013 的帖子

eric2013:startup_stm32f10x_hd.s增大的是系统堆栈,简单的说就是一旦进入到中断函数以后就是开始使用MSP指针,中断里面用到的所有栈空间都是来自startup_stm32f10x_hd.s。

其它的都是用的任务堆栈。 (2015-10-20 09:25) 
那再没操作系统的情况下,开辟了大数组,必须要增大startup_stm32f10x_hd.s的堆栈空间,不然会重启,依你说的“一旦进入到中断函数以后就是开始使用MSP指针,中断里面用到的所有栈空间都是来自startup_stm32f10x_hd.s”,我这数组也没有再中断里调用的,那为什么不增到系统堆栈,会重启的呢

目前在系统情况下跟裸跑情况下,对这个系统堆栈产生了疑问,所以过来请教一下eric兄弟
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2015-10-21 00:31:13 | 显示全部楼层

回 0520kuang 的帖子

0520kuang:那再没操作系统的情况下,开辟了大数组,必须要增大startup_stm32f10x_hd.s的堆栈空间,不然会重启,依你说的“一旦进入到中断函数以后就是开始使用MSP指针,中断里面用到的所有栈空间都是来自startup_stm32f10x_hd.s”,我这数组也没有再中断里调用的,那为什么不增到系统堆栈, .. (2015-10-20 10:56) 
有OS的情况下,
任务堆栈是用PSP指针,任务都有自己的堆栈空间
系统堆栈是用的MSP指针,使用的是startup_stm32f10x_hd.s中定义的stack空间。

裸机的情况下:
仅使用MSP指针,所有的局部变量,包括中断里面的局部变量都是用的startup_stm32f10x_hd.s中定义的stack空间。
回复

使用道具 举报

2

主题

11

回帖

34

积分

新手上路

积分
34
发表于 2016-7-12 09:42:48 | 显示全部楼层
这个我使用的是heap_4    在中断中使用pvPortMalloc,vPortFree不行啊。能分配成功,但是会进入临界,进入临界状态后,系统就卡死了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2016-7-12 09:44:39 | 显示全部楼层

回 孔乙己 的帖子

孔乙己:这个我使用的是heap_4    在中断中使用pvPortMalloc,vPortFree不行啊。能分配成功,但是会进入临界,进入临界状态后,系统就卡死了。 (2016-07-12 09:42) 
那就不要在中断函数里面进行分配。
回复

使用道具 举报

2

主题

11

回帖

34

积分

新手上路

积分
34
发表于 2016-7-12 10:06:47 | 显示全部楼层

回 eric2013 的帖子

eric2013:那就不要在中断函数里面进行分配。 (2016-07-12 09:44) 
好吧,看来这个不能在中断中用,分配函数中调用了 ( void ) xTaskResumeAll();, 而这个函数中调用了taskENTER_CRITICAL();  而这个又不能在中断中使用,所以,,,,,,,,
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 03:32 , Processed in 0.210928 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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