浅谈单片机程序架构

合集下载

单片机程序分层

单片机程序分层

单片机程序分层单片机程序分层法是一种非常重要的编程方法,这种方法能够帮助程序员将程序的复杂性分解成不同的层级,从而更好地组织和管理代码,并提高程序的可读性、可维护性和可扩展性。

下面我们将详细介绍单片机程序分层的概念和实现方法。

一、概念单片机程序分层,顾名思义就是将一个复杂的程序划分成若干个不同的层级,每个层级都是一个独立的模块,这些模块相互依赖,各司其职,最终完成系统的任务。

通常情况下,单片机程序的分层可以分为三个层次:应用层、驱动层和硬件层。

应用层:应用层主要是负责完成系统的业务逻辑,这一层通常是程序员最主要的工作区域,他们通过编写代码实现算法、处理数据等任务。

这一层的代码通常是高度抽象的,具有很强的可移植性和可读性。

驱动层:驱动层主要是负责控制硬件资源的分配和管理,例如:控制输入输出口、USART串口、SPI等常见的外设接口。

驱动层的代码与具体的硬件相关,通常需要根据不同的硬件平台做出一定的修改。

硬件层:硬件层主要是与硬件相关的代码,例如:控制LED灯、蜂鸣器等设备的开和关等功能。

这一层代码通常较为底层,可移植性较差,但执行效率要高于其他两个层次。

二、实现方法单片机程序分层方法的核心就是将系统的功能进行分解,然后将分解得到的功能组织成不同层级的模块。

下面我们以一个LED闪烁程序为例,来看看如何实现单片机程序的分层。

1.硬件层首先,我们需要配置GPIO口,选择一个可控制的IO口,然后实现LED的闪烁。

通常情况下,硬件层代码相对简单,下面是一个基本的LED闪烁程序:#include "stm32f10x.h" //包含STM32的头文件#define LED GPIO_Pin_5 //LED控制IO口void LED_Init(void) //初始化GPIO口{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //GPIOA口时钟使能GPIO_InitStructure.GPIO_Pin = LED;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_SetBits(GPIOA, LED); //LED关闭(高电平)}2.驱动层在驱动层,我们需要编写与硬件设备相关的代码,这应该是单片机程序的最核心部分。

51单片机的结构

51单片机的结构

51单片机的结构51单片机是指一种集成了中央处理器、存储器和各种输入输出接口的单片集成电路。

它由Intel公司于1980年推出,采用了Harvard架构,是一种典型的8位单片机,无论在学校教学还是工业控制领域都得到了广泛的应用。

一、内部结构51单片机的内部结构主要由中央处理器、存储器和输入输出接口组成。

1. 中央处理器51单片机的中央处理器包含一个8位的累加寄存器A、一个8位的B寄存器、一个16位的程序计数器PC以及各种控制寄存器。

其中累加寄存器A是数据处理的核心,用于存储运算的结果。

B寄存器可用作直接寻址时的源操作数或目的操作数。

2. 存储器51单片机的存储器主要分为程序存储器和数据存储器。

程序存储器用于存储程序的指令,通常采用只读存储器(ROM)的形式。

数据存储器用于存储程序中的数据,包括RAM和各种寄存器。

3. 输入输出接口51单片机的输入输出接口包括通用输入输出口(GPIO)、串行通信口(UART)、定时器/计数器等。

GPIO用于与外部器件进行数据交互,可用于输入和输出。

UART用于与其他设备进行串行通信,常用于与计算机进行通信。

定时器/计数器可用于计时和定时中断控制。

二、工作原理51单片机的工作原理可以简单概括为:接收指令、执行指令、更新PC。

1. 接收指令51单片机从程序存储器中读取指令,并将指令暂存在指令寄存器中。

指令寄存器会将指令的地址信息传递给地址寄存器,以便读取下一条指令。

2. 执行指令51单片机根据指令的类型和操作码,执行相应的操作。

这可能涉及到对寄存器或存储器的读取、写入、算术运算、逻辑运算等。

执行的结果通常会存储在累加寄存器A中。

3. 更新PC在执行完一条指令后,51单片机会自动更新程序计数器PC的值,使其指向下一条要执行的指令地址。

这样就能够实现程序的顺序执行。

三、应用领域51单片机广泛应用于各个领域,包括嵌入式系统、家电控制、汽车电子、工业自动化等。

1. 嵌入式系统51单片机作为一种低成本、低功耗、易于开发和集成的微处理器,被广泛应用于嵌入式系统中。

单片机的内部结构及工作原理解析

单片机的内部结构及工作原理解析

单片机的内部结构及工作原理解析单片机(Microcontroller)是指集成了中央处理器(CPU)、存储器(ROM、RAM)、输入/输出(I/O)接口和定时器/计数器等功能模块的一种超大规模集成电路。

在现代电子设备中,单片机已经广泛应用于各个领域,如家电、智能设备、汽车电子等。

而了解单片机的内部结构及工作原理,对于进行嵌入式系统开发和电子产品设计具有重要的意义。

一、内部结构单片机主要分为中央处理器(CPU)、存储器、输入/输出接口(I/O)和定时器/计数器等几个主要部分。

1. 中央处理器(CPU):单片机的核心部分是CPU,它负责执行各种指令并控制整个单片机的操作。

CPU主要包括运算器、控制器和时序发生器。

运算器是负责执行各种运算操作的部分,包括算术运算、逻辑运算等。

控制器负责解析和执行指令,控制整个系统的工作。

时序发生器则负责产生各种时钟信号来同步整个系统的工作。

2. 存储器:单片机中的存储器分为可编程只读存储器(Programmable Read-Only Memory,PROM)、只读存储器(Read-Only Memory,ROM)和随机存储器(Random Access Memory,RAM)等几种类型。

PROM用于存储程序代码和常量数据,ROM用于存储不可更改的程序代码和数据,而RAM用于存储临时变量、中间结果等。

存储器的容量和类型取决于单片机的规格和需求。

3. 输入/输出接口(I/O):单片机通过输入/输出接口与外部设备进行数据交换。

输入接口用于接收外部信号或数据,如按键、传感器等。

输出接口用于向外部设备发送信号或数据,如LED灯、液晶显示器等。

单片机通常提供多个通用输入/输出引脚(General Purpose Input/Output,GPIO)来扩展外部设备的连接。

4. 定时器/计数器:定时器和计数器是单片机中重要的功能模块,用于产生精确的时间延迟和计数功能。

定时器用于产生周期性的定时信号,计数器则用于对外部事件的计数。

简述一般单片机的结构及各个部分的功能

简述一般单片机的结构及各个部分的功能

简述一般单片机的结构及各个部分的功能单片机(Microcontroller)是一种集成了处理器核心、存储器和各种外设接口的微型计算机系统。

它通常被应用于嵌入式系统中,用于控制、通信和数据处理等任务。

本文将对一般单片机的结构及各个部分的功能进行简述。

一、单片机的结构一般单片机包含三个核心部分,即中央处理器(Central Processing Unit,简称CPU)、存储器和外设接口。

这些部分通过总线连接在一起,形成了一个完整的单片机系统。

1. 中央处理器(CPU)中央处理器是单片机的核心部件,它负责执行程序指令、控制数据流动和处理数据。

CPU包括指令执行单元、时钟控制单元和寄存器等模块。

指令执行单元解码和执行存储器中的程序指令,时钟控制单元提供时钟信号使CPU工作,寄存器用于存储和传输数据。

2. 存储器存储器用于存储程序指令和数据。

它通常包括随机存储器(Random Access Memory,简称RAM)和只读存储器(Read-Only Memory,简称ROM)。

RAM用于存储临时数据和程序运行过程中的中间结果,可读写。

ROM用于存储程序指令和常量数据,只读。

3. 外设接口外设接口是连接单片机与外部设备的接口,用于与外界进行信息交互。

常见的外设接口包括通用输入输出口(General PurposeInput/Output,简称GPIO)、串行接口、模拟到数字转换器(Analog-to-Digital Converter,简称ADC)等。

GPIO用于连接外部开关、LED 灯等外设,串行接口用于与其他设备进行串行通信,ADC用于将模拟信号转换为数字信号。

二、各个部分的功能1. 中央处理器(CPU)功能:- 指令执行:解码和执行存储器中的程序指令。

- 数据处理:对数据进行算术和逻辑运算。

- 控制:控制程序流程和数据流动。

2. 存储器功能:- RAM功能:存储程序执行过程中的中间结果、临时数据等。

- ROM功能:存储程序指令、常量数据等。

手把手教你单片机程序框架---吴坚鸿

手把手教你单片机程序框架---吴坚鸿

第一节:吴坚鸿谈初学单片机的误区。

(1)很难记住繁杂的寄存器?寄存器不用死记硬背,鸿哥我行走江湖多年,连一个寄存器都记不住。

需要配置寄存器的时候,直接在网上或者书本上参考别人现成的配置程序是上策,查找芯片数据手册是中策,死记硬背寄存器是最最下策。

(2)很难记住繁杂的汇编语言指令?除非是在校学生要应付考试或者少数工作中绕不开汇编,否则学汇编就是浪费时间。

鸿哥我行走江湖多年,从来就没有用汇编帮客户做过一个项目。

(3)C语言很难学?你不用学指针,你不用学带形参的函数,你不用学结构体,你不用学宏定义,你不用学文件操作,你也不用死记繁琐的数据类型。

你只要会:5条指令语句switch语句,if else语句,while语句,for语句,=赋值语句。

7个运算符+,-,*,/,|,&,!。

4个逻辑关系符||,&&,!=,==.3个数据类型unsigned char, unsigned int, unsigned long。

3个进制相互转化,二进制,十六进制,十进制。

1个void函数。

1个一维数组code(或const) unsigned char array[]。

那么世界上任何一种逻辑功能的单片机软件你都能做出来。

鸿哥我当年刚毕业出来工作的时候才知道可以用C语言开发单片机,一开始只用if 语句就把项目做出来了,没有用指针,没有用带形参的函数等复杂的功能。

再到后来才慢慢开始用C语言其他的高级功能,但是我发现C语言其他的高级功能,本质上都是用我前面列举出来的最基本功能集合而成,只是书写更加简单方便了一点,编译后的机器码都大同小异。

所以不会指针等高级功能你不用自卑,恰恰相反,当你会最简单的几个语句,就把这些高级功能的程序都做出来了,你才发现你对底层了解得更加透切,再学那些高级功能轻而易举。

当你裸机跑的程序都能够协调得很好的时候,你才发现所谓高深的操作系统也不过如此,只要给你时间和金钱你也可以写个操作系统来玩玩。

单片机的内部结构及功能介绍

单片机的内部结构及功能介绍

单片机的内部结构及功能介绍单片机(Microcontroller)是指将中央处理器(CPU)、存储器、输入/输出端口和时钟电路等功能集成在一块芯片上的集成电路。

它通常用于嵌入式系统中,广泛应用于各种电子设备如家用电器、汽车控制系统、工业自动化等领域。

本文将介绍单片机的内部结构和功能,以帮助读者更好地理解单片机的工作原理。

一、内部结构单片机的内部结构一般包括以下几个主要部分:1. 中央处理器(CPU):单片机的核心部分,负责执行指令、控制数据流和实现各种运算逻辑。

CPU的性能直接影响到单片机的运行速度和处理能力。

2. 存储器:包括程序存储器(ROM)和数据存储器(RAM)。

ROM用来存储程序代码和常量数据,通常是只读的;RAM用来存储程序执行过程中的临时数据,是临时性的存储器。

3. 输入/输出端口:用于连接外部设备和单片机进行数据交换。

通过输入/输出端口,单片机可以实现与外部设备的通信和控制。

4. 时钟电路:提供时钟信号,用于同步单片机内部各个部分的工作,确保各部分之间的协调运行。

二、功能介绍单片机的功能主要包括以下几个方面:1. 控制功能:单片机可以执行各种控制算法,实现对外部设备的精确控制。

例如控制温度、湿度、速度等参数。

2. 数据处理功能:单片机可以处理各种数据,包括数字信号和模拟信号。

通过模数转换器(ADC)和数模转换器(DAC),单片机可以实现数字信号和模拟信号之间的转换。

3. 通信功能:单片机可以通过串口、并口、网络等方式与其他设备进行通信,实现数据的传输和交换。

4. 定时功能:单片机可以通过时钟信号实现定时功能,如定时器、计数器等,用于控制事件的发生时间和时序。

5. 中断功能:单片机可以响应外部中断、定时中断等,及时处理外部事件,提高系统的响应速度和实时性。

总结通过了解单片机的内部结构和功能,我们更清楚地认识到单片机是一种集成度高、功能强大的微型计算机,广泛应用于各个领域。

单片机的设计结构和功能强大,为嵌入式系统的开发和应用提供了有力支持,也为我们的生活和工作带来了便利。

嵌入式单片机三种应用程序架构

嵌入式单片机三种应用程序架构

嵌入式单片机三种应用程序架构嵌入式单片机是一种集成了处理器、存储器、输入输出接口等功能的微型计算机系统,广泛应用于各种电子设备中。

针对不同的应用需求,嵌入式单片机可以采用不同的应用程序架构。

下面将介绍三种常见的嵌入式单片机应用程序架构,包括单任务、多任务和事件驱动架构。

一、单任务架构在单任务架构下,嵌入式单片机只能执行一项任务,也就是一次只能处理一个事件。

程序代码是按照顺序执行的,没有并行处理的能力。

在单任务架构下,主程序中通常包含一个主循环,通过循环不断地检测各种外部事件的发生并作出相应的处理。

例如,一个简单的嵌入式系统可能需要周期性地读取传感器数据并进行处理,然后将处理结果输出到显示屏上。

单任务架构的优点在于编程简单,逻辑清晰,适用于单一功能较简单的场景。

同时,由于不需要考虑并行处理的复杂性,系统资源的管理也相对简单。

然而,单任务架构的缺点在于不能同时进行多个任务处理,效率较低,且无法处理实时性要求较高的应用场景。

二、多任务架构多任务架构是一种支持多个任务并发执行的应用程序架构。

在多任务架构下,嵌入式单片机可以同时处理多个任务,提高系统的处理效率。

每个任务都有自己的代码段和数据段,并且任务之间可以实现相互通信和数据共享。

实现多任务的方法有多种,最常见的是利用操作系统的支持。

操作系统可以为每个任务分配独立的时间片,并负责任务的切换和调度。

常见的嵌入式操作系统有uc/OS、FreeRTOS等。

多任务架构的优点在于可以提高系统的并发处理能力,适用于多任务、复杂功能的应用场景。

同时,多任务架构可以实现任务间的相互独立,提高系统的可维护性和可重用性。

然而,多任务架构在设计和开发过程中需要考虑任务间的调度、通信、同步等问题,复杂度较高。

三、事件驱动架构事件驱动架构是一种基于事件触发的应用程序架构。

在事件驱动架构下,嵌入式单片机依据外部事件的发生而作出相应的响应,而非简单的按序执行代码。

事件可以是外部信号(如按键输入、传感器数据等)、定时器中断、通信中断等。

单片机程序架构和分层

单片机程序架构和分层

单片机程序架构通常采用分层设计,以增强程序的可移植性、可维护性和模块化。

以下是一些常见的分层方式:
1.管理层:这一层负责整个系统的协调和管理,包括系统初始化、任务调度、资源管理等。

它通常是与硬件无关的部分,负责决策和策略的实施。

2.具体设备层:这一层包含与特定硬件设备直接交互的代码,例如按键、屏幕、传感器等。

这些代码通常包含了设备驱动程序,负责具体的硬件操作。

3.内核抽象层(KAL):这一层提供了对操作系统或内核功能的抽象,使得上层应用不需要关心底层的具体实现细节。

这样可以在不同的操作系统或内核之间移植应用程序。

4.芯片抽象层(CAL):这一层是对微控制器特定功能(如定时器、串口、ADC等)的抽象,它封装了与芯片相关的操作,为上层提供统一的接口。

5.应用层:这是最接近用户的一层,包含了用户界面、业务逻辑等。

它使用下层提供的服务来完成具体的功能。

6.驱动层:这一层包含设备的驱动程序,负责直接与硬件通信,如SPI、I2C等通信协议的实现。

7.固件层:这是最底层,通常是由官方提供的库函数,直接对寄存器进行操作,是与硬件最接近的软件层次。

总的来说,在设计单片机程序时,采用分层思想可以提高程序的可读性和可维护性,同时也便于团队协作开发。

每一层都有其特
定的职责,上层依赖于下层提供的服务,而不需要关心服务的实现细节。

这种分层屏蔽的思想不仅存在于单片机程序设计中,也是许多复杂系统设计中的常见做法,如操作系统、网络协议等都是基于分层架构设计的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浅谈单片机应用程序架构对于单片机程序来说,大家都不陌生,但是真正使用架构,考虑架构的恐怕并不多,随着程序开发的不断增多,本人觉得架构是非常必要的。

前不就发帖与大家一起讨论了一下《谈谈怎样架构你的单片机程序》,发现真正使用架构的并不都,而且这类书籍基本没有。

本人经过摸索实验,并总结,大致应用程序的架构有三种:1. 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接通过执行顺序编写应用程序即可。

2. 时间片轮询法,此方法是介于顺序执行与操作系统之间的一种方法。

3. 操作系统,此法应该是应用程序编写的最高境界。

下面就分别谈谈这三种方法的利弊和适应范围等。

1. 顺序执行法:这种方法,这应用程序比较简单,实时性,并行性要求不太高的情况下是不错的方法,程序设计简单,思路比较清晰。

但是当应用程序比较复杂的时候,如果没有一个完整的流程图,恐怕别人很难看懂程序的运行状态,而且随着程序功能的增加,编写应用程序的工程师的大脑也开始混乱。

即不利于升级维护,也不利于代码优化。

本人写个几个比较复杂一点的应用程序,刚开始就是使用此法,最终虽然能够实现功能,但是自己的思维一直处于混乱状态。

导致程序一直不能让自己满意。

这种方法大多数人都会采用,而且我们接受的教育也基本都是使用此法。

对于我们这些基本没有学习过数据结构,程序架构的单片机工程师来说,无疑很难在应用程序的设计上有一个很大的提高,也导致了不同工程师编写的应用程序很难相互利于和学习。

本人建议,如果喜欢使用此法的网友,如果编写比较复杂的应用程序,一定要先理清头脑,设计好完整的流程图再编写程序,否则后果很严重。

当然应该程序本身很简单,此法还是一个非常必须的选择。

下面就写一个顺序执行的程序模型,方面和下面两种方法对比:复制内容到剪贴板代码:/****************************************************************************** ********* FunctionName : main()* Description : 主函数* EntryParameter : None* ReturnValue : None******************************************************************************* *******/int main(void){uint8 keyValue;InitSys(); // 初始化while (1){TaskDisplayClock();keyValue = TaskKeySan();switch (keyValue){case x: TaskDispStatus(); break;...default: break;}}}2. 时间片轮询法时间片轮询法,在很多书籍中有提到,而且有很多时候都是与操作系统一起出现,也就是说很多时候是操作系统中使用了这一方法。

不过我们这里要说的这个时间片轮询法并不是挂在操作系统下,而是在前后台程序中使用此法。

也是本贴要详细说明和介绍的方法。

对于时间片轮询法,虽然有不少书籍都有介绍,但大多说得并不系统,只是提提概念而已。

下面本人将详细介绍本人模式,并参考别人的代码建立的一个时间片轮询架构程序的方法,我想将给初学者有一定的借鉴性。

记得在前不久本人发帖《1个定时器多处复用的问题》,由于时间的问题,并没有详细说明怎样实现1个定时器多处复用。

在这里我们先介绍一下定时器的复用功能。

使用1个定时器,可以是任意的定时器,这里不做特殊说明,下面假设有3个任务,那么我们应该做如下工作:1. 初始化定时器,这里假设定时器的定时中断为1ms(当然你可以改成10ms,这个和操作系统一样,中断过于频繁效率就低,中断太长,实时性差)。

2. 定义一个数值:复制内容到剪贴板代码:#define TASK_NUM (3) // 这里定义的任务数为3,表示有三个任务会使用此定时器定时。

uint16 TaskCount[TASK_NUM] ; // 这里为三个任务定义三个变量来存放定时值uint8 TaskMark[TASK_NUM]; // 同样对应三个标志位,为0表示时间没到,为1表示定时时间到。

3. 在定时器中断服务函数中添加:复制内容到剪贴板代码:/****************************************************************************** ********* FunctionName : TimerInterrupt()* Description : 定时中断服务函数* EntryParameter : None* ReturnValue : None******************************************************************************* *******/void TimerInterrupt(void){uint8 i;for (i=0; i<TASKS_NUM; i++){if (TaskCount[i]){TaskCount[i]--;if (TaskCount[i] == 0){TaskMark[i] = 0x01;}}}}代码解释:定时中断服务函数,在中断中逐个判断,如果定时值为0了,表示没有使用此定时器或此定时器已经完成定时,不着处理。

否则定时器减一,知道为零时,相应标志位值1,表示此任务的定时值到了。

4. 在我们的应用程序中,在需要的应用定时的地方添加如下代码,下面就以任务1为例:复制内容到剪贴板代码:TaskCount[0] = 20; // 延时20msTaskMark[0] = 0x00; // 启动此任务的定时器到此我们只需要在任务中判断TaskMark[0] 是否为0x01即可。

其他任务添加相同,至此一个定时器的复用问题就实现了。

用需要的朋友可以试试,效果不错哦。

通过上面对1个定时器的复用我们可以看出,在等待一个定时的到来的同时我们可以循环判断标志位,同时也可以去执行其他函数。

循环判断标志位:那么我们可以想想,如果循环判断标志位,是不是就和上面介绍的顺序执行程序是一样的呢?一个大循环,只是这个延时比普通的for循环精确一些,可以实现精确延时。

执行其他函数:那么如果我们在一个函数延时的时候去执行其他函数,充分利用CPU时间,是不是和操作系统有些类似了呢?但是操作系统的任务管理和切换是非常复杂的。

下面我们就将利用此方法架构一直新的应用程序。

时间片轮询法的架构:1.设计一个结构体:复制内容到剪贴板代码:// 任务结构typedef struct _TASK_COMPONENTS{uint8 Run; // 程序运行标记:0-不运行,1运行uint8 Timer; // 计时器uint8 ItvTime; // 任务运行间隔时间void (*TaskHook)(void); // 要运行的任务函数} TASK_COMPONENTS; // 任务定义这个结构体的设计非常重要,一个用4个参数,注释说的非常详细,这里不在描述。

2. 任务运行标志出来,此函数就相当于中断服务函数,需要在定时器的中断服务函数中调用此函数,这里独立出来,并于移植和理解。

复制内容到剪贴板代码:/****************************************************************************** ********* FunctionName : TaskRemarks()* Description : 任务标志处理* EntryParameter : None* ReturnValue : None******************************************************************************* *******/void TaskRemarks(void){uint8 i;for (i=0; i<TASKS_MAX; i++) // 逐个任务时间处理{if (TaskComps[i].Timer) // 时间不为0{TaskComps[i].Timer--; // 减去一个节拍if (TaskComps[i].Timer == 0) // 时间减完了{TaskComps[i].Timer = TaskComps[i].ItvTime; // 恢复计时器值,从新下一次TaskComps[i].Run = 1; // 任务可以运行}}}}大家认真对比一下次函数,和上面定时复用的函数是不是一样的呢?3. 任务处理复制内容到剪贴板代码:/****************************************************************************** ********* FunctionName : TaskProcess()* Description : 任务处理* EntryParameter : None* ReturnValue : None**************************************************************************************/void TaskProcess(void){uint8 i;for (i=0; i<TASKS_MAX; i++) // 逐个任务时间处理{if (TaskComps[i].Run) // 时间不为0{TaskComps[i].TaskHook(); // 运行任务TaskComps[i].Run = 0; // 标志清0}}}此函数就是判断什么时候该执行那一个任务了,实现任务的管理操作,应用者只需要在main()函数中调用此函数就可以了,并不需要去分别调用和处理任务函数。

到此,一个时间片轮询应用程序的架构就建好了,大家看看是不是非常简单呢?此架构只需要两个函数,一个结构体,为了应用方面下面将再建立一个枚举型变量。

下面我就就说说怎样应用吧,假设我们有三个任务:时钟显示,按键扫描,和工作状态显示。

1. 定义一个上面定义的那种结构体变量复制内容到剪贴板代码:/****************************************************************************** ********* Variable definition******************************************************************************* *******/static TASK_COMPONENTS TaskComps[] ={{0, 60, 60, TaskDisplayClock}, // 显示时钟{0, 20, 20, TaskKeySan}, // 按键扫描{0, 30, 30, TaskDispStatus}, // 显示工作状态// 这里添加你的任务。

相关文档
最新文档