发新帖本帖赏金 3.00元(功能说明)我要提问
12345
返回列表
打印

事件驱动构架

[复制链接]
楼主: Simon21ic
手机看帖
扫描二维码
随时随地手机跟帖
81
Simon21ic|  楼主 | 2015-10-21 21:17 | 只看该作者 回帖奖励 |倒序浏览
本帖最后由 Simon21ic 于 2015-10-21 21:20 编辑
sanshui28 发表于 2015-10-21 16:58
这个事件驱动架构,能不能简单的说下,从事件缓冲队列里面取出的消息,如何找到对应的执行函数? 是不是在 ...

应该说是消息发给某个线程去处理,每个线程可以认为只是各种事件的处理函数。
我有另一个帖子里,讲了一个简单的使用方式,里面就有线程的代码

使用特权

评论回复
82
keer_zu| | 2015-11-20 09:39 | 只看该作者
这个话题应该继续

使用特权

评论回复
83
Simon21ic|  楼主 | 2015-11-20 20:47 | 只看该作者
本帖最后由 Simon21ic 于 2015-11-20 20:59 编辑

这套构架我们会一直维护下去,虽然并不想考这个盈利,也不打算推广。
做这个的出发点很简单,自己接触过各种系统构架,从裸机,各种状态机构架,专用构架,RTOS的构架,linux等比较大的系统。这些针对不同资源等级的平台,我就想准对现在比较火的CortexM也实现一个相对RTOS而言更加简单,但是也具备多任务能力以及常用的IPC的构架。


如果有兴趣的人多的话,以后我多发一些应用代码,少说一些枯燥的原理。

使用特权

评论回复
84
idterminator| | 2016-3-2 12:09 | 只看该作者
本帖最后由 idterminator 于 2016-3-2 12:10 编辑
Simon21ic 发表于 2015-8-22 18:55
我发这个帖子只是为了讨论技术,可以把状态机轮询构架和状态机事件驱动构架来比较。
不过貌似没有太多人对 ...


很久以前8位机时代,资源紧缺不说,觉得应用场合也用不着系统,稍微复杂点的就用置标志轮询的方法,置了一大堆标志,这似乎就是lz说的状态机轮询,
LZ然开了头就继续呗,对自己也是个总结提炼不是?
感兴趣+1
代码可以少点,原理透彻点最好:)

使用特权

评论回复
85
Simon21ic|  楼主 | 2016-3-3 00:25 | 只看该作者
idterminator 发表于 2016-3-2 12:09
很久以前8位机时代,资源紧缺不说,觉得应用场合也用不着系统,稍微复杂点的就用置标志轮询的方法,置了 ...

代码一般都是点到为止,不过原理要透彻的话,任何一方面都可以写一本书了
有兴趣的话,倒是可以玩玩我之后准备发布的VSFOS,这个到时候会有详细的帖子,说明如何配置、编译、安装

使用特权

评论回复
86
idterminator| | 2016-3-3 09:48 | 只看该作者
Simon21ic 发表于 2016-3-3 00:25
代码一般都是点到为止,不过原理要透彻的话,任何一方面都可以写一本书了
有兴趣的话,倒是可以玩玩我之 ...

关注ing

使用特权

评论回复
87
Simon21ic|  楼主 | 2016-3-12 05:59 | 只看该作者
花了一个通宵大概浏览了一边contiki的源码,很多设计理念上非常相似。原来看了uip了解PT线程的,不过contiki把PT线程发挥的更加全面。相比较,VSF更加年轻,而contiki已有10年的积累了,contiki的内容更加全面,以后可以好好研究一下contiki。不过VSF完全基于事件驱动,没有轮询机制了,甚至main函数的while死循环里,都可以只是休眠,这方面更加彻底。并且,VSF底层还有一个状态机构架,实际上,VSF最早是设计为事件驱动的状态机构架。VSF还支持共享堆栈的longjmp线程。

使用特权

评论回复
88
marmotw| | 2016-3-12 18:36 | 只看该作者
赞楼主的框架。

事件驱动范式的框架所追求的,我想应该是极致的性能。


硬件方面的样本应该是 :
中断, DMA
软件方面的样本应该是 :
完全端口,epoll,另外 libuv,libevent之类的网络库应该也是类似的思想。
顺便回顾了一下事件驱动编程模型的相关知识:
reactor pattern         
Proactor pattern   
还有著名的 C10K 问题。

同一般运行在抢占式多任务的操作系统上的同步式的编程方式相比,事件驱动的程序性能可能会高,因为省去了 context switch所消耗的时间。
但是,事件驱动的编程模型复杂度较高,而且调试起来更麻烦一些。



一些比较新的语言开始重新拾起来合作式多任务的调度方式,比如:
go 语言中推出来 goroutine
lua 语言推出来 coroutine
在保证应用层相对简单性的同时,通过语言层面实现的调度,减少内核context switch的次数,从而获取比较高的运行性能。

另外:还不能发链接,导致好多编辑好的链接都删掉了,等我查一下如何发链接再重新发一遍。

使用特权

评论回复
89
Simon21ic|  楼主 | 2016-3-12 20:59 | 只看该作者
marmotw 发表于 2016-3-12 18:36
赞楼主的框架。

事件驱动范式的框架所追求的,我想应该是极致的性能。

很多软件都使用协程就是因为协程资源占用和切换开销都很小,嵌入式里用这种协作式内核,有时候也可以大大简化设计,全局资源的原子性很容易做到,开销也非常小。所以,协作式内核,一般都实现为为内核。

为什么链接会不能发?

使用特权

评论回复
90
marmotw| | 2016-3-12 21:37 | 只看该作者
Simon21ic 发表于 2016-3-12 20:59
很多软件都使用协程就是因为协程资源占用和切换开销都很小,嵌入式里用这种协作式内核,有时候也可以大大 ...

好象是没有发表链接的权限。

不过好多事件驱动的框架都是C语言实现的,毕竟C语言最有特点的使用场合就是性能攸关的场合。

Co-routines在PC平台上实现的比较多,一般是基于系统本身的线程模型实现。

不过,我碰到的许多场景都是有硬实时需求的场景,靠应用主动释放CPU很多时候会不太可靠。模拟PC平台实现的话,我想应该是系统层面实现抢占式多任务,基于抢占式多任务再实现一套协作式多任务的接口。对于时间攸关的任务,可以使用抢占式多任务。对于不是时间攸关的应用[比如一些不重要的外部通讯],可以考虑用协程接口。
PS : FreeRTOS 好像就实现了 Co-routines,但是用起来有诸多限制。

使用特权

评论回复
91
Simon21ic|  楼主 | 2016-3-13 02:25 | 只看该作者
本帖最后由 Simon21ic 于 2016-3-13 02:30 编辑
marmotw 发表于 2016-3-12 21:37
好象是没有发表链接的权限。

不过好多事件驱动的框架都是C语言实现的,毕竟C语言最有特点的使用场合就是 ...

事件驱动构架下,其实可以有一些灵活的处理方式,因为硬件的中断就是最具备实时性,也可以实现优先级的。

比如,可以用几个中断来驱动一个任务,这个任务就是运行在中断里的,使用高优先级的事件队列,这个可以抢占其他低优先级的事件队列。而其他的并不重要的中断,设置为低优先级,使用低优先级的事件队列。

这种就是完全利用了硬件的中断优先级来实现任务的抢占,VSF构架中,也是可以支持抢占的。比如,可以在main函数里运行一些耗时的算法,比如mp3解码,RSA啥的。然后在Pendsv里,处理一些低优先级的任务,这个就可以抢占main里的任务了。然后,可以把外部中断、定时器中断等等、驱动另一个更高优先级的实时任务。

而协程并不是用来解决实时性的,只是实现了一种资源占用非常小的快速的任务切换机制。即使是C库中的setjmp和longjmp实现的协作式任务调度,在CortexM3上,几条指令就能实现任务切换了。当然,这个也是一种协程,需要任务主动放弃CPU,所以也不解决实时性。

使用特权

评论回复
92
marmotw| | 2016-3-13 08:14 | 只看该作者
本帖最后由 marmotw 于 2016-3-13 08:43 编辑
而协程并不是用来解决实时性的,只是实现了一种资源占用非常小的快速的任务切换机制。即使是C库中的setjmp和longjmp实现的协作式任务调度,在CortexM3上,几条指令就能实现任务切换了。当然,这个也是一种协程,需要任务主动放弃CPU,所以也不解决实时性。
确实,协程不是用来解决实时性的,协程在函数式编程范式中使用较多,我的理解也仅限于此。
事件驱动构架下,其实可以有一些灵活的处理方式,因为硬件的中断就是最具备实时性,也可以实现优先级的。

比如,可以用几个中断来驱动一个任务,这个任务就是运行在中断里的,使用高优先级的事件队列,这个可以抢占其他低优先级的事件队列。而其他的并不重要的中断,设置为低优先级,使用低优先级的事件队列。


很多硬实时场景下,中断上下文只做调度用,除非一些特别的场景,比如只有一个硬实时的任务,否则中断上下文并不建议写逻辑。
原因是中断是硬件级别的,但是很多中断并没有任务重要,不希望过多的中断抢占任务。

以RTLinux为例:
1. 系统tick中断,在中断上下文处理;
2. 其他软中断/硬中断,中断上下文的执行逻辑是: 接受中断,发送消息到中断处理任务,禁止中断。而中断处理任务就是一个实时任务。是否能够获得执行机会,由任务的优先级与系统的负载有关。
     也就是说偏向硬实时的系统中,准时才是最重要的,中断可以丢,吞吐量可以小。

高优先级的事件队列抢占低优先级的事件队列,这个,我需要先学习一下代码才好分析。
以上

使用特权

评论回复
93
Simon21ic|  楼主 | 2016-3-13 12:53 | 只看该作者
本帖最后由 Simon21ic 于 2016-3-13 13:14 编辑
marmotw 发表于 2016-3-13 08:14
确实,协程不是用来解决实时性的,协程在函数式编程范式中使用较多,我的理解也仅限于此。

一般情况下,VSF的中断只是发送事件给时间队列,如果时间队列在pendsv中的话,那就会使能pendsv,这样这个事件的处理就抢占了main函数里的任务。pendsv虽然是中断,但即使里面的代码运行时间长,也只会影响低优先级的任务,不会影响高优先级的任务。而且,为了实时性,有时候就必须在中断里实现业务逻辑。

当然,高优先级的任务占用时间过长并不是好的设计,一般实时任务占用时间短,非实时任务占用时间长。如果要在高实时任务中,占用大量CPU,那即使用RTOS,也无法解决这个问题。
你的例子,就是因为tick是有实时性要求的,就是要在下一个tick来之前处理,这个就是硬实时。如果,系统还控制一个电机,在过流保护中断里的任务的实时性要求更高,那还是需要在中断里处理。所以,这个是看实际应用,做最合理的设计。

使用特权

评论回复
94
marmotw| | 2016-3-13 13:42 | 只看该作者
Simon21ic 发表于 2016-3-13 12:53
一般情况下,VSF的中断只是发送事件给时间队列,如果时间队列在pendsv中的话,那就会使能pendsv,这样这个 ...

给个git看一眼。

另外pendsv是什么?

使用特权

评论回复
95
Simon21ic|  楼主 | 2016-3-13 15:01 | 只看该作者
marmotw 发表于 2016-3-13 13:42
给个git看一眼。

另外pendsv是什么?

github.com/versaloon/vsf
不过建议看文档就行:gitbook.com/book/versaloon/vsf-the-definitive-guide

Pendsv是Cortex处理器里的最低优先级的中断,一些RTOS利用这个做任务切换。我们利用这个实现一个中断里的地优先级事件队列。

使用特权

评论回复
96
lizhengjie| | 2016-5-4 09:03 | 只看该作者
LZ的系统模型可以用UCOSII实现啊,各个任务等待中断发送来信号量,获得信号量后各任务获得运行权。

定时中断定时发送信号量给定时任务,串口接收、超时中断发信号量给串口解析任务。。。

使用特权

评论回复
97
Simon21ic|  楼主 | 2016-5-4 17:31 | 只看该作者
本帖最后由 Simon21ic 于 2016-5-4 19:45 编辑
lizhengjie 发表于 2016-5-4 09:03
LZ的系统模型可以用UCOSII实现啊,各个任务等待中断发送来信号量,获得信号量后各任务获得运行权。

定时中 ...

我现在实现的核心代码在cortexm3上flash占用300多字节,用ucosii有啥优势?
而且,使用ucos的话,还需要支付有一笔客观的授权费用

使用特权

评论回复
98
lizhengjie| | 2016-5-4 21:49 | 只看该作者
Simon21ic 发表于 2016-5-4 17:31
我现在实现的核心代码在cortexm3上flash占用300多字节,用ucosii有啥优势?
而且,使用ucos的话,还需要支 ...

我使用的MCU内存一般都比较大,之前使用过512K的,现在256K的,没有考虑过内存的问题。。。

使用特权

评论回复
99
Simon21ic|  楼主 | 2016-5-4 22:39 | 只看该作者
lizhengjie 发表于 2016-5-4 21:49
我使用的MCU内存一般都比较大,之前使用过512K的,现在256K的,没有考虑过内存的问题。。。 ...

构架的选择,就是需要根据这些实际情况确定的,并不存在那个好那个坏,脱离开这些实际的环境,就去决定用什么系统,那并不好优秀的工程师的做法
我倒是比较好奇ucosii授权费是多少

使用特权

评论回复
发新帖 本帖赏金 3.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则