-
Notifications
You must be signed in to change notification settings - Fork 115
/
ok05.html
164 lines (164 loc) · 8.32 KB
/
ok05.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Lesson 5 OK05</title>
<link href="stylesheet.css" rel="Stylesheet" type="text/css" />
<script language="javascript" type="text/javascript" src="script.js"></script>
</head>
<body>
<div id="contentAll">
<div id="courseHead">
<h1>
Lesson 5 OK05</h1>
</div>
<div id="pageAll">
<div id="pageBody">
<p>
The OK05 lesson builds on OK04 using it to flash the SOS Morse Code pattern (...---...).
It is assumed you have the code for the <a href="ok04.html">Lesson 4: OK04</a> operating
system as a basis.
</p>
<div class="ucampas-toc">
</div>
<h2 id="data">
1 Data</h2>
<p>
So far, all we've had to do with our operating system is provide instructions to
be followed. Sometimes however, instructions are only half the story. Our operating
systems may need data.</p>
<div class="informationBox">
<p>
Some early Operating Systems did only allow certain types of data in certain files,
but this was generally found to be too restrictive. The modern way does make programs
a lot more complicated however.
</p>
</div>
<p>
In general data is just values that are important. You are probably trained to think
of data as being of a specific type, e.g. a text file contains text, an image file
contains an image, etc. This is, in truth, just an idea. All data on a computer
is just binary numbers, how we choose to interpret them is what counts. In this
example we're going to store a light flashing sequence as data.</p>
<p>
At the end of 'main.s' copy the following code:</p>
<div class="armCodeBlock">
<p>
.section .data<br />
.align 2<br />
pattern:<br />
.int 0b11111111101010100010001000101010<br />
</div>
<div class="commandBox">
<p>
<span class="armCodeInline">.align num</span> ensures the address of the next line
is a multiple of 2<span class="armCodeInline"><sup>num</sup></span>
.</div>
<div class="commandBox">
<p>
<span class="armCodeInline">.int val</span> outputs the number <span class="armCodeInline">
val</span>
.</div>
<p>
To differentiate between data and code, we put all the data in the .data. I've included
this on the operating system memory layout diagram here. I've just chosen to put
the data after the end of the code. The reason for keeping our data and instructions
separate is so that if we eventually implement some security on our operating system,
we need to know what parts of the code can be executed, and what parts can't.</p>
<p>
I've used two new commands here. <span class="armCodeInline">.align</span> and <span
class="armCodeInline">.int</span>. <span class="armCodeInline">.align</span>
ensures alignment of the following data to a specified power of 2. In this case
I've used <span class="armCodeInline">.align 2</span> which means that this data
will definitely be placed at an address which is a multiple of 2<sup>2</sup> = 4.
It is really important to do this, because the <span class="armCodeInline">ldr</span>
instruction we used to read memory only works at addresses that are multiples of
4.</p>
<p>
The <span class="armCodeInline">.int</span> command copies the constant after it
into the output directly. That means that 11111111101010100010001000101010<sub>2</sub>
will be placed into the output, and so the label pattern actually labels this piece
of data as pattern.</p>
<div class="informationBox">
<p>
One challenge with data is finding an efficient and useful representation. This
method of storing the sequence as on and off units of time is easy to run, but would
be difficult to edit, as the concept of a Morse - or . is lost.
</p>
</div>
<p>
As I mentioned, data can mean whatever you want. In this case I've encoded the Morse
Code SOS sequence, which is ...---... for those unfamiliar. I've used a 0 to represent
a unit of time with the LED off, and a 1 to represent a unit of time with the LED
on. That way, we can write some code which just displays a sequence in data like
this one, and then all we have to do to make it display a different sequence is
change the data. This is a very simple example of what operating systems must do
all the time; interpret and display data.</p>
<p>
Copy the following lines before the <span class="armCodeInline">loop$</span> label
in 'main.s'.</p>
<div class="armCodeBlock">
<p>
ptrn .req r4<br />
ldr ptrn,=pattern<br />
ldr ptrn,[ptrn]<br />
seq .req r5<br />
mov seq,#0<br />
</div>
<p>
This code loads the pattern into <span class="armCodeInline">r4</span>, and loads
0 into <span class="armCodeInline">r5</span>. <span class="armCodeInline">r5</span>
will be our sequence position, so we can keep track of how much of the pattern we
have displayed.</p>
<p>
The following code puts a non-zero into <span class="armCodeInline">r1</span> if
and only if there is a 1 in the current part of the pattern.</p>
<div class="armCodeBlock">
<p>
mov r1,#1<br />
lsl r1,seq<br />
and r1,ptrn<br />
</div>
<p>
This code is useful for your calls to SetGpio, which must have a non-zero value
to turn the LED off, and a value of zero to turn the LED on.</p>
<p>
Now modify all of your code in 'main.s' so that each loop the code sets the LED
based on the current sequence number, waits for 250000 micro seconds (or any other
appropriate delay), and then increments the sequence number. When the sequence number
reaches 32, it needs to go back to 0. See if you can implement this, and for an
extra challenge, try to do it using only 1 instruction (solution in the download).</p>
<h2 id="tfwyhf">
2 Time Flies When You're Having Fun...</h2>
<p>
You're now ready to test this on the Raspberry Pi. It should flash out a sequence
of 3 short pulses, 3 long pulses and then 3 more short pulses. After a delay, the
pattern should repeat. If it doesn't work please see our troubleshooting page.</p>
<p>
Once it works, congratulations you have reached the end of the OK series of tutorials.</p>
<p>
In this series we've learnt about assembly code, the GPIO controller and the System
Timer. We've learnt about functions and the ABI, as well as several basic Operating
System concepts, and also about data.</p>
<p>
You're now ready to move onto one of the more advanced series.</p>
<ul>
<li>The <a href="screen01.html">Screen</a> series is next and teaches you how to use
the screen with assembly code.</li>
<li>The <a href="input01.html">Input</a> series teaches you how to use the keyboard
and mouse.</li>
</ul>
<p>
By now you already have enough information to make Operating Systems that interact
with the GPIO in other ways. If you have any robot kits, you may want to try writing
a robot operating system controlled with the GPIO pins!</p>
</div>
<div id="pageFooter">
<hr />
<p>Spot a mistake? You can help improve this tutorial on <a href="https://github.com/chadderz121/bakingpi-www">GitHub</a>.</p>
<p><a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/deed.en_GB"><img alt="Creative Commons Licence" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">Baking Pi: Operating Systems Development</span> by <span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">Alex Chadwick</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/deed.en_GB">Creative Commons Attribution-ShareAlike 3.0 Unported License</a>.</p>
<p>Based on contributions at <a href="https://github.com/chadderz121/bakingpi-www">https://github.com/chadderz121/bakingpi-www</a>.</p>
</div>
</div>
</div>
</body>
</html>