硬汉嵌入式论坛

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

[FreeRTOS] 驱动是否都需要做互斥访问处理?

[复制链接]

38

主题

82

回帖

196

积分

初级会员

积分
196
发表于 2018-5-28 14:18:09 | 显示全部楼层 |阅读模式
例如uart_write()函数,我直接在里面take一个mutex,如果有别的线程在使用串口就需要等待它释放后才能用。
但如果所有的驱动都这么做的话,就不能在中断里面使用了,否则OS切不了CPU。
所以是否需要这样处理呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2018-5-28 14:38:56 | 显示全部楼层
中断里面做要发消息给任务,在任务里面操作。另外串口这种操作,基本都是一个任务足够用。

所以也就没什么互斥之类的操作,单片机搞这些太臃肿。
回复

使用道具 举报

38

主题

82

回帖

196

积分

初级会员

积分
196
 楼主| 发表于 2018-5-28 14:46:01 | 显示全部楼层
eric2013 发表于 2018-5-28 14:38
中断里面做要发消息给任务,在任务里面操作。另外串口这种操作,基本都是一个任务足够用。

所以也就没什 ...

意思是像FreeRTOS介绍中的,利用一个守护线程来维护所有的串口发送对吧?其他的线程或者中断都只能用queue来通知这个守护线程。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2018-5-28 14:48:21 | 显示全部楼层
yip_1991 发表于 2018-5-28 14:46
意思是像FreeRTOS介绍中的,利用一个守护线程来维护所有的串口发送对吧?其他的线程或者中断都只能用queu ...

对,这种是最简单方便的,适合单片机用。
回复

使用道具 举报

38

主题

82

回帖

196

积分

初级会员

积分
196
 楼主| 发表于 2018-5-28 14:55:55 | 显示全部楼层
本帖最后由 yip_1991 于 2018-5-28 15:09 编辑
eric2013 发表于 2018-5-28 14:48
对,这种是最简单方便的,适合单片机用。

不过这样的话,每个通信的驱动都要单独一个线程来维护了,例如flash读写,spi外设的通信,can的通信,都需要一个,会不会太多余了?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2018-5-28 15:10:16 | 显示全部楼层
yip_1991 发表于 2018-5-28 14:55
不过这样的话,每个通信的驱动都要单独一个线程来维护了,例如flash读写,spi外设的通信,can的通信,都 ...

不会,我看我的这个V6综合Demo。
http://www.armbbs.cn/forum.php?m ... &extra=page%3D1

除了emWin,文件系统和网络协议栈的底层做了互斥,这三个需要多任务操作。

回复

使用道具 举报

38

主题

82

回帖

196

积分

初级会员

积分
196
 楼主| 发表于 2018-5-28 15:11:30 | 显示全部楼层
而且往守护线程发队列消息时应该是以指针的形式,那么还需要有个全局buffer来保存这些临时数据,所以好像也挺臃肿?
回复

使用道具 举报

0

主题

105

回帖

105

积分

初级会员

积分
105
发表于 2018-5-28 23:50:29 | 显示全部楼层
我一般是在task调用的write里都加了mutex,不在中断里进行发送。中断只进行接收存放到缓冲区(或者用DMA+idle中断判断缓冲区end偏移)然后发送信号,从缓冲区读取的接口用二值信号量保护
如果要用中断进行持续发送,像can帧这种,可以在任务操作发送缓冲区的地方添加mutex然后启动发送开启中断,之后就全部由中断自动完成
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2018-5-29 12:01:58 | 显示全部楼层
yip_1991 发表于 2018-5-28 15:11
而且往守护线程发队列消息时应该是以指针的形式,那么还需要有个全局buffer来保存这些临时数据,所以好像也 ...

不用,FreeRTOS搞这个最简单,因为FreeRTOS的消息队列是数据的复制粘贴,不是指针的传递。

即使是指针的传递也比较好弄,一般的处理方法都是申请内存块,传递内存块地址,使用完毕后释放。
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2018-7-18 13:28:40 | 显示全部楼层
yip_1991 发表于 2018-5-28 14:46
意思是像FreeRTOS介绍中的,利用一个守护线程来维护所有的串口发送对吧?其他的线程或者中断都只能用queu ...

串口这个办法是适合的,对于SPI,IIC等总线来说,如果只有一个设备使用该总线,则不需要考虑做保护。如果大于1个设备使用该总线,则需要添加总线递归互斥量,保护底层对于字节操作的区域即可。
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2018-7-18 13:29:01 | 显示全部楼层
yip_1991 发表于 2018-5-28 14:46
意思是像FreeRTOS介绍中的,利用一个守护线程来维护所有的串口发送对吧?其他的线程或者中断都只能用queu ...

串口这个办法是适合的,对于SPI,IIC等总线来说,如果只有一个设备使用该总线,则不需要考虑做保护。如果大于1个设备使用该总线,则需要添加总线递归互斥量,保护底层对于字节操作的区域即可。
回复

使用道具 举报

0

主题

105

回帖

105

积分

初级会员

积分
105
发表于 2018-7-18 15:23:27 | 显示全部楼层
我的做法是,一个端口一个二值信号量。
发送使用dma发送,在dma的TC中断中发送信号量。线程调用发送数据之前会先请求信号量
线程中利用自定义的block形式内存管理,在TC中断中free释放
回复

使用道具 举报

38

主题

82

回帖

196

积分

初级会员

积分
196
 楼主| 发表于 2018-7-20 16:11:04 | 显示全部楼层
barryxiao 发表于 2018-5-28 23:50
我一般是在task调用的write里都加了mutex,不在中断里进行发送。中断只进行接收存放到缓冲区(或者用DMA+id ...

对的  我也是这么搞
然后完成中断里释放Mutex
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2019-1-8 11:05:20 | 显示全部楼层
yip_1991 发表于 2018-7-20 16:11
对的  我也是这么搞
然后完成中断里释放Mutex

互斥信号量不能使用在中断中啊,释放Mutex会无效
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 17:34 , Processed in 0.195228 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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