基于mcu的一种分层软件架构

基于mcu的一种分层软件架构(一)

1、写在前面

先来个图:

经过了一段时间的琢磨与思考。借鉴操作系统的分层原理,也搞出来了一种mcu的层状软件结构。好了,不说虚的啦。所有的一些方法和思想,都是对经历痛点的思考后,在人类智力范围内,被捣鼓出来,用来解决或是减弱痛点的。否则就是形而上了,没有意义。

 说说把它弄出来的初衷吧。大前提,所有的电子产品在初期研发、迭代升级阶段,都会有软件或是硬件的修改(当然,本文仅限于带mcu产品哈)。修改软件,可能是为了提高功能、定制功能等等;修改硬件,可能是为了优化成本、提高硬件稳定性,有时甚至会修改mcu。如果没有一个合适的软件结构,那我们一定会各种改改改了;更有甚者,硬件改变后,软件要推翻重做,哈哈,那个苦呀。基于上述痛苦,作为接受过九年义务教育我们,当然要与之斗争呀。

2、引子

下面说说带有mcu的产品基本构成吧(忽略结构和外观)。

 1、对于一个带有mcu的产品其硬件结构一般就是一个电路板,上面集成有mcu最小系统、led灯、lcd、继电器、WiFi模块、485串口、232串口、h桥、电源等各种东东。mcu呢是一个可编程的东西,它通过自身的io、并口、串口等各种接口与板子的其他设备产生联系。我们可以通过对mcu编程,间接控制板子上的各种设备。因为mcu的特殊性,我们可将硬件分为mcu和外围设两个部分。可以画个圈圈图,如图1所示。大圈圈代表整个板子,小圈圈代表mcu,大圈圈减小圈圈是板子上出mcu的外围设备。

图1 一般的硬件结构

 2、对于软件,我们通过mcu这个“中介”,根据一些功能逻辑进行编码,有序的控制各种设备。这样有序运动的硬件满足我们生活中的各种需求,形成形形色色的电子产品。如果没有细分软件结构。如图2所示,就是右边的代码就是我们所说的软件,自己构成的一大坨(具体是啥样呢,可能是一个带有合理架构的有序整体;也可能是混乱的夹杂各种全局变量寄存器操作;也可能里就一个.c文件一个main函数构成撑起了整个业务逻辑;当然还有,自己脑补吧)。

图2 产品整体组成

 

在这里,我们可以看到我们前面所说的痛点。如果图2中右边的“代码”,在软件里mcu或是板子的具体寄存器操作与具体应用混合在一起。一旦左边的“大圈圈”里的某个东东改变了,那就有可能全局搜索“代码”部分,修改各个部分的具体操作。如果没有合理的架构,回望过去尽是汗水加泪水呀!!!

我们的痛点可以描述为这样,即:硬件发生了,会带来软件的大量修改。

3、分层抽象

第一步抽象分层:

为了解决上述问题,可以对硬件加以抽象,在具体应用和硬件之间加入一个中间层,该中间层的任务是将具体的硬件操作加以封装,一旦硬件修改,仅仅修改中间层就可以了。那么软件就可以构成了一个简单的层状结构了,如图3所示。中间层在这里我们叫做“产品的硬件抽象”,具体应用是“应用程序”。

图3 带有中间层的软件架构

采用该结构的后果:硬件修改后,我们可以不必去修改具体的应用程序,只需将对应的“硬件抽象”的实现修改就好了。这样我们的程序是不是更加灵活了。

当然,使用该操作也是有一定约定的;即应用程序,不允许调用处“产品硬件接口抽象”之外的任何板子上的操作,否则,该结果就会被打乱,脱离的初衷。

第二步抽象分层

我们知道,板子的硬件构成是带有一个小圈圈的大圈圈。mcu(小圈圈)本身往往有很多外设接口(串口、并口,gipo,ad)用于与板的其他设备进行交互。这些“外设接口”代码量也往往比价大,且很多要操作寄存器,如果和mcu外围设备的编码夹杂在一起,一旦硬件修改,从mcu到具体外设都是需要大量修改的;更糟糕的如果mcu修改啦,整个硬件部分的代码都是需要修改的。就此,可进一步抽象分层。如图4所示。将硬件部分,如图实际硬件那样分为两层,这样就构成了三层结构。

采用该结构的后果:硬件修改后,我们可以不必去修改具体的应用程序,只需将对应的“硬件抽象”的实现修改就好了。这样我们的程序是不是更加灵活了;同样在mcu改变时,使得硬件相关代码部分修改达到最小化。更加灵活。

图4 三层结构

 

本文是为了介绍,这个分层架构方法,并不是介绍具体实施的。所以呀,可根据具体经验发挥各种编程技巧。这里介绍,该结构在实施是需要具体注意的概念,以免违反初衷。

1、该分层架构是由MCU接口抽象、产品的硬件抽象、和应用程序三个层次;

2、mcu接口抽象、定义mcu各个外设访问的接口属性和操作。切记是定义好的、标准化后的。可以自己标准化也可以根据主流架构进行标准化(比如st厂家的hal库、外设标准库)。

3、“产品的硬件抽象”大部分形式上是对板子上各个硬件属性和操作进行标准的定义。但是,切记该层是“硬件抽象”,即根据产品的具体性质,标准化的“抽象硬件”,可能会存在一个“抽象硬件”调用使用多个实际硬件才能实现,也有可能一个实际的硬件可以实现多个抽象硬件(这个抽象很重要,该层的核心,其模块定义直接关系到应用的可扩展性、效率)。

4、不允许跨层操作,如果必须的话,就在中间层提供接口进行传递。例如应用层要访问“mcu”自带的“看门狗”,那么就在“产品的硬件抽象”层添加“看门狗模块”,该模块调用mcu的“看门狗”。(当然这也是分层软件的弊端之一,前期的工作量会很大,不过分层的效益是随时间增加的,而这一弊端是一个初期的静态弊端,长期来看,利大于弊的)。

 

 

 

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: MCU(微控制器)的软件架构可以通过以下步骤来设计: 1. 需求分析:在开始设计软件架构之前,首先需要了解系统需要完成的任务和功能。这可以通过收集需求文档、与客户交流以及进行系统分析来实现。 2. 分层设计:将系统功能分解为不同的模块,并将这些模块分配到不同的层次中。通常,MCU软件的设计包括硬件抽象层(HAL)、设备驱动程序、中间件、应用程序等层次。 3. 设计接口:在每个层次中,需要设计接口,以确保模块之间的通信和协作。这些接口应该清晰明了、简单易懂,并能够满足系统要求。 4. 选择编程语言和工具:选择编程语言和工具以编写和调试软件。MCU通常使用C或C++编程语言,可以使用IDE(集成开发环境)进行开发和调试。 5. 编写代码:编写软件代码并进行单元测试以验证功能的正确性。 6. 集成测试:将不同的模块集成到一个完整的系统中,并进行系统测试以验证系统的功能、性能和可靠性。 7. 优化和调试:在集成测试期间,可能需要进行优化和调试,以解决性能问题和系统错误。 最后,需要将软件代码烧录到MCU芯片中,并进行现场测试和验证,以确保软件在MCU上的正确运行。 ### 回答2: 设计 MCU(微控制器单元)的软件架构,可以按照以下几个步骤进行: 1. 确定功能需求:明确 MCU 需要具备的功能和任务。分析需求,确定所需要的资源,包括处理器和存储器等。 2. 划分模块和任务:根据功能需求,将软件划分为若干个模块或任务。每个模块或任务应该具有清晰的功能和职责,能够独立完成一定的功能。 3. 定义接口:确定每个模块或任务之间的接口和通信方式。明确输入输出接口以及数据传输方式,确保各模块之间能够正确地进行交互。 4. 设计主程序:设计主程序控制整个软件流程。主程序应该根据不同任务的优先级来调度各模块的执行顺序,确保任务能够及时且正确地完成。 5. 设计模块:根据每个模块的功能需求,设计相应的模块代码。在设计过程中,应考虑代码的可维护性和可复用性,遵循模块化设计的原则,将代码分解成易于理解和修改的小模块。 6. 编写测试用例:针对每个模块编写相应的测试用例,验证模块的功能是否符合预期。测试用例应该覆盖各种边界情况,确保软件在各种情况下能够正确运行。 7. 调试和优化:在实际使用过程中,对软件进行调试和优化。通过调试工具和技术,解决软件中的bug和性能问题。 8. 文档记录:及时记录软件架构和设计的相关信息,包括接口定义、模块功能说明、代码注释等。这些文档对于后续的维护和升级非常重要。 以上是设计 MCU 软件架构的基本步骤,通过系统化的设计和开发,能够提高软件的可靠性和可维护性,确保 MCU 正确地执行所需功能。 ### 回答3: 设计MCU(单片机)的软件架构需要考虑以下几个方面: 首先,需要明确系统的功能和需求。通过分析单片机的应用场景和期望功能,确定需要哪些模块和功能模块。这些模块可以包括输入输出、通信、控制算法等等。 其次,确定模块之间的依赖关系和通信方式。根据系统需求,确定各个模块之间的数据传输方式,可以使用全局变量、消息队列、事件或者回调函数等方式实现模块间的通信。 然后,进行模块划分和封装。将整个系统按照功能划分为不同的模块,每个模块负责特定的功能。对于每个模块,进行合理的封装,保证模块之间的独立性和可重用性,提高系统的可维护性和可扩展性。 接下来,确定任务调度方式。MCU的资源有限,需要合理分配和利用处理器的时间片和内存资源。可以采用系统时钟中断、优先级调度、时间片轮转等方式进行任务调度,确保不同模块和任务能够按时得到执行。 最后,进行软件测试和优化。通过针对各个模块的单元测试、集成测试和系统测试来验证系统功能的正确性和稳定性。同时,对系统进行优化,提高系统的运行效率和性能。 总结起来,设计MCU软件架构需要从明确需求、确定通信方式、模块划分和封装、任务调度以及测试和优化等多个方面进行综合考虑,以达到系统功能完备、性能高效的目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值