你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

FreeRTOS如何在中断中内存分配

[复制链接]
黑皮男 提问时间:2016-11-13 16:14 /
最近在玩FreeRTOS,遇到一个问题,就是不知如何在中断中调用内存分配函数。pvPortMalloc函数中会调用xTaskResumeAll,而这个函数不能再中断调用,所以请问在中断中进行内存分配的情况该如何处理。
收藏 1 评论15 发布时间:2016-11-13 16:14

举报

15个回答
高二毛 回答时间:2016-11-15 08:42:52
本帖最后由 高二毛 于 2016-11-15 08:44 编辑
黑皮男 发表于 2016-11-14 17:41
不知我的理解是否正确,按照你说的,如果把数据接收处理部分,USB,串口等都放到一个任务,而这个任务优 ...

可能我没有说清楚,啰嗦一下:
1,中断函数里面接收数据。保存到(通常全局)缓冲区
2,中断出来之后,相关的任务,分析(接收数据)缓冲区数据,该做如何处理按照需要来就行,包括协议判断等等内容。
3,如果需要发送数据,在任务中组好包,启动数据发送
4,发送中断函数中只是在进入中断的时候,简单判断是否有数据还需要发送,如果没有,就表示数据发送完毕了。

这样一个结构:
1,中断(串口,U口,网口)函数只是干数据收,发。不负责解析数据内容。
2,任务负责解析数据内容和协议,并进行处理。
各司其职。
假如后续你更换数据协议了,底层的驱动(中断和HAL操作)都不用修改。只需要修改任务中的处理函数就行。另外,分析数据的任务优先级可能没有必要再最高优先级,通常在整机不是很繁忙的时候,数据处理都是很快的。保证任务顺利调度就行。
当然,最高优先级当然好。先看看有没有更紧急的事情需要做。

有些开发者通常会将协议的解析(比如数据头,尾,校验,长度等)放到中断处理函数中,不建议这个搞。

不知道这次说明白了没有。

评分

参与人数 1ST金币 +5 收起 理由
zero99 + 5

查看全部评分

高二毛 回答时间:2016-11-14 08:48:24
为什么要在中断中分配内存呢?中断里面处理的事情越少越好。可以弄个信号量在中断中通知,由外部的任务完成具体的工作。
天外流星_0 回答时间:2016-11-14 08:49:02
为什么要在中断中用到内存分配??
jcx0324 回答时间:2016-11-14 08:51:11
有风险的                     
黑皮男 回答时间:2016-11-14 12:35:51
高二毛 发表于 2016-11-14 08:48
为什么要在中断中分配内存呢?中断里面处理的事情越少越好。可以弄个信号量在中断中通知,由外部的任务完成 ...

说的也有道理,我是想在串口接受完数据包后,通过队列把数据包发送到队列中,看来还得重新调整一下通信逻辑。
黑皮男 回答时间:2016-11-14 12:37:13
天外流星_0 发表于 2016-11-14 08:49
为什么要在中断中用到内存分配??

看来楼上的回复,想到了之前看到的教程,可以把中断和任务进行同步,来达到目的
高二毛 回答时间:2016-11-14 15:16:29
本帖最后由 高二毛 于 2016-11-14 15:18 编辑
黑皮男 发表于 2016-11-14 12:35
说的也有道理,我是想在串口接受完数据包后,通过队列把数据包发送到队列中,看来还得重新调整一下通信逻 ...

可以再优化一下逻辑:串口 ,USB,网络都是通讯的手段,不应该(当然不是说不可以)在中断里面判断数据是否收发完毕,也不应该判断收到的什么数据。应该交付给上层处理。这样分层进行设计。将来程序的可移植性就非常强了。要不然你一个通讯协议修改一下串口中断驱动。大量的时间做一些不重要的工作。
黑皮男 回答时间:2016-11-14 17:34:45
高二毛 发表于 2016-11-14 15:16
可以再优化一下逻辑:串口 ,USB,网络都是通讯的手段,不应该(当然不是说不可以)在中断里面判断数据是 ...

如果在任务中完成所有的数据接收处理,会不会由于任务切换而导致数据来不及读取而漏掉部分数据。担心的就是这个
黑皮男 回答时间:2016-11-14 17:41:35
高二毛 发表于 2016-11-14 15:16
可以再优化一下逻辑:串口 ,USB,网络都是通讯的手段,不应该(当然不是说不可以)在中断里面判断数据是 ...

不知我的理解是否正确,按照你说的,如果把数据接收处理部分,USB,串口等都放到一个任务,而这个任务优先级设置最高,中断退出后就可以进入该任务进行数据接收,这样应该就不会有遗漏数据的问题了。非常感谢指点
硕漓 回答时间:2016-11-15 09:07:23
到到到到
黑皮男 回答时间:2016-11-15 09:26:45
高二毛 发表于 2016-11-15 08:42
可能我没有说清楚,啰嗦一下:
1,中断函数里面接收数据。保存到(通常全局)缓冲区
2,中断出来之后,相 ...

非常感谢,明白了
zbber 回答时间:2016-11-15 10:13:18
为什么要在中断中用到内存分配??
黑皮男 回答时间:2016-11-15 12:58:16
zbber 发表于 2016-11-15 10:13
为什么要在中断中用到内存分配??

其希望串口中断接收的数据包通过队列发送给相应的任务进行处理,楼上已帮解答,非常感谢
中山无雪 回答时间:2016-11-16 01:52:50
想玩死自己???

还是别再中断中分配内存什麽的,太危险了,在中断中处理的事情越少越好!!!
真的有数据需要处理,可以使用event,在task中做数据处理
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版