一、防止MCU或编程言语搅扰规划
最近的一个项目是我愈加疑虑,简直每次都是,有必要使规划习惯(有时根本就是)所选的言语和机器。咱们现已以某个体系架构和规划开端,只是按一般办法考虑了集成微操控器及其外围设备,咱们只重视咱们需求什么并不关怀它是怎么完结的,至少咱们是这么以为的。咱们挑选了一些十分专业外设的新器材,而且开端编码时,发现需求花费许多的时刻来了解怎么构建硬件,以及怎么依据需求最好地运用。当咱们发现好的办法来运用设备的某特征时,设备的此特色经过代码嵌入了体系级规划。咱们已不再坚持咱们的体系,不得不让机器和详细操作改动了体系规划。所以只好停下来查看问题和施行方案,经过体系从头规划别离出依靠机器的“修正”,然后将“修正”融入体系四周的“包装”中。
当规划某个运用时(乃至单一微操控器),以调温器为例,有一个创立好了的体系级视图,描绘了硬件和施行某种办法的运用程序。该视图用于多种用处,例如,可作为与高层办理人员或另一个小组进行沟通的东西(不期望知道一切细节),如自动化测验人员。假如仅将其视为“视图”而不是体系规划,而且施行不是从体系规划自上而下,而是将其用作起点,则问题就呈现了。考虑图1所示的温控体系。
显现体系相对简略,却反映了许多嵌入式产品规划。在“温度传感”部分包含温度输入,其输出进入主体系“操控逻辑”部分。“操控逻辑”的其它输入是符号“用户输入”的部分,代表人机接口,大约设置了恒温器的温度调理。“操控逻辑”部分依据这些输入确认了怎么指令供暖、通风和空调(HVAC)体系,以坚持恒温器设定的温度,将这些指令发送到“热与冷指令”部分。最终一个部分是“显现输出”,将当时体系状况传递到用户。当时体系状况的一部分是恒温设置,另一部分是最新的温度读数,最终部分是正在履行的指令,以迫使温度回来恒温设置(即加热、冷却和/或翻开或封闭电扇)。
正如前面所述,这是一个直接和相对简略的运用,十分简略以至于不需求考虑体系,而是很自然地跳到施行(我信任大多数读者乃至可以说出最喜欢的微操控器供货商的类型)。可所以用于次级商场的高端PC游戏图形体系的墙恒温器或温度办理设备。用于墙恒温器的微操控器的详细施行根本不需用于图形体系。重点是,不论规划显得多么简略,都有很好的理由先规划体系,然后完结它。将其尽量规划成合适一般运用。
开端时,需求考虑抱负的体系规划,然后生成layers,在抱负的体系和实践施行之间构建wrappers(有时是凌乱的)。“操控逻辑”部分作为框图的中心是有充沛理由的-由于它是体系的内核。周围的每个部分都服务于“操控逻辑”部分,要依据需求供给“服务”。
应自“温度传感器”部分开端。其理由是取得当时/瞬时温度,并以共同的格局供给出来。从“操控逻辑”的视点来看,其作用是“获取温度”,并以格局化的值(xxx.xx摄氏度)回来当时温度值。温度传感器部分的硬件wrappers将包含施行中任何需求用来将原温度传感输入“翻译”成预期格局的摄氏度。这或许意味着需求考虑取得新读数的最佳时刻,假如温度读数中有太多的噪音(不论何种原因),应增加过滤算法,而且假如温度硬件呈现毛病,应选用决议计划逻辑。重点是,“温度传感器”部分的输出是什么,而且传递到“操控逻辑”应为抱负的温度,一切的噪音,实践躲藏的细节都应很简单的由wrapper替代。
假如规划需求从体系中三个不同的点丈量三个温度值(关于计算机箱内的计算机很遍及)怎么办?处理这三个温度是操控逻辑问题(例如,何时多路输出也将遭到操控)?假如是这样,从1个温度转换到3个温度首要意味着“温度传感器”部分要更新,以供给3个温度和为每个温度施行创立的wrappers(答应多种类型的输入),然后操控逻辑也由于多个输出而更新。这或许意味着三个不同的“GetTemperature_n”服务或需求更新服务以确认是辨认哪个温度的参量。
假如三个温度只是用于加权以得到一个“更实在”的体系温度,操控逻辑不需求改动,只需将含wrappers的温度传感块以一致格局输入这三个温度,然后经过一个wrappers来对这三个温度进行加权,生成操控逻辑所需的单一温度。这种办法易于包含来自不同的温度输入(例如,图形处理器的二极管结丈量和连接到PCB的模仿热敏电阻),由于wrappers将体系逻辑与硬件隔脱离。
让咱们以两个不同的完结比如验证这个观点:一个用于墙恒温器,另一个是显卡上的温度操控子体系。首要关于墙恒温器,如图2所示,假定运用依据8051的赛普拉斯PSoC3设备。“温度传感器”部分的硬件由连接到ADC(16位Δ-Σ转换器)的热敏电阻组成。“用户输入”部分的硬件由5个常开按键开关组成,一边连接到电路接地端,另一边连接到含内部上拉电阻的5输入数字端口。“热和冷指令”模块的硬件部分包含三个功率场效应管,由装备为开漏低输出的3输出端口驱动。最终,“显现输出”块的硬件完结是串行字符液晶显现器,可以依据需求显现字母数字字符串。
关于第2个运用,即显现卡,将用户输入从离散开关变为I2C依据寄存器的从接口(由主CPU而不是人类直接操控),并将串行LCD显现变为SPI-从操控显现器(运用一系列的寄存器和指令,或许是安装在主计算机外壳前面板上的长途变频显现,未安装到显卡上)。温度输入和HVAC指令坚持不变。图3显现了前期施行的改变,假定运用依据8051的赛普拉斯PSoC3设备。
用户输入的两种完结均可服务于“GetThermostatSetting”、“IsHeaterEnabled”、“IsCoolerEnabled”和“IsFanOn”。关于第一个墙恒温器运用,“用户输入”将数字端口包装到所列的服务中,当设备被调用时,供给端口的实时读数(一种或许的施行)。关于另一个运用,依据I2C从机的完结,相同的服务将来自I2C主机写入的寄存器的最新值回来到“操控逻辑”部分,或许常常回来或许仅在上电时回来。而且这些完结还有许多其它特色,包含用作切换键的墙上按钮开关而不是瞬间读数,乃至在“用户输入”部分的wrappers深层进行边缘触发异步处理。
归纳上述的要害是:体系规划躲藏了硬件细节;硬件和施行细节被体系规划包装并躲藏。经过外端规划(即代码)的施行细节,可以维护这些运用完结时防止割裂,可以做到个性化的规划,权衡利害,确保项目成功交给,并依然可以供给可复用性和组规划。不要让卖方牵引注意力——先规划体系,然后加强维护体系规划完结细节不被抄袭。
二、单片机规划与KeilC编程总结
1根本原则
质量是要害。没有人会对很差的作业感到满意。当完结高质量的作业时,你会为此而感到自豪。不论你是否知道,你都会由于你的高质量作业而得到诺言。因而,要想为自己所做的事感到自豪,就需求树立个人规范,并为到达这一规范而尽力奋斗。在到达这些规范时,再进步规范并持续尽力。应战自己去完结更优秀的作业,你将会为自己的成果而感到惊奇。