📄 chapter 4 variables and constants -- valvano.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0056)http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm -->
<HTML><HEAD><TITLE>Chapter 4: Variables and Constants -- Valvano</TITLE>
<META http-equiv=content-type content=text/html;charset=iso-8859-1>
<META content="MSHTML 5.50.3825.1300" name=GENERATOR>
<META content="string literals" name=KEYWORDS>
<META
content="StarMax HD:Microsoft Office 98:Templates:Web Pages:Blank Web Page"
name=Template></HEAD>
<BODY vLink=#800080 link=#0000ff>
<P><!--Developing Embedded Software in C using ICC11/ICC12/Hiware by Jonathan W. Valvano--><B><FONT
face=Helvetica,Arial size=4>Chapter 4: Variables and Constants </FONT></B></P>
<P><B><I><FONT face=Helvetica,Arial>What's in Chapter 4?</FONT></I></B></P>
<DIR>
<P><A href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#STATIC">A
static variable exists permanently</A> <FONT face=Monaco><BR></FONT><A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#STATICGLOBAL">A
static global can be accessed only from within the same file</A> <FONT
face=Monaco><BR></FONT><A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#STATICLOCAL">A
static local can be accessed only in the function</A><FONT
face=Monaco><BR></FONT><A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#VOLATILE">We
specify volatile variables when using interrupts and I/O ports</A> <FONT
face=Monaco><BR></FONT><A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#AUTOMATIC">Automatic
variables are allocated on the stack</A><FONT face=Monaco><BR></FONT><A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#IMPLEMENTATION">We
can understand automatics by looking at the assembly code </A><FONT
face=Monaco><BR></FONT><A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#CONSTANTLOCAL">A
constant local can not be changed</A> <FONT face=Monaco><BR></FONT><A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#EXTERNAL">External
variables are defined elsewhere</A> <FONT face=Monaco><BR></FONT><A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#SCOPE">The scope
of a variable defines where it can be accessed</A> <FONT
face=Monaco><BR></FONT><A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#DECLARATIONS">Variables
declarations</A> <FONT face=Monaco><BR></FONT><A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#CHARACTER">8-bit
variables are defined with char</A> <FONT face=Monaco><BR></FONT><A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#WHEN">Discussion
of when to use static versus automatic variables</A><FONT
face=Monaco><BR></FONT><A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#INITIALIZE">Initialization
of variables and constants</A><FONT face=Monaco><BR></FONT><A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#INITIMPLEMENATION">We
can understand initialization by looking at the assembly code</A> </P></DIR>
<P><FONT face="Times New Roman,Times">The purpose of this chapter is to explain
how to create and access variables and constants. The storage and retrieval of
information are critical operations of any computer system. This chapter will
also present the C syntax and resulting assembly code generated by the
ImageCraft and Hiware compilers.</FONT></P>
<P><FONT face="Times New Roman,Times">A <I>variable</I> is a named object that
resides in RAM memory and is capable of being examined and modified. A variable
is used to hold information critical to the operation of the embedded system. A
<I>constant</I> is a named object that resides in memory (usually in ROM) and is
only capable of being examined. As we saw in the last chapter a <I>literal</I>
is the direct specification of a number character or string. The difference
between a literal and a constant is that constants are given names so that they
can be accessed more than once. For example</FONT></P>
<DIR>
<P><CODE>short
MyVariable; /*
variable allows read/write access */<BR>const short MyConstant=50; /*
constant allows only read access */<BR>#define fifty 50<BR>void main(void){
<BR> MyVariable=50; /*
write access to the variable
*/<BR> OutSDec(MyVariable); /* read
access to the variable
*/<BR> OutSDec(MyConstant); /* read
access to the constant
*/<BR> OutSDec(50); /*
"50" is a literal
*/<BR> OutSDec(fifty); /*
fifty is also a literal */<BR>}</CODE></P></DIR>
<ADDRESS>Listing 4-1: Example showing a variable, a constant and some
literals</ADDRESS>
<P><FONT face="Times New Roman,Times">With ICC11 and ICC12 both <B>int</B> and
<B>short</B> specify to 16-bit parameters, and can be used interchangeably. The
compiler options in Hiware can be used to select the precision of each of the
data formats. I recommend using <B>short</B> because on many computers,
<B>int</B> specifies a 32-bit parameter. As we saw in the last chapter, the
ICC11 and ICC12 compilers actually implement 32-bit long <A
href="http://www.ece.utexas.edu/~valvano/embed/chap3/chap3.htm#DECIMALEXAMPLE">integer
literals</A> and <A
href="http://www.ece.utexas.edu/~valvano/embed/chap3/chap3.htm#STRING">string
literals</A> in a way very similar to constants.</FONT></P>
<P><FONT face="Times New Roman,Times">The concepts of <A
href="http://www.ece.utexas.edu/~valvano/embed/chap3/chap3.htm#BINARY">precision</A>
and type (<A
href="http://www.ece.utexas.edu/~valvano/embed/chap3/chap3.htm#BM16BITUNSIGNED">unsigned</A>
vs. <A
href="http://www.ece.utexas.edu/~valvano/embed/chap3/chap3.htm#BM16BITSIGNED">signed</A>)
developed for numbers in the last chapter apply to variables and constants as
well. In this chapter we will begin the discussion of variables that contain
integers and characters. Even though pointers are similar in many ways to 16 bit
unsigned integers, pointers will be treated in detail in <A
href="http://www.ece.utexas.edu/~valvano/embed/chap7/chap7.htm">Chapter 7</A>.
Although arrays and structures fit also the definition of a variable, they are
regarded as collections of variables and will be discussed in <A
href="http://www.ece.utexas.edu/~valvano/embed/chap8/chap8.htm">Chapter 8</A>
and <A href="http://www.ece.utexas.edu/~valvano/embed/chap9/chap9.htm">Chapter
9</A>. </FONT></P>
<P><FONT face="Times New Roman,Times">The term <I>storage class</I> refers to
the method by which an object is assigned space in memory. The Imagecraft and
Hiware compilers recognize three storage classes--<A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#STATIC">static</A>,
<A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#AUTOMATIC">automatic</A>,
and <A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#EXTERNAL">external</A>.
In this document we will use the term <I>global variable</I> to mean a regular
static variable that can be accessed by all other functions. Similarly we will
use the term <I>local variable</I> to mean an automatic variable that can be
accessed only by the function that created it. As we will see in the following
sections there are other possibilities like a <A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#STATICGLOBAL">static
global</A> and <A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#STATICLOCAL">static
local</A>.</FONT></P>
<P><B><I><FONT face=Helvetica,Arial><A
name=STATIC></A>Statics</FONT></I></B><FONT face=Helvetica,Arial> </FONT></P>
<P><FONT face="Times New Roman,Times">Static variables are given space in memory
at some fixed location within the program. They exist when the program starts to
execute and continue to exist throughout the program's entire lifetime. The
value of a static variable is faithfully maintained until we change it
deliberately (or remove power from the memory). A constant, which we define by
adding the modifier <B>const</B>, can be read but not changed.</FONT></P>
<P><FONT face="Times New Roman,Times">In an embedded system we normally wish to
place all variables in RAM and constants in ROM. In the ICC11/ICC12 compilers we
specify the starting memory address for the static variables in the
<I>options_compiler_linker</I> dialog with the data section. The constants and
program instructions will be placed in the <I>text</I> section. For more
information on how to set the absolute addresses for statics (<I>data</I>
section), automatics (stack), and program object codes (text section) using
ICC12, see <A
href="http://www.ece.utexas.edu/~valvano/embed/app1/app1.htm#ICC12">ICC12
options menu for developing software for the Adapt812</A> The ICC11/ICC12
compilers place the static variables in the bss area, which we can view in the
assembly listing following the <B>.area bss</B> pseudoop. The ICC11/ICC12
compilers place the constants and program in the text area, which we can view in
the assembly listing following the <B>.area text</B> pseudoop.</FONT></P>
<P><FONT face="Times New Roman,Times">At the assembly language ICC11/ICC12 uses
the<B> .blkb</B><I> </I>directive to define a block of uninitialized bytes. Each
static variable has a label associated with its <B>.blkb</B> directive. The
label consists of the variable's name prefixed by a compiler generated
underscore character. The following example sets a global, called TheGlobal, to
the value 1000. This global can be referenced by any function from any file in
the software system. It is truly global.</FONT></P>
<DIR>
<P><CODE>short TheGlobal; /* a regular global
variable*/<BR>void main(void){
<BR> TheGlobal=1000; <BR>}</CODE></P></DIR>
<ADDRESS>Listing 4-2: Example showing a regular global variable</ADDRESS>
<P><FONT face="Times New Roman,Times">In assembly language the ICC11 assembler
defines a label to be global (can be accessed from modules in other files) using
the <I>.global</I> pseudoop. The 6811 code generated by the ICC11 (Version 4)
compiler is as follows</FONT></P>
<DIR>
<P><CODE> .area text <BR> .global
_main<BR>_main:<BR> ldd #1000
<BR> std _TheGlobal <BR> rts
<BR> .area bss <BR> .global
_TheGlobal <BR>_TheGlobal: .blkb 2 </CODE></P></DIR>
<P><FONT face="Times New Roman,Times">In assembly language the ICC12 assembler
defines a label to be global (can be accessed from modules in other files) using
the<B> ::</B><I> </I>symbol after the label. The 6812 code generated by the
ICC12 (Version 5.1) compiler is as follows</FONT></P>
<DIR>
<P><CODE> .area text <BR>_main::
<BR> movw #1000,_TheGlobal
<BR> rts <BR> .area bss
<BR>_TheGlobal:: .blkb 2 </CODE></P></DIR>
<P><FONT face="Times New Roman,Times">The 6812 code generated by the Hiware
compiler is as follows</FONT></P>
<DIR>
<P><CODE>main: <BR> LDD #1000
<BR> STD TheGlobal <BR> RTS
<BR></CODE></P></DIR>
<P><FONT face="Times New Roman,Times">The fact that these types of variables
exist in permanently reserved memory means that static variables exist for the
entire life of the program. When the power is first applied to an embedded
computer, the values in its RAM are usually undefined. Therefore, initializing
global variables requires special run-time software consideration. The
ICC11/ICC12 compilers will attach the assembly code in the CRT11.s/CRT12.s file
to the beginning of every program. This software is executed first, before our
<B>main()</B> program is started. We can see by observing the CRT11.s/CRT12.s
file that the ICC11/ICC12 compilers will clear all statics to zero immediately
after a hardware reset. See <A
href="http://www.ece.utexas.edu/~valvano/embed/chap4/chap4.htm#INITIALIZE">the
section on initialization</A> for more about initializing variables and
constants.</FONT></P>
<P><FONT face="Times New Roman,Times"><A name=STATICGLOBAL></A>A <B>static
global</B> is very similar to a regular global. In both cases, the variable is
defined in RAM permanently. The assembly language access is identical. The only
difference is the scope. The static global can only be accessed within the file
where it is defined. The following example also sets a global, called
<B>TheGlobal</B>, to the value 1000. This global can not be referenced by
modules in other files. In particular, notice the line <I>.global _TheGlobal</I>
is missing in the 6811 code. Similarly, notice the double colon,<B> ::</B>, is
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -