首页 新闻 会员 周边

keil编程有关于多任务通讯调度的问题!

0
悬赏园豆:20 [已关闭问题] 关闭于 2013-12-10 09:20

基于STM32 在keil上建了一个工程,跑ucosii操作系统,我建立了5个任务
1 采样任务          3   优先级
2 数据处理任务    4
3 通讯任务          5
4 显示任务          6
5 开始任务 任务的优先级按顺序逐渐降低的        10

采样后的数据要给数据处理任务处理,之后由通讯任务上传,这就代表我的任务之间应该是需要同步和通讯的,对吧?

我把采样的数据写到全局变量 一个周期data【30】的数组了,之后数据处理任务读data数据,之后进行处理,采样是20ms采样一周期,也就是20ms就要更新data数组数据,我怕数据丢失,就在数据处理任务中创建了一个大的数据,可以放100个周期的数据。做缓存区。这么做可以吗?

如果可以的话,是不是就代表我的任务同步,和通讯其实不需要信号量,邮箱,消息队列也能实现任务的同步和通讯啊,我现在基本都是这种方法,建立一个数据,一个任务往里写,一个任务往里读。这么做可以吗,有错吗?

树上说,操作系统中,任务之间是看不见的,相互独立的,要想任务之间通信,只能通过信号量,邮箱,队列什么的。,

Darren715的主页 Darren715 | 初学一级 | 园豆:185
提问于:2013-12-06 12:21
< >
分享
所有回答(1)
0

我不知道你想表达什么意思,在你的应用中你可能不需要使用同步机制和消息机制,但并不代表同步机制和消息机制是多余,它们有他们需要的使用场景。

Launcher | 园豆:45045 (高人七级) | 2013-12-06 13:08

这么和你说吧,举个例子你就懂我什么意思了。

我采样周期要求是20ms采样一次,我把采样的数据写在一个data【30】的数组内,我数据处理的任务要到data【30】读数据,之后处理,处理后通讯任务要负责向上层传送。这么看来,其实我的任务还是需要同步的,因为如果采样任务采样后,如果下一次采样任务来临前,数据处理任务还没有来读data【30】的数据,那就代表数据任务有一个或者几个周期的数据,没有读到。因为被采样任务覆盖了。我现在是这么处理的,开辟一个100个周期数据缓存区,把data的数据每次都先移到缓存区中,防止有的数据被丢失。这个data数据并不是什么消息队列,但是能达到数据不丢失,同步的效果吗,我就是这个意思。。。

 

还有一个问题,我现在的每个任务都是通过OSTimeDlyHMSM(0, 0, 0, 100); 任务延迟函数调度的。假如我的采样任务是20ms要采样一次的话,是不是如果调用任务延迟函数,延迟100ms的话就不可以了,只能延迟20ms以内的时间。

支持(0) 反对(0) Darren715 | 园豆:185 (初学一级) | 2013-12-06 13:25

@Darren715: 我这么和你说吧,你如果能用代码逻辑控制了任务执行流程,那么你就不需要同步机制和消息机制。同步机制和消息机制事实上也是通过代码的执行逻辑来控制的,这是 OS 实现的。因为只要你能对你的程序结构了解,知道什么时候该执行什么任务,那么你同样可以把这些同步和消息机制嵌入到你的代码逻辑中而不必使用 OS 提供的同步和消息机制。

对于你这个场景,假设需要改写成生产者-消费者模型,你可以想想该怎么做。因为对于这类问题,通常使用此模式来解决,此模式可以提高程序执行的效率。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2013-12-06 13:36

@Launcher: 我代码里没有控制任务的执行流程,只是一个生产数据,一个使用数据,但是你的意思我懂了,谢谢,我再消化下,这个应该没那么复杂,单片机的程序都扯到编程模式的问题上了。。。 

支持(0) 反对(0) Darren715 | 园豆:185 (初学一级) | 2013-12-06 13:47

@Darren715: “我现在的每个任务都是通过OSTimeDlyHMSM(0, 0, 0, 100); 任务延迟函数调度的”,这就是你的控制流,你延迟调度了一个任务,虽然我没看过你的代码,不知道你是否还存在其它的控制流。数据流编程模型中,代码中没有主动控制任务什么时候执行的语句,所有的任务都是潜在就绪的,都在等待它们各自监视的一个“事件”发生。数据流编程模型在你的场景中很适用,因为所有任务都是基于某个数据就绪后才执行的,这样可以通过无缝的方式连接多个任务按照流程依次执行,每两个任务之间不会有多余的空闲。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2013-12-06 14:02

@Launcher: 我必须要用OSTimeDlyHMSM(0, 0, 0, 100); 来进行调度啊,要不优先级高的任务会一直霸占cpu的。低优先级的任务就运行不了了,因为ucosii不支持时间片轮转的。要不就是自己挂起任务,再有其他任务释放,那其实是一个意思,还不如用OSTimeDlyHMSM(0, 0, 0, 100); 

支持(0) 反对(0) Darren715 | 园豆:185 (初学一级) | 2013-12-06 14:07

@Darren715: 我只是指出“我代码里没有控制任务的执行流程”这句话是错误的,并没有说你“必须”,或者“不必须”使用 OSTimeDlyHMSM 方法。因为你原文提到了“信号量,邮箱,消息队列”,所以我觉得可以通过这些机制来实现数据流编程模型,比如创建一个流程的三个任务,设置一个流程的三种状态( 消息队列),每个任务会在三种状态的一种上等待。这样你就不需要 OSTimeDlyHMSM,只需要在一个任务执行完成后将结果投递给下一个状态,在此状态上等待的任务会被自动激活并执行。

 

一种程序有很多种写法,各有优缺点,你可以自行选择。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2013-12-06 14:18

@Launcher: 哦  我就觉的我这么做感觉不太好,谢谢您。我再想想,我就想一个单片机的嵌入式应用程序,搞的这么复杂,是不是有点小题大做了。。。还得向你们学习学习

支持(0) 反对(0) Darren715 | 园豆:185 (初学一级) | 2013-12-06 14:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册