OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

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

查看: 281|回复: 12

v9.0.0版本的FreeRTOS怎样在中断中申请内存,pvMalloc函数貌似只能在任务中申请。

[复制链接]

  离线 

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-11-23
在线时间
19 小时
发表于 2017-9-11 20:50:56 | 显示全部楼层 |阅读模式
5金钱
使用最新版本的FreeRTOS时,在中断中申请内存,发现使用pvPortMalloc函数申请内存时会调用vTaskSuspendAll这个函数,但这个函数是任务级别的,程序运行时会报错,错误定位在port.c文件441行,不知道有没有更好的方法在实现在中断中申请内存??

最佳答案

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

malloc() 和 free() 都(常常)是不可确定的,意味着他们潜在的可能需要一段长的(难以 量化的)执行时间,这直接和实时约束相冲突。尽管一些 RTOS 提供带有条件的,甚至是可 决定性的性能的堆管理算法,他们不能有效的处理多个小的分配。 -------------- 以上选自PsiCC2 这本书 所以说,在中断里mallo,和作死没啥区别
回复

使用道具 举报

  离线 

3

主题

232

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1235
金钱
1235
注册时间
2016-2-21
在线时间
238 小时
发表于 2017-9-11 20:50:57 | 显示全部楼层
malloc() 和 free() 都(常常)是不可确定的,意味着他们潜在的可能需要一段长的(难以
量化的)执行时间,这直接和实时约束相冲突。尽管一些 RTOS 提供带有条件的,甚至是可
决定性的性能的堆管理算法,他们不能有效的处理多个小的分配。
--------------
以上选自PsiCC2 这本书

所以说,在中断里mallo,和作死没啥区别
回复

使用道具 举报

  离线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
117328
金钱
117328
注册时间
2010-12-1
在线时间
902 小时
发表于 2017-9-12 00:13:23 | 显示全部楼层
帮顶
回复

使用道具 举报

  离线 

50

主题

5843

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
11125
金钱
11125
注册时间
2013-11-13
在线时间
1181 小时
发表于 2017-9-12 08:49:58 | 显示全部楼层
你的中断优先级有没有在FreeRTOS的管理范围中
回复

使用道具 举报

  离线 

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-11-23
在线时间
19 小时
 楼主| 发表于 2017-9-13 23:01:46 | 显示全部楼层
zuozhongkai 发表于 2017-9-12 08:49
你的中断优先级有没有在FreeRTOS的管理范围中

我程序中的中断都在它管理范围内的,定位是临界区出问题。是不是每次任务切换都会进入一次临界区??
回复

使用道具 举报

  离线 

3

主题

232

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1235
金钱
1235
注册时间
2016-2-21
在线时间
238 小时
发表于 2017-9-18 15:36:39 | 显示全部楼层
不要在中断处理函数里malloc
回复

使用道具 举报

  离线 

3

主题

232

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1235
金钱
1235
注册时间
2016-2-21
在线时间
238 小时
发表于 2017-9-18 15:40:35 | 显示全部楼层
当你在一个多线程环境内使用堆时,会出现一类新的问题。堆变成
一个共享的资源,因此引发了全部和资源共享有关的麻烦,新问题是:
 malloc() 和 free() (常常)是不可重入的,也就是说,它们不能从多个执行线程被安全的
调用。
 可以通过使用一个互斥体保护 malloc() , free() , realloc() 这类函数来弥补重入的问题,
互斥体 mutex 仅允许每次一个线程存取共享的堆。然而,这个方案可能造成过度的线程阻
塞(特别是如果内存管理是不可确定的)并且可以显著的降低并行性。互斥体也可以造成优
先级倒置。一般的,被一个互斥体保护的堆管理函数不适用于 ISR 因为 ISR 不能阻塞
--------------
以上选自PsiCC2 这本书
回复

使用道具 举报

  离线 

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-11-23
在线时间
19 小时
 楼主| 发表于 2017-9-18 17:38:19 | 显示全部楼层
shikihane 发表于 2017-9-11 20:50
malloc() 和 free() 都(常常)是不可确定的,意味着他们潜在的可能需要一段长的(难以
量化的)执行时间 ...

我看了你说的出处中相关描述,但好像只是说明了这两个函数的缺陷,但现在问题是为什么不在中断中调用这两个函数,你直接得出结论感觉还是有点牵强
回复

使用道具 举报

  离线 

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-11-23
在线时间
19 小时
 楼主| 发表于 2017-9-18 17:41:30 | 显示全部楼层
shikihane 发表于 2017-9-11 20:50
malloc() 和 free() 都(常常)是不可确定的,意味着他们潜在的可能需要一段长的(难以
量化的)执行时间 ...

而且heap4.c中的内存管理函数没有调用这两个函数,耗时的话感觉也不会像这两个函数,不过你的答案确实也让我学到不少,谢谢了。
回复

使用道具 举报

  离线 

8

主题

688

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2011-5-23
在线时间
711 小时
发表于 2017-9-18 17:52:20 | 显示全部楼层
在中断里面申请内存的直接可以拉出去了。
回复

使用道具 举报

  离线 

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-11-23
在线时间
19 小时
 楼主| 发表于 2017-9-18 17:54:48 | 显示全部楼层
aozima 发表于 2017-9-18 17:52
在中断里面申请内存的直接可以拉出去了。

初学者,不知能否解释一下?
回复

使用道具 举报

  离线 

3

主题

232

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1235
金钱
1235
注册时间
2016-2-21
在线时间
238 小时
发表于 2017-9-19 09:25:59 | 显示全部楼层
买一送一 发表于 2017-9-18 17:41
而且heap4.c中的内存管理函数没有调用这两个函数,耗时的话感觉也不会像这两个函数,不过你的答案确实也 ...

关键的两点。一个是只要是内存动态申请,必然涉及到了堆,所以必然是要做共享资源保护的,FreeRTOS里,用了临界区,没毛病。第二,只要是内存的动态管理,必然涉及到了复杂的算法,他的运行时间是带有很强的不确定性的。在中断里跑算法,跑耗时的操作,只会是坑你自己而已。
回复

使用道具 举报

  离线 

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-11-23
在线时间
19 小时
 楼主| 发表于 2017-9-22 17:33:29 | 显示全部楼层
shikihane 发表于 2017-9-19 09:25
关键的两点。一个是只要是内存动态申请,必然涉及到了堆,所以必然是要做共享资源保护的,FreeRTOS里,用 ...

懂了谢谢
回复

使用道具 举报

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

本版积分规则




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

GMT+8, 2017-11-23 04:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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