打印
[STC单片机]

一起讨论单片机的多任务,以stc12c5a60s2为例。

[复制链接]
8800|53
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cellagent|  楼主 | 2013-10-29 12:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对单片机了解不多,所以发帖同大家一起讨论。
现在的产品趋向智能化,处在实际环境中的产品要实现功能与控制,需要有一个微控制器(仅限于单片机,对微处理器、嵌入式认识很肤浅)。处在实际环境的单片机我把它看成一个智能体(agent),它应具备以下几个模块:1)电源模块;2)传感器模块;3)通信模块(无线方式);4)执行模块(例如马达、继电器);5)维护与存储模块。一块单片机,它对这些模块怎样进行管理呢?它需要实时监听是否有无线命令下发,也要隔一段时间上发心跳信号(对主机说明其存在)。在接受到特定指令后,启动传感器模块检测环境(V/A,温度,湿度等),将数据上传。或启动马达,行进指定长度等。这些任务是怎样切换或者触发的呢?中断方式?查询方式?时间片?任务能够同时进行吗?stc12c5a60s2的两个定时器是能够同时运行的,可以实现类似的功能吗?
希望有兴趣的朋友一起讨论,也为了兴趣爱好。共同进步!

相关帖子

沙发
airwill| | 2013-10-29 12:19 | 只看该作者
这个项目是够复杂的, 可以考虑上个 OS 了.
这么的问题, 怎么解决呢, 根据要求来确定吧, 特别是允许的响应时间, 这个指标也很重要

使用特权

评论回复
板凳
autopccopy| | 2013-10-29 12:52 | 只看该作者
上OS吧!

使用特权

评论回复
地板
JasonWangSE| | 2013-10-29 13:01 | 只看该作者
同意2楼,楼主有量化的时间指标么?

使用特权

评论回复
5
coody| | 2013-10-29 13:52 | 只看该作者
一般的状态机就可以在一定时间内并行运行多任务了。
用OS也可以,但是要简单的OS,毕竟是8位机。我一般用查询方式的OS,要立即响应的放中断。

使用特权

评论回复
6
cellagent|  楼主 | 2013-10-29 14:14 | 只看该作者
airwill 发表于 2013-10-29 12:19
这个项目是够复杂的, 可以考虑上个 OS 了.
这么的问题, 怎么解决呢, 根据要求来确定吧, 特别是允许的响应时 ...

如果加入操作系统,就变为讨论嵌入式了,ARM,linux,我觉得单片机应该能完成这样的工作。目前我的进度是:主端接收串口指令,用无线发出去,从端接收指令,进行电压、电流、温度检测,将测得的数据保存起来。接下来的任务是从端将数据发送给主端,主端把数据通过串口传至pc,用软件对数据进行相应的处理,如显示、分析等。如此,每个端子都集收发于一体。接收无线信号应该是被动的,不断扫面接收端口,通过中断来触发。发送又分主动和被动部分,从机的心跳信号就是主动发送的,检测信号是在接收到指令后被动发送的。我现在的问题是不能在主体上清楚的布置程序。需要实时进行的功能用中断实现,执行一次的写成子函数或用查询方式。

使用特权

评论回复
7
cellagent|  楼主 | 2013-10-29 14:16 | 只看该作者
coody 发表于 2013-10-29 13:52
一般的状态机就可以在一定时间内并行运行多任务了。
用OS也可以,但是要简单的OS,毕竟是8位机。我一般用查 ...

谢谢你的回复。你说的查询方式的OS是什么?可以详细说说你的方法吗?

使用特权

评论回复
8
cellagent|  楼主 | 2013-10-29 14:25 | 只看该作者
JasonWangSE 发表于 2013-10-29 13:01
同意2楼,楼主有量化的时间指标么?

谢谢你的回复。还没细化,每隔一段时间进行扫描应该是比较常用的方式。整体方案还没有定下来,我是从下往上做方案的,先把功能模块做好,然后把各个功能模块整合在一起。现在愈发觉得程序难以布置了,任务的调度也没静下心来想清楚。

使用特权

评论回复
9
ayb_ice| | 2013-10-29 15:11 | 只看该作者
51就不要整RTOS了

使用特权

评论回复
10
烟花不堪剪| | 2013-10-29 15:21 | 只看该作者
单片机也是嵌入式,无论有OS还是没有OS,也无论是51还是ARM哪怕是因特尔的处理器,只要是一个专用的计算机系统那就都属于嵌入式。对于FPGA/CPLD虽然也是可“编程”的但本质上是一个硬件电路,它的“代码”并不是计算机程序,不过现在的FPGA/CPLD芯片越来越系统化,内部会集成一个硬核或软核的CPU,这个时候又就具有嵌入式的特性了。。。

使用特权

评论回复
11
cellagent|  楼主 | 2013-10-29 15:39 | 只看该作者
烟花不堪剪 发表于 2013-10-29 15:21
单片机也是嵌入式,无论有OS还是没有OS,也无论是51还是ARM哪怕是因特尔的处理器,只要是一个专用的计算机 ...

谢谢你的回复。我其实也没把单片机跟嵌入式分立起来,我的目的是用单片机实现当前的功能,还不至于使用带操作系统的“嵌入式系统”。我不知道怎样详细表述,辞穷。目的是用单片机实现多任务。

使用特权

评论回复
12
ayb_ice| | 2013-10-29 16:34 | 只看该作者
多任务就是多调用

使用特权

评论回复
13
coody| | 2013-10-29 16:41 | 只看该作者
cellagent 发表于 2013-10-29 14:16
谢谢你的回复。你说的查询方式的OS是什么?可以详细说说你的方法吗?

轮询方式的OS,就是所有任务都是按顺序执行,没有优先级。一个任务要运行完成并且切换出去,放弃对CPU的使用,别的任务才有机会运行。当等待的节拍到,任务重新运行。

使用特权

评论回复
14
JasonWangSE| | 2013-10-29 16:44 | 只看该作者
楼主是用的主、从两个单片机吗?说一下我根据你提供的信息的理解:设主单片机为A,从单片机为B,则
A的任务是:
1. 接收PC的串口指令,可以用中断的方式,收到指令后置一个flag,在后台可以查询这个flag来决定是否通过无线模块给B发指令
2. 无线发送,可以用轮询方式,在后台轮询串口置的flag来向B发无线指令
3. 定时器检测心跳,用中断方式,如果在指定时间内未接收到从机心跳,定时器上报中断,向PC上报错误
4. 无线接收,可以用中断方式,接收数据和心跳,在无线报文中设置标志来区分心跳和检测数据。处理时判断如果是心跳,将心跳定时器重置;如果是数据,存入缓冲区,并置data标志
5. 向PC通过串口发送检测数据,用后台轮询方式,轮询到data标志后,启动串口发送并打开发送中断,发送中断用来发送其余的数据,直到将缓冲区数据发完
就是不清楚你的无线是否是全双工的,如果是就没什么问题,如果不是无线模块的接收和发送还要做互斥

B的任务是:
1. 向A发送心跳,用定时器启动发送,可以在定时器中断里做无线发送,也可以置标志在后台轮询来启动发送,得看无线发送的操作是否复杂
2. 接收A通过无线发送的指令,可以用中断方式,收到数据后置一个flag,在后台可以查询这个flag来决定是否进行检测数据采集
3. 环境检测数据采集,可以在后台用轮询方式,轮询到采集flag标志后开始采集各检测器件的数据,各器件的总线时序如果要靠软件模拟,得做好关中断
4. 通过无线向A发送检测数据,用轮询方式,轮询到检测数据采集完成的标志后发送数据
任务1和任务4都会使用无线模块发送数据,需要做报文的互斥,如果任务1是在中断中处理,还得做设备的互斥。建议将无线报文的发送都放到后台来轮询,因为心跳的优先级要高,如果任务4正在发送数据,这时如果心跳定时器来中断,要在中断中发心跳不太好操作

不了解楼主说的这个无线模块是什么样的,不知道这样处理可不可以。。。

使用特权

评论回复
15
cellagent|  楼主 | 2013-10-29 17:21 | 只看该作者
coody 发表于 2013-10-29 16:41
轮询方式的OS,就是所有任务都是按顺序执行,没有优先级。一个任务要运行完成并且切换出去,放弃对CPU的 ...

谢谢,长知识了。:)

使用特权

评论回复
16
cellagent|  楼主 | 2013-10-29 17:21 | 只看该作者
syj13691669012 发表于 2013-10-29 17:00
专业pcb打样和小批量生产厂家,杂色油墨收费、单双面板最快12小时交货。有需要联系朱先生13691669012  qq15 ...

:curse:

使用特权

评论回复
17
cellagent|  楼主 | 2013-10-29 18:12 | 只看该作者
JasonWangSE 发表于 2013-10-29 16:44
楼主是用的主、从两个单片机吗?说一下我根据你提供的信息的理解:设主单片机为A,从单片机为B,则
A的任务 ...

谢谢你的回复,有心了!我今天就在设计程序,具体怎样实现还在测试中。两块单片机是主从关系,按你的,设主为A,从为B,都具有发送与接收的功能。程序流程是这样的:
1、注册
1)B上电发向A送注册信息,上电时已完成电压、电流是否超限的判断,ds18b20测得的环境温度值,pt100测得的线表温度;
2)A向B下发确认并查询B检测数据(电压、电流是否超限标志,温度)的指令;
3)B上传检测数据,完成注册
2、实时过程
1)A可指定B执行某一功能(例如,线表温度),B完成注册后,监测电压、电流是否超限的程序在执行,超限就自行调用继电器模块断开线路,延时一定时间后自行调用继电器闭合线路,以避开超限值,并主动上传警告。另外的程序则等待A发命令来调用,B完成某一功能后将结果上传
2)A接收警告、异常、检测数据,将其上传至pc端
3)A下发心跳命令,检测B是否还在线,B在线就发确认信号
过程大致是这样的。我也说不上单端的收发是不是全双工方式,因为从机有主动上传注册、异常的权利,此时主机需要中断手中的工作,向pc上传异常。我现在的问题是单端的收发怎样设计,当没有指令的时候,A,B应该处于何种状态。

使用特权

评论回复
18
cellagent|  楼主 | 2013-10-29 18:14 | 只看该作者
JasonWangSE 发表于 2013-10-29 16:44
楼主是用的主、从两个单片机吗?说一下我根据你提供的信息的理解:设主单片机为A,从单片机为B,则
A的任务 ...

你的思路我会参考的,真的非常感谢!对于被动的功能,我想尽量避开中断,实时的功能就采用中断。

使用特权

评论回复
19
JasonWangSE| | 2013-10-29 19:26 | 只看该作者
cellagent 发表于 2013-10-29 18:14
你的思路我会参考的,真的非常感谢!对于被动的功能,我想尽量避开中断,实时的功能就采用中断。 ...

不用客气,大概了解你的应用场景了。我说的全双工意思是想问无线模块是不是可以同时进行接收和发送,比如这个模块在接收数据时是不允许单片机向它写数据请求发送的,那它就不是全双工;在发送时就要去判断模块是不是busy,这样操作起来可能要比较麻烦一点。
还有一点要确认的就是无线模块是怎么工作的,是既支持中断模式也支持轮询模式吗?是不是它内部有发送和接收buffer,如果收到数据或者数据发送完成就可以向单片机报中断?还是要单片机按顺序执行一串指令它才会去收发数据?我对这点不是很了解。。。
不过有两点我和你的观点不太一致,一就是心跳是A查询B才发送,还是B主动发送的问题,我觉得B主动发送会减少一些开销和带宽,可能会好一些;二就是被动功能是采用轮询还是中断模式的问题,我觉得被动功能是你不知道什么时候会发生程序,用中断实时性和开销会更好些,反倒是主动的功能是你安排好了什么时候去执行的操作,可以不使用中断。只是我个人的看法哈,可以一起讨论讨论

使用特权

评论回复
20
unciauncia| | 2013-10-29 19:58 | 只看该作者
51貌似有个简单的RTX操作系统,你可以试试,不知道能不能符合要求

使用特权

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

本版积分规则

19

主题

171

帖子

3

粉丝