如何在裸机下设计一个嵌入式系统架构?
Posted tianqiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在裸机下设计一个嵌入式系统架构?相关的知识,希望对你有一定的参考价值。
如何在裸机下设计一个嵌入式系统架构?
8 个回答
状态机与时间触发是其中的两个方向(不一定准确,仅供参考):
1. 时间触发
建议你看一下下面这本书:
时间触发嵌入式系统设计模式 (豆瓣)
很久前读的是英文版,1000多页,易读,且有source code,因此结合使用proteus仿真验证。另外这本书有许多构建冗余与健壮性嵌入式系统的诸多讨论。
2. 状态机
可以看一下CS专业的自动机相关图书,例如《自动机理论与应用》。另外可以看看傻的一些文章,如果你有amobbs的账号的话:
[FSM]状态机实践入门——程咬金只要三斧头厉害 (amoBBS 阿莫电子论坛)
[学海拾贝]状态机思路在单片机程序设计中的应用 (amoBBS 阿莫电子论坛)
QP?状态机框架学习之菜鸟范例(一):闪灯(MDK,STM32F10x) (amoBBS 阿莫电子论坛)
最后谢邀,希望回答对你有帮助。
利益相关:只做过小程序,了解 51 arduino cortex-m4
根据我的理解,有两种方式,一种方式是类似于时间片,大部分代码都放在中断中,比如串口中断定时器中断,大部分时间单片机处于空闲状态,触发中断后尽快完成响相应工作,优点是功耗低,在逻辑不太复杂时候比较方便,不用控制不同功能之间的影响,缺点是如果有耗时比较长的操作(如模拟spi i2c总线)有可能不稳定,且debug比较麻烦,适用于时间长逻辑少的功能,比如智能家居的灯控制,zigbee的根节点是这么实现的
另外一种方式是大部分代码从主函数中顺序执行,串口等接收后存入数组或者解析后存入数组,之后程序继续执行,到达函数或代码块后再进行处理,优点是程序容易控制流程,debug方便,缺点是功耗比较大,程序效率不太高,适用于逻辑复杂或计算量大的功能,比如自动控制等
如果你的系统不复杂,你的所有问题就简单的是一个如何设计状态机的问题,你构造你的状态机模型就可以了。这个有很多书可以看,状态机就三个要素:状态,跃迁条件和Action,剩下的问题只是代码组织,那是个独立主题。
如果你的系统较复杂,你的问题根本就是“如何设计一个嵌入式操作系统”,这个,你按这个题目去查资料就好了。
你想问题想得太高了,什么串口处理放在哪里处理什么的,根本不着边际。你有问题解决问题,想你的CPU现在应该干什么才是正道。主要是基于FreeRTOS设计
使用事件的方式,有一个任务专门处理其他任务发送过来的事件,类似于消息处理机制。
串口使用循环缓冲区的方案,发送来的数据先放到循环缓冲区中,这样效率可能不是很高。
串口日志输出,使用一个buff,然后使用空闲任务刷新这个buff。
其他---
Practical UML Statecharts in C/C++, Second Edition: Event-Driven Programming for Embedded Systems
神书,网上可以找到电子版的中文版和英文版。我觉得还是看英文版好点。确定执行的框架:
一个while循环里面检查串口是否有输入,在判断每个字符的时候,执行 switch_job(),
switch_job()里面做如下工作:
1. 定时处理,检查定时器是否到期,到期则定时处理。
2. 消息处理,检查消息队列是否有数据,(消息队列里的数据会在中断里面写入)有则处理。
以上就实现了一个裸系统的shell,周期处理,基于消息的处理。这个架构下面不能延时处理要重新规划。因为实际上除了中断就是单线程的。
其实重要的是架构。
一个典型的项目包括按键输入,显示输出,通讯。恰好我就是这种。
模块的组织以数据为核心,以状态来判断。按键输入改变数据,显示输出提取数据。同一个按键同一个显示在不同情况下功能不同,我通过状态来分别。
存在问题是全局变量满天飞,状态很多,但是我目前找不到更好的方法。
以上是关于如何在裸机下设计一个嵌入式系统架构?的主要内容,如果未能解决你的问题,请参考以下文章
嵌入式Linux第二部分 - 裸机开发/系统移植/驱动开发/内核开发