有关volatile的体会

    以前用volatile只是用来定义寄存器变量,也听说多进程编程需要用到这个,一直没有深刻体会。

    今天,通过编译器高级优化,终于发现volatile的重要性了。

    问题主要是在给UC864模块开机过程中等待时发生的。

    close_mobile_time=0;
    while(close_mobile_time<20);

    两句话,简单地等到close_mobile_time变量自加超过20次,close_mobile_time变量在15ms时钟中断中自加1.

    如果,编译器不优化,CPU每次都会从close_mobile_time变量的地址处取来该值,程序运行正常。

    如果采用编译器优化,编译器以为close_mobile_time一直为0,因为2句语句之间没有对close_mobile_time产生影响的语句,所以,在while循环中直接省去了close_mobile_time与20的比较,汇编代码之间编程了跳转到while的语句,即进入了死循环,而close_mobile_time在中断中还是不停地自加。

    所以,在声明close_mobile_time变量时,加入volatile关键字,即让编译器不对close_mobile_time变量进行优化,每次取值都从RAM中实际去取该变量的值,这样程序运行就正常了。

实验一 熟悉实验开发环境及GPIO编程 结构合理、条理清晰的程序结构,有助于提高程序的可移植性与可复用性,有利于程序 的维护。学习嵌入式软件编程,从一开始就养成规范编程的习惯,将为未来发展打下踏实基 础。这是第一个实验,目的是以通用输入输出为例,达到熟悉实验开发环境、理解规范编程 结构、掌握基本调试方法等目的。 一、实验目的 本实验通过编程控制 LED 小灯,体会 GPIO 输出作用,可扩展控制蜂鸣器、继电器等; 通过编程获取引脚状态,体会 GPIO 输入作用,可用于获取开关的状态。主要目的如下: (1)了解集成开发环境的安装与基本使用方法。 (2)掌握 GPIO 构件基本应用方法,理解第一个 C 程序框架结构,了解汇编语言与 C 语言的如何相互调用。 (3)掌握硬件系统的软件测试方法,初步理解 printf 输出调试的基本方法。 二、实验准备 (1)硬件部分。PC 机或笔记本电脑一台、开发套件一套。 (2)软件部分。根据网上光盘“..\02-Doc”文件夹下的电子版快速指南,下载合适的电 子资源。 (3)软件环境。按照电子版快速指南中“安装软件开发环境”一节,进行有关软件工 具的安装。 三、参考样例 (1)“.. \04-Soft\CH04-GPIO\GPIO-Output-DirectAddress)”。该程序使用直接地址编程方 式,点亮一个发光二极管。从中可了解到,模块的哪个寄存器的哪一位变化使得发光二极管 亮了,由此理解硬件是如何干预软件的。但这个程序不作为标准应用编程模板,因为要真正 进行规范的嵌入式软件编程,必须封装底层驱动构件,在此基础上进行嵌入式软件开发。 (2)“.. \04-Soft\CH04-GPIO\GPIO-Output-Component”。该程序通过调用 GPIO 驱动构 件方式,使得一个发光二极管闪烁。使用构件方式编程干预硬件是今后编程的基本方式。而 使用直接地址编程方式干预硬件,仅用于底层驱动构件制作过程中的第一阶段(打通硬件), 为构件封装做准备。 四、GPIO知识要素与构件接口 1.GPIO 知识要素 通用输入输出(General Purpose Input/Output,GPIO),是 I/O 最基本形式,是几乎所有 计算机均使用到的部件。通俗地说,GPIO 是开关量输入输出的简化名称。而开关量是指逻 辑上具有 1 和 0 两种状态的物理量。开关量输出,可以是指在电路中控制电器的开和关,也 可以是指控制灯的亮和暗,还可以是指闸门的开和闭等等。开关量输入,开关量输出,可以 是指获取电路中电器开关状态,也可以是指获取灯的亮暗状态,还可以是指获取闸门开关状 态等等。 GPIO 硬件部分的主要知识要素有:GPIO 的含义与作用、输出引脚外部电路的基本接 法及输入引脚外部电路的基本接法等。 1)GPIO 的含义与作用 从物理角度,GPIO 只有高电平与低电平两种状态。从逻辑角度,GPIO 只有“1”和“0” 两种取值。在使用正逻辑情况下,电源(Vcc)代表高电平,对应数字信号“1”;地(GND) 代表低电平,对应数字信号“0”。作为通用输入引脚,计算机内部程序可以获取该引脚状 态,以确定该引脚是“1”(高电平)或“0”(低电平),即开关量输入。作为通用输出引 脚,计算机内部程序可以控制该引脚状态,使得引脚输出“1”(高电平)或“0”(低电平), 即开关量输出。 GPIO 的输出是以计算机内部程序通过单个引脚控制着开关量设备,达到自动控制开关 状态之目的。GPIO 的输入是以计算机内部程序获取单个引脚状态,达到获得外界开关状态 之目的。 特别说明:注意在不同电路中,逻辑“1”对应的物理电平不同。在 5V 供电的系统中, 逻辑“1”的特征物理电平为5V;在3.3V供电的系统中,逻辑“1”的特征物理电平为3.3V。 因此,高电平的实际大小取决于具体电路。 2)输出引脚外部电路的基本接法 作为通用输出引脚,计算机内部程序向该引脚 输出高电平或低电平来驱动器件工作,即开关量输 出。如图 1-1 所示,输出引脚 O1 和 O2 采用了不同 的方式驱动外部器件。一种接法是 O1 直接驱动发光 二极管 LED,当 O1 引脚输出高电平时,LED 不亮; 当 O1 引脚输出低电平时,LED 点亮。这种接法的驱 动电流一般在 2mA~10mA。另一种接法是 O2 通过 一个 NPN 三极管驱动蜂鸣器,当 O2 引脚输出高电 平时,三极管导通,蜂鸣器响;当 O2 引脚输出低电 平时,三极管截止,蜂鸣器不响。这种接法可以用 O2 引脚上的几个 mA 的控制电流驱动高达 100mA 的驱 动电流。若负载需要更大的驱动电流,就必须采用光电隔离外加其他驱动电路,但对计算机 编
03-16
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值