打印

抢占式事件驱动的一些应用举例

[复制链接]
3008|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Simon21ic|  楼主 | 2015-11-3 00:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
考虑我的另一个帖子,最近为我的事件驱动构架,增加了抢占的功能。
这里就举几个应用例子。

1. 奇葩的main函数:
按照之前设计的,main函数是最低的优先级,里面一般放CPU占用比较多的任务,比如一些高强度运算。
当时,当系统没有这些高强度运算的话,那么main函数就会退化成最简单的形式:
int main(void)
{
  // 高优先级事件队列初始化以及任务初始化
  // 开中断
  while (1)
  {
    // 系统休眠
  }
}
这种情况下,main函数中,不需要事件队列,因为所有事件都在PendSV中已经得到了处理。所以,main函数里,while(1)里直接休眠就行。
这时,系统的运行方式就退化为全中断运行方式,所有的任务,都在中断里处理完毕。
当然,这里的前提就是所有事件的处理,都不会有占用过多CPU的情况

2. 处理一些CPU占用过多,但是,仍旧需要保证一些任务的实时性
之前的VSF构架,是协作式内核,如果一个任务占用过多CPU,会导致其他任务都会阻塞。
增加了抢占式的事件队列后,就可以解决这个问题。
比如,可以在main里,计算RSA,AES,MP3,浮点数运行,虚拟机处理等事物。
但是,同时,PendSV里的事件队列仍旧可以正常响应,不会因为main函数里的代码占用过多CPU而影响实时性。
这里也举个简单的例子:
一个基于wifi的tcpip应用,其中有MP3软解码,还有FFT运算。
那么软解码部分以及后续的FFT运算都是放在main的中执行。
而tcpip协议栈等其他各个任务,都可以放在PendSV中运行,因为这些任务都是由中断触发,然后发送事件(并且设置PendSV激活),然后在PendSV中,处理这些事件。
这样,各个中断,包括wifi,定时器等,都可以得到抢占式的响应。

后面会用这种方式,实现一个基于wifi的音响来测试这套抢占式的事件驱动构架。
未完待续。。。

相关帖子

沙发
Simon21ic|  楼主 | 2015-11-3 00:56 | 只看该作者
本帖最后由 Simon21ic 于 2015-11-18 02:02 编辑

第一个应用,网络收音机,处理器同时跑网络协议栈,以及MP3软解
MP3软解一般会阻塞占用一定的CPU资源,所以这个放在main的事件队列里实现
TCPIP需要比较快的响应速度,不能因为MP3解码而影响速度,所以,放在了pendsv的可抢占的事件队列里

这样,网络协议栈上,跑的各种其他应用,就不会被MP3软解占用过多的CPU资源,而运行缓慢了

目前使用新塘的NUC505,实测wifi的TCP性能在1.5MB/s,SDIO使用32M,以后硬件优化之后可以试一下50M频率。
MP3软解使用helix

实现上,做了一个流驱动,流入MP3数据,流出解码后的数据接到audio的流驱动接口,然后通过内置的codec直接播放了
同时,tcpip上还实现了其他功能的协议,这个以后再公开

当然,由于505的资源相对较少,系统以后还会使用动态加载的方式
比如,如果播放的音乐在505的USB主机口外接的U盘里的话,那么就加载U盘文件的读取模块,把文件流连接到解码模块
如果音乐在网上的话,就加载相应的协议模块,比如HTTPC、Rtp、rstp等,也同样,把一个TCP流或者UDP流接到解码模块

使用特权

评论回复
板凳
Simon21ic|  楼主 | 2015-11-3 00:56 | 只看该作者
占几个楼,以后发应用示例

使用特权

评论回复
地板
Simon21ic|  楼主 | 2015-11-16 16:56 | 只看该作者
keer_zu 发表于 2015-11-16 14:15
可以用来替代ucos之类吗?具体定位是什么?要解决什么问题?

不是用来替代ucos,只是提供一个非常精简的多任务开发环境,适合小内存的32为处理器

使用特权

评论回复
5
keer_zu| | 2015-11-16 17:45 | 只看该作者
Simon21ic 发表于 2015-11-16 16:56
不是用来替代ucos,只是提供一个非常精简的多任务开发环境,适合小内存的32为处理器 ...

我以前在avr上用过ucos,现在的32位还有多大内存的?

使用特权

评论回复
6
Simon21ic|  楼主 | 2015-11-16 21:20 | 只看该作者
keer_zu 发表于 2015-11-16 17:45
我以前在avr上用过ucos,现在的32位还有多大内存的?

avr用ucos其实不太适合的,资源限制相对较多,任务多一些就不够用了
32位1-2K的也有,100-200K的也有,这个怎么说呢?

使用特权

评论回复
7
keer_zu| | 2015-11-17 08:21 | 只看该作者
Simon21ic 发表于 2015-11-16 21:20
avr用ucos其实不太适合的,资源限制相对较多,任务多一些就不够用了
32位1-2K的也有,100-200K的也有,这 ...

07年的时候,一款基于atmage64的产品用了ucos方便多了。

使用特权

评论回复
8
Simon21ic|  楼主 | 2015-11-18 01:42 | 只看该作者
keer_zu 发表于 2015-11-17 08:21
07年的时候,一款基于atmage64的产品用了ucos方便多了。

操作系统实际是资源换开发效率,相对于ucos,其实还有更加适合8位处理器的系统
当然,资源足够的话,不管用什么,成本已经一样了

使用特权

评论回复
9
keer_zu| | 2015-11-18 08:40 | 只看该作者
Simon21ic 发表于 2015-11-18 01:42
操作系统实际是资源换开发效率,相对于ucos,其实还有更加适合8位处理器的系统
当然,资源足够的话,不管 ...

那款产品很成功的。

使用特权

评论回复
10
overdo| | 2015-12-2 17:15 | 只看该作者
其实楼主所说的东西,在《UML状态图的实用C/C++设计》(Practical UML Statecharts in C/C++, 2nd Edition)中有详细的讲解,软件架构设计主要目的是给人用的,本就应该把复杂的东西简单化。QP Frameworks的作者就用了很多例子来说明,为什么要这么做,为什么事件要发布与订阅事件,为什么要做层次化的状态机等。以至于用QM图形化工具,让原本复杂的东西简单化,图形化。让使用框架的人,只需要简单的勾勒,就能实现一副美丽的画卷(我也曾经尝试用QP框架在一天时间内,未在网上搜过攻略,就做了一个在stm32上跑的俄罗斯方块程序)。作者Miro Samek拥有几十年的嵌入式经验了,讲现有的事件驱动状态机做了详细的汇总。其实很多嵌入式程序都是基于这样的思想设计的,包括TI的OSAL,FreeRTOS的不可剥夺模式等。希望楼主能将自己的框架做的更浅显易懂些,对于用户来说,没有必要都能去熟悉框架的精髓,他们只需要会使用,按规则使用后,不会出错。另外,楼主确实很有水平,也希望楼主所做的框架有类似Qtools Collection这样的嵌入式运行日志debug工具,及TDD这样的测试驱动开发工具的引入,以至于写出的程序能高效少BUG...提高程序猿的产能,而不一定需要高手才能用你的框架去编程,也不应该出现你说的培训7,8个人才有一个人能理解你说的东西的情况

使用特权

评论回复
11
Simon21ic|  楼主 | 2015-12-2 20:52 | 只看该作者
本帖最后由 Simon21ic 于 2015-12-2 20:57 编辑
overdo 发表于 2015-12-2 17:15
其实楼主所说的东西,在《UML状态图的实用C/C++设计》(Practical UML Statecharts in C/C++, 2nd Edition) ...

这个不一样,QP是作为平台推广给开发人员的,推广的东西,那必须要做的简单而且完善。所以QP相关的资料,在网上很容易找到
VSF构架只是我们自己内部使用而已,至少目前还没有计划想推广这个
我这里招兼职的人员,本省就需要一个门槛,VSF只是被我用作为这个门槛而已
就像另一个帖子里别人说的一样,我这里的兼职人员能力都很强,能跨过这个门槛的,自学能力都不差的

另外,QP诞生到现在多久了?我们的VSF构架到现在也只是1年而已,发展阶段都完全不同
如果大家玩状态机的事件驱动构架的话,我也确实建议使用QP,而不是VSF
虽然我说VSF也是状态机构架,但是实际上,VSF里的状态机设计从来都没有用过,只是使用了事件驱动部分(当然,构架本省的实质还是状态机)。
开发的话,也不需要图形化的状态转换图,可以直接使用PT线程和longjmp线程,用类似rtos的阻塞代码的方式开发就可以了。
VSF设计的时候,我看过QP的代码,只是我想做一些不一样的东西而已,现在也没到可以推广的时候,说不定以后有机会的话,可以把你说的东西都完善起来

使用特权

评论回复
12
Simon21ic|  楼主 | 2015-12-2 21:03 | 只看该作者
QP开发者的身份和我的身份也有巨大的差别,我只是一个小工程师已,做好而自己的产品开发就很不错了
估计VSF构架很难有可以推广的这一天

使用特权

评论回复
13
overdo| | 2015-12-3 15:38 | 只看该作者
Simon21ic 发表于 2015-12-2 20:52
这个不一样,QP是作为平台推广给开发人员的,推广的东西,那必须要做的简单而且完善。所以QP相关的资料, ...

好奇楼主既然是做框架开发的,您开发的框架是否经过PC-lint/codeCC测试,有没进行单元测试?

使用特权

评论回复
14
Simon21ic|  楼主 | 2015-12-3 15:45 | 只看该作者
本帖最后由 Simon21ic 于 2015-12-3 15:50 编辑
overdo 发表于 2015-12-3 15:38
好奇楼主既然是做框架开发的,您开发的框架是否经过PC-lint/codeCC测试,有没进行单元测试? ...

只有人请我做产品,还没有人请我做框架
VSF构架只是我们自己用的东西而已,不需要去做什么测试。因为本身也不提供给别人用
如果有机会去推广这个构架的话,估计会去做这些测试,不过目前看来是不会有这个机会了



目前都是自己的项目作为实现,效果不错哈
博通的WICED编译后基本50-60KB flash
别人优化后,使用IAR,无系统,阻塞方式,40KB左右
我们自己的代码,30KB不到,而且还是多任务系统,socket方式调用

使用特权

评论回复
15
overdo| | 2015-12-3 15:50 | 只看该作者
Simon21ic 发表于 2015-12-3 15:45
只有人请我做产品,还没有人请我做框架
VSF构架只是我们自己用的东西而已,不需要去做什么测试。因为本身 ...

也许接外包项目是不需要保证代码质量的,只需要做出功能就行了吧。

使用特权

评论回复
16
Simon21ic|  楼主 | 2015-12-3 16:05 | 只看该作者
overdo 发表于 2015-12-3 15:50
也许接外包项目是不需要保证代码质量的,只需要做出功能就行了吧。

不是外包的项目,是我自己的项目
当然,这个随便你怎么想都可以

使用特权

评论回复
17
Simon21ic|  楼主 | 2015-12-3 16:05 | 只看该作者
本帖最后由 Simon21ic 于 2015-12-3 16:07 编辑
overdo 发表于 2015-12-3 15:50
也许接外包项目是不需要保证代码质量的,只需要做出功能就行了吧。

不是外包的项目,是我自己的项目
当然,这个随便你怎么想都可以,反正也只是我们自己用,对别人也没影响
产品质量也是我们自己控制的,质量不好,赚不到钱,也自然不会有这个构架,当然,也对别人没影响

使用特权

评论回复
18
overdo| | 2015-12-3 17:26 | 只看该作者
Simon21ic 发表于 2015-12-3 16:05
不是外包的项目,是我自己的项目
当然,这个随便你怎么想都可以,反正也只是我们自己用,对别人也没影响
...

好吧,对于您的项目,我本不该评价,不好意思。希望能多多交流,学习学习您的框架。我在做UPS开发的时候,也用过和您类似的框架,法国人写的,已经应用了10多年了,稳定可靠,所以才对框架产生了兴趣

使用特权

评论回复
19
Simon21ic|  楼主 | 2015-12-3 17:45 | 只看该作者
overdo 发表于 2015-12-3 17:26
好吧,对于您的项目,我本不该评价,不好意思。希望能多多交流,学习学习您的框架。我在做UPS开发的时候 ...

欢迎交流,是开源构架吗?
如果开源的话,我也去学习学习

使用特权

评论回复
20
overdo| | 2015-12-3 17:55 | 只看该作者
Simon21ic 发表于 2015-12-3 17:45
欢迎交流,是开源构架吗?
如果开源的话,我也去学习学习

公司内部开源,不对外,其实就是一些组件的集合。带事件驱动,事件支持订阅与发布,和直接事件发送的方式;状态机,信号量,延时Timer,任务分为不同的phase等。和QP原理类似,只是实现方法完全不同。

使用特权

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

本版积分规则

个人签名:www.versaloon.com --- under construction

266

主题

2597

帖子

104

粉丝