你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
黑皮男 发表于 2016-11-14 17:41 不知我的理解是否正确,按照你说的,如果把数据接收处理部分,USB,串口等都放到一个任务,而这个任务优 ...
查看全部评分
高二毛 发表于 2016-11-14 08:48 为什么要在中断中分配内存呢?中断里面处理的事情越少越好。可以弄个信号量在中断中通知,由外部的任务完成 ...
天外流星_0 发表于 2016-11-14 08:49 为什么要在中断中用到内存分配??
黑皮男 发表于 2016-11-14 12:35 说的也有道理,我是想在串口接受完数据包后,通过队列把数据包发送到队列中,看来还得重新调整一下通信逻 ...
高二毛 发表于 2016-11-14 15:16 可以再优化一下逻辑:串口 ,USB,网络都是通讯的手段,不应该(当然不是说不可以)在中断里面判断数据是 ...
高二毛 发表于 2016-11-15 08:42 可能我没有说清楚,啰嗦一下: 1,中断函数里面接收数据。保存到(通常全局)缓冲区 2,中断出来之后,相 ...
zbber 发表于 2016-11-15 10:13 为什么要在中断中用到内存分配??
可能我没有说清楚,啰嗦一下:
1,中断函数里面接收数据。保存到(通常全局)缓冲区
2,中断出来之后,相关的任务,分析(接收数据)缓冲区数据,该做如何处理按照需要来就行,包括协议判断等等内容。
3,如果需要发送数据,在任务中组好包,启动数据发送
4,发送中断函数中只是在进入中断的时候,简单判断是否有数据还需要发送,如果没有,就表示数据发送完毕了。
这样一个结构:
1,中断(串口,U口,网口)函数只是干数据收,发。不负责解析数据内容。
2,任务负责解析数据内容和协议,并进行处理。
各司其职。
假如后续你更换数据协议了,底层的驱动(中断和HAL操作)都不用修改。只需要修改任务中的处理函数就行。另外,分析数据的任务优先级可能没有必要再最高优先级,通常在整机不是很繁忙的时候,数据处理都是很快的。保证任务顺利调度就行。
当然,最高优先级当然好。先看看有没有更紧急的事情需要做。
有些开发者通常会将协议的解析(比如数据头,尾,校验,长度等)放到中断处理函数中,不建议这个搞。
不知道这次说明白了没有。
评分
查看全部评分
说的也有道理,我是想在串口接受完数据包后,通过队列把数据包发送到队列中,看来还得重新调整一下通信逻辑。
看来楼上的回复,想到了之前看到的教程,可以把中断和任务进行同步,来达到目的
可以再优化一下逻辑:串口 ,USB,网络都是通讯的手段,不应该(当然不是说不可以)在中断里面判断数据是否收发完毕,也不应该判断收到的什么数据。应该交付给上层处理。这样分层进行设计。将来程序的可移植性就非常强了。要不然你一个通讯协议修改一下串口中断驱动。大量的时间做一些不重要的工作。
如果在任务中完成所有的数据接收处理,会不会由于任务切换而导致数据来不及读取而漏掉部分数据。担心的就是这个
不知我的理解是否正确,按照你说的,如果把数据接收处理部分,USB,串口等都放到一个任务,而这个任务优先级设置最高,中断退出后就可以进入该任务进行数据接收,这样应该就不会有遗漏数据的问题了。非常感谢指点
非常感谢,明白了
其希望串口中断接收的数据包通过队列发送给相应的任务进行处理,楼上已帮解答,非常感谢
还是别再中断中分配内存什麽的,太危险了,在中断中处理的事情越少越好!!!
真的有数据需要处理,可以使用event,在task中做数据处理