打印

裸奔系统,如何实现多个任务使用1个I/O资源

[复制链接]
2699|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
snakeemail|  楼主 | 2009-12-31 18:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 snakeemail 于 2010-1-1 10:18 编辑

2.现在单片机自身有一个模拟串口资源,半双工的。200mS内实现收发一次。单片机是主机,通过模拟串口和一个外设通讯.
3.问题是:单片机有两个任务A和B,它们都要用模拟串口收发,如何排队实现。


4.如果是操作系统,他会有个信号量,让A使用,让B等待,直到A使用完,释放资源。然后B使用。裸奔的怎么办?

相关帖子

沙发
HWM| | 2009-12-31 19:44 | 只看该作者
通常串口是一对一的,要实现一对多必须对串口进行改造或另寻他法。若一对多的话,命令内含地址段可以分辨不同的命令和路径。至于超时处理,不会简单地再发一条命令,而应有相应的协议保证确实为出错状态(如由于干扰而丢失信息)。最简单的超时处理规则(或协议)是,时间超出了正常情况下最大的时间上限(超出这个时限意味着出错是个大概率事件)。按此原则,不会在如此短的时间内再发一条指令。

如果要强调实时性(硬实时),此类方式(超时处理)不妥。

使用特权

评论回复
板凳
snakeemail|  楼主 | 2009-12-31 20:15 | 只看该作者
可以两个任务“同时”用一个资源。例如两个任务同时用一个打印机,A要打印I'm a. B要打印I'm b.如果不用信号量,打印出来的就是II'mm a.b.使用信号量后,A先打印,直到打印完成后,B才能使用。

我的问题类似,要A先使用模拟串口,A用完了B才能用模拟串口,B只是等待的时间长一些,但是并没有不执行这个任务。

使用特权

评论回复
地板
HWM| | 2009-12-31 20:28 | 只看该作者
信号量是表示物理资源的被使用状态,这是资源分享中所必须要的。但每个请求都有一个设别信息,用以标识此请求的所属主人(可以是一个进程)。如果不考虑实时性,等待时间的长度可能没有严格的限制,但总有一个合理的上限(不可能等上一天吧)。而这个上限就可以用来规定超时出错时间。

使用特权

评论回复
5
snakeemail|  楼主 | 2009-12-31 21:05 | 只看该作者
单片机自身使用串口的时间多些,平时单片机每200ms就调用一次模拟串口,而PC很少使用,所以我想当PC要用的时候,就加长单片机的等待时间,当PC释放了资源后,单片机还可以自己发出命令。

使用特权

评论回复
6
leolle| | 2009-12-31 21:57 | 只看该作者
你能把问题说得更明白些吗?看你的问题都有些吃力

使用特权

评论回复
7
snakeemail|  楼主 | 2009-12-31 23:43 | 只看该作者
Is that clear?:$

使用特权

评论回复
8
杨工| | 2009-12-31 23:53 | 只看该作者
问题本身看不大明白
1,串口两用有无电子开关切换?还是直接并联。
2,任务A和外设收发,谁是主?单片机还是外设?
3,PC机和单片机之间,谁是主?
4,外设程序是否自己写的?能否更改?
模拟与否好像和问题无关。

使用特权

评论回复
9
ejack| | 2010-1-1 06:59 | 只看该作者
1. 如果任务A与任务B共用物理层,比较理想是通过协议实现共用。当然这还取决于所要连接的设备。
2. 裸奔如何不能实现信号量?LZ这个说法很是奇怪。

使用特权

评论回复
10
snakeemail|  楼主 | 2010-1-1 10:21 | 只看该作者
1,串口两用有无电子开关切换?还是直接并联。答:只有一个模拟串口,没有什么并联
2,任务A和外设收发,谁是主?单片机还是外设? 答:任务A和B都是主。
3,PC机和单片机之间,谁是主? 答:PC是主。
4,外设程序是否自己写的?能否更改? 答:更改外设程序有什么用吗?
模拟与否好像和问题无关。答:我只是说只有一个模拟串口资源。

2. 裸奔如何不能实现信号量?LZ这个说法很是奇怪。答:我是说如何实现,没有说不能实现

使用特权

评论回复
11
leech42| | 2010-1-1 10:35 | 只看该作者
模拟串口收发加一占用信号标志,AB任务调用发送时,置标志,发送完成清标志,不就实现AB任务排队发送啦!

使用特权

评论回复
12
desert_hawk| | 2010-1-1 11:27 | 只看该作者
看了楼主的问题有点费解。裸奔中的“任务”一般是轮流执行,一个任务执行完,另一个才开始,几乎不会存在资源冲突的问题。
还是楼主的“裸奔”是模仿OS的任务切换的方式“裸奔”?

使用特权

评论回复
13
ccy668| | 2010-1-1 19:19 | 只看该作者
1# snakeemail

这不是很简单吗? 设一个全局全量, 初值为0, 当某个任务使用串口时, 置变量为1, 用完再置0, 另一个任务要使用串口,先判断变量是否为0, 不为0则等待, 操作系统的信号量也是这个原理啊!

使用特权

评论回复
14
暮然| | 2010-1-2 23:30 | 只看该作者
不知道理解对没有。

底层和应用分开就好办些吧,串口发送设定缓存区,用户只管往里边写数据,A任务发送了,B再发送。
从底层方面来说没区别,他就管把缓冲的数据一一发送就是。用户任务无须等待。

使用特权

评论回复
15
wgj_fly| | 2010-1-4 13:05 | 只看该作者
扩展串口,分别发送,不就可以了吗

使用特权

评论回复
16
天地有源| | 2010-1-4 14:58 | 只看该作者
模拟串口接收一定要设置成最高级别中断,才能保证不丢数据!
模拟串口发送就无所谓,有空就发送,发送过程一定不能被打断,否则出错,所以模拟串口最好半双工工作!无法做,做不到真正的全双工工作.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

547

主题

1910

帖子

8

粉丝