单片机模块化编程
单片机C语言学习之模块化编程完结篇

单片机C语言学习之模块化编程完结篇单片机C语言学习之模块化编程单片机模块化编程是针对编写容量较大的程序的一种编程方法,这种编程会更好的管理自己所建的工程文件。
下面是模块化编程的一般步骤:1.新建工程文件夹(如:C:\模块化编程),具体步骤略。
另外在此文件夹下新建四个文件,分别命名为output、src、inc和listing。
2.新建工程(直接命名为模块化编程并保存在工程文件夹下),具体步骤略。
3.设置TargetOptions对话框在Target窗口下做出如下图1、图2修改与设置。
图1图2之后还将做出如下步骤(图3、图4):图3图44.设置Components对话框将图6的两个红色箭头处改为图7那样(也可根据个人的情况来命名),如果想新建或删除已有的文件,可以点击1,2位置来进行新建或删除。
图5之后弹出图6所示的界面。
图65.新建源文件(.c文件和.h文件)先建main.c文件,直接将其保存在工程文件夹(C:\模块化编程)下;在建其他.c文件(如delay.c、led.c),将它们保存在src文件夹下;最后建.h文件(如delay.h、led.h、common.h),将它们保存在inc文件夹下。
6.添加源文件(.c文件)到工程具体方法如下图:图8图9添加成功后可以看到左栏如下图所示:图10图10那么接下来应该怎样在里面编写源程序就是非常关键的问题了。
.c 文件一般是用来放函数和定义的变量的,如主函数放在main.c中,延时函数放在delay.c中,.h文件是对各个模块的声明,也就是对相应的函数进行封装,在封装的过程中不能包含任何实质性的函数代码。
如用模块化编程来编写一个简单的单向流水灯程序,需要新建main.c、delay.c和led.c三个源文件以及common.h、delay.h和led.h三个.h文件。
具体代码如下://main.c文件#include#include"led.h"//包含该头文件,是因为主函数调用了流水灯函数void main(){led_flash();//调用流水灯函数}//delay.c文件#include"delay.h"void delay(uintz){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//led.c文件#include"led.h"uchar temp;//定义一个字符型的变量void led_flash(){temp=0xfe;P1=temp;while(1){temp=_crol_(temp,1);//循环左移delay(1000);//延时约1000msP1=temp;}}//common.h文件#ifndef_COMMON_H_#define_COMMON_H_typedef unsigned int uint;//宏定义typedef unsigned char uchar;//宏定义#endif//delay.h文件#ifndef_DELAY_H_#define_DELAY_H_#include"common.h"//由于delay.c文件中用到了宏定义uint,所以在这里要包含common.hextern void delay(uint z);#endif//led.h文件#ifndef _LED_H_#define _LED_H_#include"delay.h"//包含delay.h是由于led.c文件调用了delay()函数#include//在这里包含51头文件是因为led.c中用到了P1口#include//包含循环移位的头文件extern void led_flash();//在头文件中声明函数需冠以extern关键字#endif通俗的讲,一个模块化程序里面包含硬件驱动模块和软件功能模块。
论模块化编程技术在单片机实训中的应用

论模块化编程技术在单片机实训中的应用单片机是个小型电脑,可以完成不同的功能。
在制作项目的时候,需要为控制器编写程序。
模块化编程技术是将代码分成小的模块,然后再根据需要组合这些模块成为一个完整的程序。
这种技术在单片机实训中的应用非常广泛。
模块化编程技术可以让程序的编写更加清晰、系统化。
程序员可以利用这种技术,将问题分成易于管理的模块,然后优化模块。
模块可以重用,这样的话,将来的项目中也可以使用相同的模块。
这可以节省时间并降低出错的可能性。
在单片机实训中,模块化编程技术还有以下优点:1.提高代码的可读性单片机编程需要注意代码的可读性,这是因为代码是面向硬件的。
在编写代码时,程序员必须确定它将运行的硬件类型,并写出适当的代码。
如果代码不容易理解,那么就会导致程序员修改代码时出错。
通过使用模块,程序员可以更好地组织他们的代码,并使代码更具可读性。
2.提高代码可维护性单片机代码需要维护,因为硬件通常需要更新或修改。
如果代码是分散的,那么程序员在修改时就会很难掌握整体的逻辑。
但是,如果使用模块,它将有助于程序员快速识别代码中的问题,并更好地进行修改。
3.提升编码速度如果程序员需要为每个项目编写不同的代码,那么他们的工作会变得耗时负担重, 通过使用模块,程序员可以快速创建代码段,并重用现有的代码。
这将使编码速度更快并且节省时间。
总的来说,模块化编程技术在单片机实训中的应用非常重要。
它可以提高程序的可读性和可维护性,并加速编码速度。
模块化编程技术还可以使更好地组织和管理代码,最终达到更好的编码结果。
这对于初学者和有经验的编程人员来说都是一个十分有用的技能。
可以说,模块化编程技术是单片机编程中必不可少的技能。
单片机模块化编程教程

单片机模块化编程教程单片机模块化编程是一种将程序分解为多个独立模块的编程技术,每个模块负责实现特定的功能,通过模块之间的相互调用和协作,完成整个程序的功能。
模块化编程不仅可以提高代码的可读性和可维护性,还可以加快开发速度和提高代码的复用性。
本文将介绍单片机模块化编程的基本概念和具体实践。
首先,单片机模块化编程的基本思想是将程序按照功能划分为多个模块,每个模块只关注自己的功能实现,模块之间通过函数调用和全局变量进行数据传递和通信。
这种分解和组合的方式可以将复杂的程序结构简化为多个独立的、可测试和可重用的模块。
在进行单片机模块化编程时,我们需要明确每个模块的功能和接口。
功能描述了模块具体要实现的功能,接口定义了模块与其他模块之间的数据交换方式和调用方式。
通过良好定义的接口,模块之间可以相互独立地进行开发和测试,同时确保模块之间的集成和协作正确无误。
在实践中,单片机模块化编程可以按照以下步骤进行:1. 分析和设计:首先,我们需要分析程序的功能需求,并根据需求划分不同的模块。
然后,针对每个模块进行详细的设计,包括功能描述、接口定义和数据结构等。
2. 编写模块代码:接下来,我们根据设计的结果开始编写模块的具体代码。
在编写代码时,注意将功能实现和接口分离,确保代码的可读性和可维护性。
3. 测试和调试:完成模块的编写后,我们需要对每个模块进行测试和调试,确保其功能正常并与其他模块协同运行。
通过逐个测试模块,可以尽早发现和解决问题,提高开发效率。
4. 模块集成:当各个模块单独测试通过后,我们需要将它们集成到一个完整的程序中。
通过合理的模块调用和数据传递,确保整个程序的功能正常运行。
5. 优化和维护:最后,我们可以对模块化程序进行优化和维护。
优化可以提高程序的性能和效率,维护可以修复bug和添加新功能。
总之,单片机模块化编程是一种高效、可靠和可维护的编程技术。
通过将程序分解为多个独立模块,可以提高开发效率、代码质量和可维护性。
单片机编程方法

单片机编程方法
单片机(MCU)编程涉及到使用特定的编程语言(如C或汇编)来编写指令,这些指令告诉单片机如何执行特定的任务。
以下是一些单片机编程的基本步骤和注意事项:
1. 选择编程语言:大多数单片机编程使用C语言,因为它易于理解且效率高。
汇编语言也可以使用,但更复杂。
2. 选择开发环境:你需要一个集成开发环境(IDE),如Keil、IAR Embedded Workbench 或 Visual Studio等,这些IDE可以编译你的代码并上传到单片机。
3. 了解单片机的架构和特性:每种单片机都有其自己的指令集、特性和外设。
你需要阅读单片机的数据手册和技术规范,以了解如何编程和使用其外设。
4. 编写代码:根据你的需求,开始编写代码。
这可能涉及到配置单片机的各种外设(如GPIO、UART、SPI、PWM等),以及编写主程序。
5. 编译代码:使用IDE编译你的代码。
如果代码有错误,IDE会提示你。
6. 调试代码:编译成功后,将程序下载到单片机中进行调试。
使用调试器查看程序的运行状态,找出并修正任何错误。
7. 优化代码:根据需要优化代码,以提高其执行效率或减小其占用的存储空间。
8. 测试和部署:在确认代码工作正常后,进行更广泛的测试,然后将其部署到实际应用中。
以上就是单片机编程的基本步骤。
需要注意的是,单片机编程需要对硬件和软件都有深入的理解,因此可能需要一定的学习和实践才能掌握。
单片机的模块化编程

单⽚机的模块化编程当⼀个项⽬⼩组做⼀个相对⽐较复杂的⼯程时,就需要⼩组成员分⼯合作,⼀起完成项⽬,意味着不再是某⼈独⾃单⼲,⽽是要求⼩组成员各⾃负责⼀部分⼯程。
⽐如你可能只是负责通讯或者显⽰某⼀块,这个时候,就应该将⾃⼰的这⼀块程序写成⼀个模块,单独调试,留出接⼝供其它模块调⽤。
最后,⼩组成员都将⾃⼰负责的模块写完并调试⽆误后,由项⽬组长进⾏综合调试,像这些场合就要求程序必须模块化。
模块化的好处⾮常多,不仅仅是便于分⼯,它还有助于程序的调试,有利于程序结构的划分,还能增加程序的可读性和可移植性。
模块化编程的说明说明⼀:模块即是⼀个.c和⼀个.h的结合,头⽂件(.h)是对该模块的声明。
说明⼆:某模块提供给其他模块调⽤的外部函数以及数据需在所对应的.h⽂件中冠以extern关键字来声明。
说明三:模块内的函数和变量需在.c⽂件开头处冠以static关键字声明。
说明四:永远不要在.h⽂件中定义变量。
先解释⼀下说明中的两个关键词:定义和声明。
相信读者都是学过C语⾔的,本应该对这两个词理解的很透彻,可笔者在培训时发现,好多⼈都搞不清楚,都是凭着感觉写的,⾼兴了就⽤定义,不⾼兴了就⽤声明,这样做当然是不对的,换句话说是错的。
强势X⼊⼴告:什么是定义和声明?所谓的定义就是(编译器)创建⼀个对象,为这个对象分配⼀块内存并给它取上⼀个名字,这个名字就是我们经常所说的变量名或者对象名。
但注意,这个名字⼀旦和这块内存匹配起来(可以想象是这个名字嫁给了这块空间,没有要彩礼啊),它们就同⽣共死,终⽣不离不弃,并且这块内存的位置也不能被改变。
⼀个变量或对象在⼀定的区域内(⽐如函数内)只能被定义⼀次,如果定义多次,编译器会提⽰你重复定义同⼀个变量或对象。
什么是声明?声明确切的说应该有两重含义:(1)告诉编译器,这个名字已经匹配到⼀块内存上了(伊⼈已嫁,吾将何去何从?何以解忧,唯有稀粥),下⾯的代码⽤到变量或对象是在别的地⽅定义的。
单片机的模块化设计方法

单片机的模块化设计方法单片机作为嵌入式系统的核心部件,应用广泛且日益重要。
在单片机的开发过程中,模块化设计方法被广泛应用,以提高开发效率、提升系统可维护性和可扩展性。
本文将介绍单片机的模块化设计方法,并针对不同应用场景提出了几种常见的模块化设计策略。
一、模块化设计的概念模块化设计是将系统划分为相互独立、功能完整、可重用的模块,在开发过程中逐步组合模块以达到系统的设计目标。
通过模块化设计,可以实现模块间的低耦合、高内聚,使得系统的开发和维护更加容易。
二、单片机模块化设计的好处1. 提高开发效率:通过模块化设计,可以将复杂系统分解为独立功能的模块,各个模块可以并行开发,提高开发效率。
2. 减少系统复杂度:模块化设计使得系统结构清晰,各个模块之间通过接口进行通信,减少系统的复杂度。
3. 提高系统可维护性:模块化设计使得系统结构清晰可见,模块间的独立性可以方便维护和测试。
4. 提高系统可重用性:通过模块化设计,可以将一些通用性的模块进行封装,方便在不同项目中重复使用。
三、模块化设计方法1. 基于功能的模块化设计:按照系统的功能进行模块划分,每个模块负责完成一个特定的功能,模块之间通过接口进行通信。
这种方法适用于功能相对独立、较小规模的系统。
2. 基于层次的模块化设计:按照系统的层次关系进行模块划分,将系统分为底层驱动模块、中间控制模块和上层应用模块。
各个层次之间通过接口进行通信,实现功能的层次化分解。
这种方法适用于系统功能较为复杂的情况。
3. 基于事件驱动的模块化设计:将系统划分为事件处理模块和事件产生模块。
事件产生模块负责监测外部事件或者内部状态变化,并向事件处理模块发送事件消息。
事件处理模块根据接收到的事件消息进行相应的处理。
这种方法适用于异步事件比较多的系统。
四、模块化设计实例分析以智能家居系统为例,介绍基于功能的模块化设计方法。
智能家居系统可以分为以下几个功能模块:温度监测模块、照明控制模块、安防监控模块和电器控制模块。
keil模块化编程方法

Keil 模块化编程方法介绍 Keil 模块化编程的方法和步骤,以及如何使用该方法编写单片机程序。
下面是本店铺为大家精心编写的3篇《Keil 模块化编程方法》,供大家借鉴与参考,希望对大家有所帮助。
《Keil 模块化编程方法》篇1Keil 模块化编程方法是一种将单片机程序拆分为多个模块,每个模块实现一个特定功能的编程方法。
这种方法可以提高程序的可读性、可维护性和可扩展性,同时也方便了多人协作开发。
下面将介绍Keil 模块化编程的具体方法和步骤。
1. 建立单片机程序编辑窗口,选择适当的单片机型号并设置好频率和勾选 hex 文件。
2. 创建一个新的头文件,用于声明本模块的功能和接口。
在头文件中,可以使用条件编译语句 #ifndef #endif 来声明本头文件,要大写。
对于在 main 函数中没有出现的变量和函数,要在头文件中用 extern 声明。
3. 在 main 函数中包含所有的头文件,并在其中调用各个模块的功能。
4. 为每个模块创建一个单独的源文件,用于实现该模块的功能。
在源文件中,可以使用 #include 语句包含头文件,以便使用其他模块提供的功能。
5. 在每个源文件中,首先声明本模块需要的变量和函数,并使用 #pragma module 语句将模块定义为 Keil 模块。
6. 在 Keil 编译器中,将所有源文件添加到项目中,并设置好编译选项。
7. 编译和下载程序到单片机中,运行程序并测试模块的功能。
通过使用 Keil 模块化编程方法,可以方便地编写单片机程序,提高程序的可读性和可维护性。
《Keil 模块化编程方法》篇2Keil 模块化编程是一种使用 Keil 集成开发环境 (IDE) 进行软件开发的方法,它强调模块化、组件化的设计和编程思想,以提高代码的可重用性、可维护性和可扩展性。
以下是 Keil 模块化编程的一些基本原则和方法:1. 使用头文件进行模块化设计:在 Keil 模块化编程中,每个模块都有自己的头文件,头文件中包含了该模块的所有函数、变量、常量等的声明。
单片机汇编语言的模块化编程方法举例

(上接 16 页)
二、元件选择
液体水平检测开关采用透明硬塑材料(如光 盘盒)粘合而成,具体尺寸由电子水准仪的长度、 宽度和高度决定,以刚好放入不松动和不影响顶 盖与底盒切合为宜 ;四根电极采用不易被水侵蚀 的 金 属 丝( 如 镀 镍、 镀 铬 的 导 线 ), 用 微 型 钻 头 打孔后用防水胶(如市售普通 AB 胶)粘固密封。 为了提高灵敏度,液体检测开关长度尽可能大一 点,上面两根电极要尽可能接近水面,注好水密 封后一定要检察是否漏水。为使效果明显,液体
制作天地
HANDS ON PROJECTS
编者按 :单片机的汇编语言是学习单片机的基础,而汇编语言的最大不足就是程序的结构不清晰和易读 性差,而模块化编程能在一定程序上弥补这一缺陷。作者结合其教学经验,提出的汇编语言的模块化编程的 理念,值得从事单片机编程的技术员借鉴,特别是对初学单片机的人,更是有必要。
把已有的功能子程序简单地堆放在一起就可以实 现的,而是要把这些子程序进行有机的整合才行。 那么,在整合的过程中会遇到哪些问题?要注意 哪些问题?下面我们以一个交通灯项目为例,运 用子程序化、模块化的编程方法进行编程,并把 编程的过程做一个完整的讲述,希望读者对这种 编程方法有一个具体的认识。
一、交通灯项目的任务分析
在进行项目教学时我们发现,同学们也知道 这个项目需要哪几个任务来完成,他们也知道每 个任务应该怎样实现,然而如何把这些任务弄到 一起去完成项目所要求的设计目标,成了一个教 学难点。当然方法可以多种多样,聪明的学生可 以想出一些奇特的方法实现,但那些毕竟不是正 途,不是一般的方法。有没有一种有章可循的方 法呢?有,这就是子程序化、模块化的编程方法。
这就是交通灯项目程序的整体结构,而原程序 与这个结构则是一致的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机模块化编程当你在一个项目小组做一个相对较复杂的工程时,意味着你不再独自单干。
你需要和你的小组成员分工合作,一起完成项目,这就要求小组成员各自负责一部分工程。
比如你可能只是负责通讯或者显示这一块。
这个时候,你就应该将自己的这一块程序写成一个模块,单独调试,留出接口供其它模块调用。
最后,小组成员都将自己负责的模块写完并调试无误后,由项目组长进行组合调试。
像这些场合就要求程序必须模块化。
模块化的好处是很多的,不仅仅是便于分工,它还有助于程序的调试,有利于程序结构的划分,还能增加程序的可读性和可移植性。
初学者往往搞不懂如何模块化编程,其实它是简单易学,而且又是组织良好程序结构行之有效的方法之一.本文将先大概讲一下模块化的方法和注意事项,最后将以初学者使用最广的keil c编译器为例,给出模块化编程的详细步骤。
模块化程序设计应该理解以下概述:(1)模块即是一个.c 文件和一个.h 文件的结合,头文件(.h)中是对于该模块接口的声明;这一条概括了模块化的实现方法和实质:将一个功能模块的代码单独编写成一个.c文件,然后把该模块的接口函数放在.h文件中.举例:假如你用到液晶显示,那么你可能会写一个液晶驱动模块,以实现字符、汉字和图像的现实,命名为: led_device.c,该模块的.c文件大体可以写成:[cpp]view plaincopyprint?1./*************************************************************************2.* 液晶驱动模块3.*4.* 文件: lcd_device.c5.* 编写人: 小瓶盖6.* 描述:液晶串行显示驱动模块,提供字符、汉字、和图像的实现接口7.* 编写时间: 2009.07.038.* 版本:1.29.*************************************************************************/10.#include …11.…12.//定义变量13. unsigned char value;//全局变量14.…15.//定义函数16.//这是本模块第一个函数,起到延时作用,只供本模块的函数调用,所以用到static关键字修饰17./********************延时子程序************************/18.static void delay (uint us) //delay time19.{}20.//这是本模块的第二个函数,要在其他模块中调用21./*********************写字符程序**************************22.** 功能:向LCD写入字符23.** 参数:dat_comm 为1写入的是数据,为0写入的是指令24.content 为写入的数字或指令25.******************************************************/26.void wr_lcd (uchar dat_comm,uchar content)27.{}28.……29.……30./***************************** END Files***********************************/注:此处只写出这两个函数,第一个延时函数的作用范围是模块内,第二个,它是其它模块需要的。
为了简化,此处并没有写出函数体..h文件中给出模块的接口.在上面的例子中,向LCD写入字符函数:wr_lcd (uchardat_comm,uchar content)就是一个接口函数,因为其它模块会调用它,那么.h文件中就必须将这个函数声明为外部函数(使用extrun关键字修饰),另一个延时函数:void delay (uint us)只是在本模块中使用(本地函数,用static关键字修饰),因此它是不需要放到.h 文件中的。
.h文件格式如下:[cpp]view plaincopyprint?1./*****************************************************************************2.* 液晶驱动模块头文件3.*4.* 文件: lcd_device.h5.* 编写人: 小瓶盖6.* 编写时间: 2010.07.037.* 版本:1.08.*********************************************************************************/9.//声明全局变量10.extern unsigned char value;11.//声明接口函数12.extern void wr_lcd (uchar dat_comm,uchar content); //向LCD写入字符13.……14./***************************** END Files***********************************/这里注意三点:1. 在keil 编译器中,extern这个关键字即使不声明,编译器也不会报错,且程序运行良好,但不保证使用其它编译器也如此。
强烈建议加上,养成良好的编程规范。
2. .c文件中的函数只有其它模块使用时才会出现在.h文件中,像本地延时函数static void delay (uint us)即使出现在.h文件中也是在做无用功,因为其它模块根本不去调用它,实际上也调用不了它(static关键字的限制作用)。
3.注意本句最后一定要加分号”;”,相信有不少同学遇到过这个奇怪的编译器报错: errorC132: 'xxxx': not in formal parameter list,这个错误其实是.h的函数声明的最后少了分号的缘故。
模块的应用:假如需要在LCD菜单模块lcd_menu.c中使用液晶驱动模块lcd_device.c中的函数void wr_lcd (uchar dat_comm,uchar content),只需在LCD菜单模块的lcd_menu.c 文件中加入液晶驱动模块的头文件lcd_device.h即可.[cpp]view plaincopyprint?1./***************************************************************************2.* 液晶菜单模块3.*4.* 文件: lcd_menu.c5.* 编写人: 小瓶盖6.* 说明:LCD菜单模块,最多实现256级菜单,与硬件无关。
7.* 编写时间: 2010.07.038.* 版本:1.09.**************************************************************************/10.#include“lcd_device.h //包含液晶驱动程序头文件,之后就可以在该.c文件中调用//lcd_device.h中的全局函数,使用液晶驱动程序里的全局//变量(如果有的话)。
11.…12.//调用向LCD写入字符函数13.wr_lcd (0x01,0x30);14.…15.//对全局变量赋值16.value=0xff;17.…(2)某模块提供给其它模块调用的外部函数及数据需在.h 中文件中冠以extern 关键字声明;这句话在上面的例子中已经有体现,即某模块提供给其它模块调用的外部函数和全局变量需在.h 中文件中冠以extern 关键字声明,下面重点说一下全局变量的使用。
使用模块化编程的一个难点(相对于新手)就是全局变量的设定,初学者往往很难想通模块与模块公用的变量是如何实现的,常规的做法就是本句提到的,在.h文件中外部数据冠以extern关键字声明。
比如上例的变量value就是一个全局变量,若是某个模块也使用这个变量,则和使用外部函数一样,只需在使用的模块.c文件中包含#include“lcd_device.h”即可。
另一种处理模块间全局变量的方法来自于嵌入式操作系统uCOS-II,这个操作系统处理全局变量的方法比较特殊,也比较难以理解,但学会之后妙用无穷,这个方法只需用在头文件中定义一次。
方法为:在定义所有全局变量(uCOS-II将所有全局变量定义在一个.h文件内)的.h头文件中:[cpp]view plaincopyprint?1.#ifdef xxx_GLOBALS2.#define xxx_EXT3.#else4.#define xxx_EXT extern5.#endif.H 文件中每个全局变量都加上了xxx_EXT的前缀。
xxx 代表模块的名字。
该模块的.C文件中有以下定义:[cpp]view plaincopyprint?1.#define xxx_GLOBALS2.#include "includes.h"当编译器处理.C文件时,它强制xxx_EXT(在相应.H文件中可以找到)为空,(因为xxx_GLOBALS已经定义)。
所以编译器给每个全局变量分配内存空间,而当编译器处理其他.C 文件时,xxx_GLOBAL没有定义,xxx_EXT 被定义为extern,这样用户就可以调用外部全局变量。
为了说明这个概念,可以参见uC/OS_II.H,其中包括以下定义:[cpp]view plaincopyprint?1.#ifdef OS_GLOBALS2.#define OS_EXT3.#else4.#define OS_EXT extern5.#endif6.OS_EXT INT32U OSIdleCtr;7.OS_EXT INT32U OSIdleCtrRun;8.OS_EXT INT32U OSIdleCtrMax;同时,uCOS_II.H 有中以下定义:#define OS_GLOBALS#include “includes.h”当编译器处理uCOS_II.C 时,它使得头文件变成如下所示,因为OS_EXT 被设置为空。
INT32U OSIdleCtr;INT32U OSIdleCtrRun;INT32U OSIdleCtrMax;这样编译器就会将这些全局变量分配在内存中。
当编译器处理其他.C 文件时,头文件变成了如下的样子,因为OS_GLOBAL没有定义,所以OS_EXT 被定义为extern。
extern INT32U OSIdleCtr;extern INT32U OSIdleCtrRun;extern INT32U OSIdleCtrMax;在这种情况下,不产生内存分配,而任何 .C文件都可以使用这些变量。