时间触发嵌入式系统设计模式 读书笔记

2019-04-13 13:09发布

1 下载地址:

https://download.csdn.net/download/longzitailang8/10496129
本书前所未有地提出一整套软件模式,为开发嵌入式软件系统提供帮助。书中讨论了基于广为使用的8051系列微控制器进行设计并应用软件 的方法。此外还重点关注了其可靠性。 本书中一共有超过70个软件模式,并介绍了如何将这些技巧应用到你自己的项目中,作者为迅速创建各种各样的嵌入式应用提供了很多实用的资料和建议。本书从简单系列复杂系统。列举了大量详尽的的实例。
作者 英国人 Michael J Pont http://www.engg.le.ac.uk/books/Pont
好像是打不开了

2 参考书

How_To_Design_Multiple_Tasks_Embedded_System_Demo.pdf
推荐的《时间触发嵌入式系统设计模式》和《UML状态图的C/C++设计》 奉上《UML状态图的实用C/C++设计》中文书签版和英文版,还有《时间触发嵌入式系统设计模式.(patterns for time-triggered embedded systems.)》英文版,中文版《时间触发嵌入式系统设计模式》 另外《pattern for time-triggered embedded system》我也是看英文版的,除了后面的一些应用实例没看,其余的基本看完了,这是我觉得最易懂的一本书。建议楼主看英文的,会增加你对英文的兴趣 Practical UML Statecharts in C.pdf

第二章 使用模式来设计嵌入式系统

巡航控制系统(cruise-control system,CCS)。
Hatley
Pirbhai
编写了一本关于实时软件设计的标准教科书。
Awad等(1996) 闹钟

第13章

合作式 调度器
本书中主要使用合作式调度器
并且有限制的使用混合式的调度器
进阶阅读 在这里插入图片描述
在这里插入图片描述

14 章 合作式调度器

OSAL — Page213
(稍后补充)

15 需要下载的Keil C51 软件:

https://www.keil.com/download/product/
在这里插入图片描述 进入Debug 模式 在这里插入图片描述 RUN
在这里插入图片描述 在这里插入图片描述

17 另外一本书

《C嵌入式编程设计模式》
英文名《Design Patterns for Embedded Systems in C》中文名《C嵌入式编程设计模式》这本书的源代码

18 论坛讨论 备忘

https://www.amobbs.com/thread-5468237-1-1.html?_dsign=112128f0 《时间触发嵌入式系统设计模式》是一本好书 在概念上别被“基于时间触发”束缚住。这只是任务调度的一种基本形式,而且
并不是万能的,效率也不是最高的——如果你总是执着于用时间来触发的话。其实,任务调度的关键只有以下三点:
1、用于调度的函数指针,及相关的TASK结构体
2、基于触发的调度,触发有很多种,时间恰好只是最笨的一类
3、从触发来考虑,可以渐渐考虑基于消息触发的结构
等你熟悉了基于消息触发的系统,你的系统应该拥有了相当的复杂度,这个时候要考虑最简化的形式:
即怎样做到最简单最灵活的“基于触发的任务调度”?
最终结论:
基于事件触发的调度器系统
进一步推论:
基于状态的多任务系统
状态机编程是一种非常有效的办法。
尤其是基于 面向对象的编程。 关于状态机,其实在傻孩子的《深入浅出AVR》和马老师的《avr》书中都有涉及,当时仅仅感觉是个按键去抖的好方法。但慢慢接触一些状态机的文章后也发现,状态机也可以做为程序的框架。 受益良多,我写程序不多,没有什么框架,结构的编程思想。程序如何组织,自己去想,很不规范。也很吃力。对于调度器,信息,事件,状态等认识几乎空白。可否推荐几本书,系统的学习一下。 入门的话先用《时间触发嵌入式设计》,接下来看《深入浅出MFC》(貌似只要头几个章节就可以了)
做到这两步,基本上就可以自己去探索和实践了,实践一段时间以后看高焕堂的《UML+OOPC》,
然后就牛X了…… 我现在做的一个食品机器,有红外漫射探头,检测人手进入危险区域,同时也检测按键是否按下。我用C++编写,电机运转,探头检测,按键检测封装在一起。运行电机的函数,如果作为任务加入任务队列,但它1.不是只运行一次,2.不是周期的。3.不是一段确定的时间。它的结束是事件触发的(就是位置检测探头检测到运行到终点位置)。简单照搬这个时间调度器的程序结构看来行不通。 比较好的一种就是被称为“任务自回收式合作式调度器”。 说起来很简单:
1、把一个大任务拆分成很多原形相同的子程序,每一个子程序都表示一个步骤(通常用来表示状态机的一个状态)。
而要求使用相同的原形,是为了使用函数指针。
2、每一个子程序都直接指定自己的后续(状态机中就是指定下一个状态的地址) 以上的内容就是经典的 “状态机函数指针描述法(调度法)”,下面我要介绍基于这个方法的一个改进,也就是所谓
的任务自回收模式: 3、我们为调度的基本单位定一个TASK块,这是常见的方法,在这个TASK块里面有一个函数指针,指向TASK要运行的
具体任务(这也是常见的处理方法,没什么稀奇的)。
4、TASK块所运行的那个函数会有一个返回值,返回true或者false。定义true表示TASK块指定的函数还要运行,false,
表示TASK快指定的那个函数不需要运行了。
5、建立一个TASK队列,也就是传说中的ready队列,一定要用链表来做。
6、建立一个函数,叫做register_task()。这个函数接收一个函数指针(也就是要在注册的时候指定运行的目标函数),
以及其他参数,比如运行目标函数的时候所要传递的参数列表等等(这个不重要)。这个register_task只干一件事情
就是从TASK池(堆)中申请一个TASK,按要求设置好它,最后扔到ready队列里面。
6、亮点来了:调度器工作的时候,每次从队列中取一个TASK,并运行其函数指针指向的函数。如果函数返回false,则
直接把TASK注销——也就是仍回TASK池(堆描述的)中;如果函数返回true,先把当前的TASK注销(同上),然后
根据刚才注销TASK里面的内容(比如运行哪个函数,传递的参数列表之类),调用register_task()来注册一个新任务。
-------------------------华丽的分割线----------------------------
这就是工作原理,用户要做的事情永远是调用register_task,系统每次都会立即自动注销当前TASK。是不是很类似自动
垃圾收集的原理?你当然也可以称其为任务的垃圾收集器。
那么怎么用呢?考虑以下几种情况
1、建立新任务:当然是register_task(),这个不罗嗦
2、怎么在从一个子状态(函数)跳到下一个子状态呢?
a. 调用register_task,并把下一个子状态函数传递给他.
b. 当前子状态return false.
3、怎么结束一个任务?在没有调用regiseter_task的情况下直接return false。
4、怎么知道当前系统有几个活跃的线程?直接看ready队列里面元素的数量。
5、怎么知道系统idle?直接看ready队列是不是空……
6、还有其他特性么?有,简单的在TASK块里面加入一个函数指针的栈和简单的修改,就可以支持子线程的调用,而不必
让当前线程傻乎乎的在查询子线程的状态。
7、怎么让事情变得简单?
定义宏,比如把register_task分别定义成TRANSFER_TO_STATE(…) 、NEW_FSM()、CALL_SUB_FSM()等等……

8、这个系统支持多任务么?只要你很好的把每一个任务都拆分成细小的步骤,并用一个函数来描述,每一个这样的函数
都是NONE-Block的,那么这个系统就是多任务的。这种模式有其适合状态机。
9、如何定义系统允许的最大任务数量?和状态机的状态数量有关么?和状态机状态数量无关。任务的数量也是没有限制的,
但是有一个最大活跃任务的限制。简单说就是活着的任务有限制。这个当然直接由TASK池中TASK的数量限制的。
10、有最大的活跃人物限制对开发有什么限制么?其实没有,因为register_task是一个有true/false返回的函数,因为系统
都是由状态机编写的。所以如果要考虑对最大活跃任务的兼容,你可以在调用register_task的时候检测返回值,肯定是
返回true,才将当前的状态返回false。这样做以后,就变成用时间换资源了。当然,在极端的情况下,还是要考虑死锁
的可能性。 -------------------------华丽的分割线----------------------------
关于这个调度器,请看帖子
http://www.ourdev.cn/thread-4319119-1-2.html 关于应用例子,请看帖子
http://www.ourdev.cn/thread-5468708-1-1.html 这个帖子含金量高了,记得以前有个51上跑最简单的操作系统的帖子,说的也很精彩!! 这个帖子含金量高了,记得以前有个51上跑最简单的操作系统的帖子,说的也很精彩!! 比较常见了,很多公司的单片机上都是跑这类小OS。再加上足状态机,就可以简单模拟进程、线程的概念。 可以是一个简单的例子,假设有10个Led同时工作:
第1个一直闪烁,频率1HZ;
第2个一直闪烁,频率2HZ;
第3个一直闪烁,频率3HZ;
第4个一直闪烁,频率4HZ;
第5个一直闪烁,频率5HZ;
第6个一直闪烁,频率6HZ;
第7个一直闪烁,频率7HZ;
第8个一直闪烁,频率8HZ;
第9个一直闪烁,频率9HZ;
第10个一直闪烁,频率10HZ;
搞定这个,就会明白很多… 我也一直在学习借鉴一些程序框架。时间触发,状态机。事件驱动,基于消息的,太多了。原来农民讲习所讲过一个程序架构,后来在**ic上看到过王绍伟 的一个程序架构,发上来供大家讨论。
论坛现在不知道为什么不能上传附件。 http://www.study-bbs.com/thread-46471-1-1.html
这个是王工的一个程序框架 Xmega本身带有事件驱动的。 你这个可以简化 我早就用在PIC 上面了 凤老大, 他的MS3的架构。 其基本思想是:时间触发(混合式)调度器 + 简单的消息触发机制。
那个调度器,就是时间触发嵌入式编程模式中讲的那个“混合式调度器”, 而凤老大在它的基础上增加了消息的一些机制和特性。 这个架构比较轻量级,也比较好理解。
1.为什么说是简单的消息机制呢? 这里主要是实现消息的触发,没有扩展增强像UCOSII中消息邮箱那样,可以实现消息参数的传递, 这样就不需要或减少使用全局变量来传递参数, 减少耦合度,更加方便实现模块化。
2.关于消息机制及处理,可以参考学习原来农民讲所所长的那个“建立通用程序框架”的教程及范例,个人感觉讲解得比较好,特别是关于模块化的一些思想和方法还是值得学习的。 我认为在目前嵌入式行业,对于拥有OS的MCU去控制实时性比较强的外设,无疑是比较苦恼,我们要用过多的信号量、互斥量和任务管理来实现,这样会加重产品的
程序架构,导致很多莫名奇妙的BUG。使用双MCU来处理,可以大大减少隐患和实现分模开发,减少开发周期。我已经用这种双MCU方案开发有几年了,效果还是很不错。

19 给51 DIY超轻量级多任务操作系统

https://www.amobbs.com/forum.php?mod=viewthread&tid=1398508&highlight=51%2B操作系统&_dsign=e39a9436 (稍后整理补充)