一种基于分层架构思想的单片机程序构建方法与流程

文档序号:30083926发布日期:2022-05-18 05:07阅读:445来源:国知局
一种基于分层架构思想的单片机程序构建方法与流程

1.本发明属于计算机技术领域,涉及一种基于分层架构思想的单片机程序构建方法。


背景技术:

2.一般情况下单片机程序与电脑程序相比,复杂程度较低,但并不意味着单片机程序不需要架构设计。当前很多软件工程师在编写单片机程序时,经常将业务逻辑代码与数据解析等底层代码“混合”编写在一起,程序代码强耦合,这样编写的代码具有以下缺点:(1)代码不易阅读;(2)代码不易扩展;(3)代码不易修改;(4)不易团队合作;因此需要开发一种单片机程序构建方法,来规范单片机程序开发的。


技术实现要素:

3.本发明为了弥补现有技术的不足,提供了一种基于分层架构思想的单片机程序构建方法,使得代码层次结构分明,容易阅读;分层和模块化实现了代码的弱耦合,使得程序代码容易扩展和修改。本发明是通过如下技术方案实现的:本发明提供了一种基于分层架构思想的单片机程序构建方法,构建单片机程序时,采用分层构建,从上往下分别为:设备层、业务逻辑层、传输协议层、通信接口层、硬件抽象层和物理层;包括如下步骤:s1根据实际业务场景创建一个设备模块对象,完成设备层的创建;s2根据实际业务场景创建一个或多个业务逻辑模块对象,完成业务逻辑层的创建;s3根据实际业务场景中的数据传输协议定义一个或多个传输协议模块对象,完成传输协议层的创建;s4根据实际业务场景创建一个或者多个通信接口模块对象,完成通信接口层的创建;s5通过芯片配置,生成硬件抽象模块对象,完成硬件抽象层的创建;s6将设备模块对象、业务逻辑模块对象、传输协议模块对象、通信接口模块对象和设备抽象模块对象进行相邻层的相互绑定,完成上下层通信通道;s7在main函数中的无线循环语句中调用全局设备模块对象变量的work函数;s8如果有定时器处理,则在定时器回调函数中调用全局设备模块对象变量的timerhandler函数;s9在设备抽象层的数据发送完毕回调函数中调用全局设备模块对象变量的completesendoneframe函数;s10在设备抽象层的数据发送完毕回调函数中调用全局设备模块对象变量的completereadoneframe函数;s11单片机程序建构完成。
4.本发明的有益效果是:
本发明在构建单片机程序时,采用分层设计,从上往下分别为:设备层、业务逻辑层、传输协议层、通信接口层、基础库层、物理层。程序内部数据从业务逻辑层逐层向下传递到物理层或者从物理层逐层向上传递到业务逻辑层,每一层只与相邻层通过模块对象的api进行数据交换,对任何一层内部代码进行修改(不修改api函数的话)不会对相邻层产生影响,对不相邻的层更不会有影响。最终通过这种分层设计来实现程序代码的解耦。
5.本发明(1)代码层次结构分明,容易阅读;(2)分层和模块化实现代码弱耦合,使得程序代码容易扩展和修改,也不容易在此过程中出错;(3)程序开发规范化、标准化,有利于团队合作开发(不同的研发人员可并行研发不同的模块或者层级),加快开发进度。
附图说明
6.下面结合附图对本发明作进一步的说明。
7.图1为本发明的六层架构示意图。
8.图2为本发明的单片机程序构建流程图。
具体实施方式
9.为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图对本发明的具体实施方式做详细的说明。在下面的描述中阐述了很多具体细节以便于充分理解本发明。但是本发明能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本发明内涵的情况下做类似改进,因此本发明不受下面公开的具体实施例的限制。
10.附图为本发明的一种基于分层架构思想的单片机程序构建方法的具体实施例。构建单片机程序时,采用分层构建,从上往下分别为:设备层、业务逻辑层、传输协议层、通信接口层、硬件抽象层和物理层;构建单片机程序包括如下步骤:s1根据实际业务场景创建一个设备模块对象,完成设备层的创建;s2根据实际业务场景创建一个或多个业务逻辑模块对象,完成业务逻辑层的创建;s3根据实际业务场景中的数据传输协议定义一个或多个传输协议模块对象,完成传输协议层的创建;s4根据实际业务场景创建一个或者多个通信接口模块对象,完成通信接口层的创建;s5通过芯片配置,生成硬件抽象模块对象,完成硬件抽象层的创建;s6将设备模块对象、业务逻辑模块对象、传输协议模块对象、通信接口模块对象和设备抽象模块对象进行相邻层的相互绑定,完成上下层通信通道;s7在main函数中的无线循环语句中(while循环中)调用全局设备模块对象变量的work函数;s8如果有定时器处理,则在定时器回调函数中(编程工具自动生成的回调函数)调用全局设备模块对象变量的timerhandler函数;s9在设备抽象层的数据发送完毕回调函数中(编程工具自动生成的回调函数)调
用全局设备模块对象变量的completesendoneframe函数;s10在设备抽象层的数据发送完毕回调函数中调用全局设备模块对象变量的completereadoneframe函数;s11单片机程序建构完成。
11.程序内部数据从业务逻辑层逐层向下传递到物理层或者从物理层逐层向上传递到业务逻辑层,每一层只与相邻层通过模块对象的api进行数据交换;对任何一层内部代码进行修改(不修改api函数的话)不会对相邻层产生影响,对不相邻的层更不会有影响。例如通信协议格式发生改变,则只需要修改传输协议层代码即可,可最大程度减少协议修改对整改程序代码的影响。
12.定义一个全局设备模块对象变量,定义一个或多个全局业务逻辑模块对象变量,并为每个业务逻辑模块对象变量定义与之对应的一个全局通信接口模块对象变量和一个全局传输协议模块对象变量,并在程序的入口函数(main函数)中初始化以上定义的这些变量。
13.设备层原则上只有一个设备模块对象,设备层是对整个设备的抽象,存储设备的一般属性信息和所有下层业务逻辑层中实现的抽象结构体对象指针;用于抽象设备层的结构体必须以设备层基础结构体定义,除了程序初始化阶段,其他阶段6层结构之外的代码只能通过设备模块对象提供的api接口调用6层结构之内的功能,起到对外屏蔽内部细节的作用。因为设备模块对象中存储着所有业务逻辑模块对象的指针,因此不同业务模块对象之间的相互通信是由设备模块对象作为中介完成的,这样可以减少程序中全局变量的定义。
14.设备层包括设备层基础结构体和设备层实际设备模块结构体。
15.(1)设备层基础结构体,设备模块对象中存储的一般属性数据都在设备层基础结构体中定义,业务逻辑模块数量和所有业务逻辑模块对象的指针;同时设备模块对象对外提供的标准api函数接口,也都在设备层基础结构体中定义,包括:addbuslayer、completesendoneframe、completereadoneframe、work、start、timerhandler、getbuslayer。
16.主要函数介绍:completesendoneframe函数,此函数会调用通信接口层中所有模块对象的同名函数。
17.completereadoneframe函数,此函数会调用通信接口层中所有模块对象的同名函数。
18.work函数,此函数会调用业务逻辑层、传输协议层、通信接口层中所有模块对象的同名函数,此函数是单片机程序构建方法的核心,它最终实现了数据在上下层中的传递,同时也是所有业务处理的入口函数。
19.start函数,此函数会调用业务逻辑层、传输协议层、通信接口层中所有模块对象的同名函数,是启动单片机程序的入口函数。
20.timerhandler函数,此函数会调用业务逻辑层中所有模块对象的同名函数,是所有业务逻辑模块对象处理时钟处理的入口函数。
21.(2)设备层实际设备模块结构体,实际的设备层设备模块结构体必须以设备层基础结构体为基础进行定义,既结构体的第一变量必须为pdevinfo_st类型,这样做是为了方
便变量类型转换,这是借鉴了面向对象编程思想。
22.业务逻辑层是单片机程序的核心,负责业务数据最终处理以及业务流程的实现,可以由多个业务逻辑模块对象组成,每个业务逻辑模块对象只负责一类业务数据处理以及相关的业务流程的实现;业务逻辑层中每个业务模块对象中都存储着上层设备模块对象的指针和与之一一对应的下层传输协议层的传输协议模块对象的指针,通过此指针实现数据向下层传输协议层的传递,同时还存储这传输协议层对外提供的标准api函数接口,通过下层传输协议层对这些函数的调用实现数据从传输协议层传递到业务逻辑层。
23.业务逻辑层包括业务逻辑层基础结构体和实际业务逻辑模块结构体。
24.(1)业务逻辑层基础结构体,业务逻辑模块对象中存储的一般属性数据都在业务逻辑层基础结构体中定义,包括:下层(传输协议层)传输协议模块对象指针、上层(设备层)设备模块对象的指针和业务模块对象编号;同时业务逻辑模块对象对外提供的标准api函数接口,也都在业务逻辑层基础结构体中定义,包括:work、timerhandler、analysisframefinished、start、getcominterface。主要函数介绍:work函数,驱动数据的上下层传递,以及进行业务数据的出来。
25.timerhandler函数,时钟中断处理。
26.analysisframefinished函数,下层(传输协议层)传输协议模块对象协议解析完毕回调通知函数。
27.start函数,业务启动函数。
28.(2)实际业务逻辑模块结构体,实际的业务逻辑层业务模块结构体必须以业务逻辑层基础结构体为基础进行定义,既结构体的第一变量必须为pbuslayer_st类型,这样做是为了方便变量类型转换,这是借鉴了面向对象编程思想。
29.传输协议层负责接收业务逻辑模块传递的参数并以此生成相应的原始协议数据传递给下层通信接口层;负责将通信接口层上传的原始协议数据,解析成具有实际含义的数据,并存储在传输协议模块对象中,然后通知上层业务逻辑层模块对象协议解析完毕(通过回调函数analysisframefinished的调用),并对数据进行业务处理。传输协议层可以由多个传输协议模块对象组成,每个传输协议模块对象只为与之相对于上层业务逻辑模块对象提供协议数据发送和协议数据解析服务。传输协议模块对象中存储着之一一对应的上层业务模块对象指针和与之一一对应的下层通信接口模块对象的指针,同时还存储这传输协议模块对象对外提供的标准api函数接口,通过这些变量和api接口可实现数据的上下层传递。
30.(1)传输协议层基础结构体,传输协议模块对象存储的一般属性数据都在传输协议层基础结构体中定义,包括:下层通信接口层模块对象指针、上层业务逻辑模块对象指针;同时传输协议模块对象对外提供的标准api函数接口,也都在传输协议层基础结构体中定义,包括:checkframe、framehandler、analysisframe、start、work。
31.主要函数介绍:checkframe函数,用于判断原始协议数据是否合规,内部函数。
32.framehandler函数,协议解析函数。
33.analysisframe函数,通信接口模块对象接收模块接收协议数据完毕回调函数,其
中会调用framehandler函数。
34.(2)实际传输协议模块结构体,实际的传输协议层传输协议模块结构体必须以传输协议层基础结构体为基础进行定义,既结构体的第一变量必须为ptransprotocol_st类型,这样做是为了方便变量类型转换,这是借鉴了面向对象编程思想。
35.通信接口层通过对硬件抽象层的api接口进行二次封装以及fifo发送队列的引入,实现以dma方式发送和接收协议数据;具体来说就是接收上层传输协议层模块对象传递下来的原始协议数据并添加至fifo发送队列尾部,当上一帧协议数据发送完毕后,从发送队列头部取出一帧协议数据通过hal的api接口发送至物理层;当物理层接收完一帧原始协议数据后通过hal回调函数通知通信接口层模块对象一帧协议数据接收完毕,并存储起来通知传输协议模块对象解析接收到的协议数据。通信接口层可以由多个通信接口模块对象组成,每个通信接口模块对象只为与之相对于上层传输协议模块对象提供协议数据发送和协议数据接收服务。通信接口层中每个模块对象中都存储着之一一对应的上层传输协议模块对象指针和与之一一对应的下层hal通信对象的指针,同时还存储该层对外提供的标准api函数接口,通过这些变量和api接口实现数据的上下层传递。
36.(1)通信接口层基础结构体,通信接口模块对象存储的一般属性数据都在通信接口层基础结构体中定义,包括:下层hal通信对象指针、上层传输协议模块对象指针和通信接口种类;同时通信接口层对外提供的标准api函数接口,也都在通信接口层基础结构体中定义,包括:senddata、applysendbuf、retsendbuf、work、completesendoneframe,completereadoneframe、errhandle、start。
37.主要函数介绍:senddata函数,上层模块对象调用此函数发送数据。
38.work函数,在此函数中最终实现发送数据的向下层传递以及接收数据的向上层传递。
39.completesendoneframe函数,在硬件抽象层的数据发送完毕回调函数中调用此函数,通知模块对象一帧数据发送完毕。
40.completereadoneframe函数,在硬件抽象层的数据发送完毕回调函数中调用此函数,通知模块对象一帧数据接收完毕。
41.start函数,模块收发数据功能启动函数。
42.(2)实际通信接口模块结构体,实际的通信接口层通信接口模块结构体必须以通信接口层基础结构体为基础进行定义,既结构体的第一变量必须为pcominterface_st类型,这样做是为了方便变量类型转换,这是借鉴了面向对象编程思想。
43.硬件抽象层实现对各种硬件寄存器操作进行函数化封装,一般单片机厂商会提供完整的hal库。
44.物理层包括各种数据寄存器以及数据收发需要的物理实体。
45.对方案中的专业名词进行解释如下:mcu:又称单片微型计算机(single chip microcomputer )或者单片机。
46.dma:dma传输将数据从一个地址空间复制到另外一个地址空间,而不需要cpu核心参与。
47.结构体:结构体是c语言中一种重要的数据类型,该数据类型由一组称为成员(或
称为域,或称为元素)的不同数据组成,其中每个成员可以具有不同的类型。结构体通常用来表示类型不同但是又相关的若干数据。
48.api:是一些预先定义的接口(如函数、http接口),或指软件系统不同组成部分衔接的约定。
49.fifo:fifo(first input first output),即先进先出队列。
50.对象:对象可以是一个变量,一个数据结构,或是一个函数;是面向对象(object oriented)中的术语,既表示客观世界问题空间(namespace)中的某个具体的事物,又表示软件系统空间中的基本元素。
51.最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围,其均应涵盖在本发明的权利要求和说明书的范围当中。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1