Transcript ppt

Remainder of Syllabus
 Lecture
 RTOS
 Maestro In Linux
 Distributed Control Architecture – distributed state management
 Quiz
 Embedded Networking
 Safety and Society
 Real Time UML
 Quiz/Final
 Lab
 This week: streaming demo required…no report
 Next week: Two-way pilot-player interface, full “player” UI w/ pause, etc.
no resetting of processor for next song! Time to clean up.
 I2C network
 I2C network
 upgrade?
CSE 466 – Fall 2000 - Introduction - 1
Linux Interprocess Communication
 Semaphore
process 1: semid = getsem(semid); semop(semid, -1); // wait
process 2: semid = getsem(semid); semop(semid,1); // signal
 Pipes (queue)
void main() {
int pfds[2];
pipe(pfds);
if (fork()) producer();
else consumer();
}
void producer() {
// serial?
int q = pfds[0];
while (1) write(q, data, n);
}
void consumer() { // music?
int q = pfds[1];
while (1) read(q, data, n);
}
CSE 466 – Fall 2000 - Introduction - 2
FIFO’s, which are named pipes
 Process 1
void main() {
mknod(“myfifo”, S_IFIFO, );
// create a FIFO file node
f = open(“/usr/larrya/myfifo”, O_WRONLY);
write(f, data, n);
}
 Process 2
void main() {
f = open(“/usr/larrya/myfifo”, O_RDONLY);
read(f, data, n);
}
CSE 466 – Fall 2000 - Introduction - 3
A Player?
void main() {
int pfds[2];
pipe(pfds);
if (fork()) serial();
else consumer();
}
void serialTask() {
// serial?
int q = pfds[0];
s = open(“/dev/com1”, O_RDWR);
while (1) {read(s, data, 1); write(s,ack, 1); write(q, data, 1);
}
void musicTask() { // music?
int q = pfds[1];
while (1) {
semop(semid, -1);
processNextPacket(read(q, data, n));
}
now all we need as an ISR, right?
CSE 466 – Fall 2000 - Introduction - 4
Not Quite
 Not yet
 User programs are not allowed to access the physical devices (physical memory
space) – including hardware interrupts. Only the OS can do that.
 User programs can’t control when things happen
 OS slice is about 10ms, maybe 1ms on some machines
 If there are many tasks, our musicTask might not meet its deadline..
 Need a device driver
 Its part of the operating system
 It can include an interrupt service routine
 What is a device driver?
 The interface is the same as a file on the disc
 supports standard file I/O interface
• open()
• read()
• write()
• close()
 Driver writer defines these system calls to provide a useful general device to
the public
CSE 466 – Fall 2000 - Introduction - 5
Partition between the User App and The Driver
 Device Driver should be general…what would a player look like?
 open() – makes sure that hardware resources are available…not being
used by another device for example. Registers the interrupt service
routine
 read() – nothing? can be defined to return current packet?
 write() – adds packets to the queue? so, maybe our SERIAL is the user
app, and our MUSIC/ISR is the OS/Device Driver. write should fail if it
isn’t a proper music packet: three tones and duration.
 close() – release the hardware resources
 Now…how do we get a good trade-off between interrupt latency and
timeliness+
 Need an ISR for the tone generation and tone duration counting
 Where can we put the housekeeping?
 ISR?
 device driver?
 User App?
CSE 466 – Fall 2000 - Introduction - 6
Answer: In the ISR…sort of
 Linux Nomenclature for Interrupt handling
 Top Half – the actual ISR. Time critical stuff
 Bottom Half – the Time dependent, less critical stuff. Signaled by the ISR
user
space
Top Half:
Tone Generation
int
task queue
User App
ie. stream cse466
format music from
serial port to player
Bottom Half:
Housekeeping
kernel
space
system
call
Device Driver Interface
(open, read, etc.)
CSE 466 – Fall 2000 - Introduction - 7
Schedule of task queues…bottom halves in Linux
other
app
blah()
blah()
blah()
interrupt
TOP
HALF
blah()
blah()
blah()
add to task queue, and mark execution
BOT.
HALF
rti
no critical section here
BOT HALF and Device Driver
are mutually exclusive. Not true for Top
Half, so this is a good way to share data
between driver and ISR
sys call
or tick
OS:
Schedule
or sys call
Device
Driver
EXECUTE
TASK
QUEU
myapp
blah()
blah()
blah()
write()
CSE 466 – Fall 2000 - Introduction - 8
As a Task Diagram
ISR TOP
ISR BOT
OS/driver
OS/other
myapp
process 2
process 1
myapp:
write(player…)
myapp:
blocked by driver on
full queue
ISR BOT and Driver are mutually exclusive, so no problem with
shared data structure.
CSE 466 – Fall 2000 - Introduction - 9
The Application
void main() {
if (serial = open("/dev/com3", O_RDWR) == -1) exit();
// open serial port
if (player = open("/dev/player", O_RDWR) == -1) exit(); // open player device
while (1) {
read(serial, &byte, 1); // blocking read
write(serial, &ack, 1); // send acknowledgement
switch(state)
case STREAMING:
read(serial,packet,1); // maybe better if non-blocking ?
n = getNumTones(*packet);
read(serial, packet+1, n); // read the tone bytes
TNE = getTNE(packet); // set new TNE
if (isStop(packet)) {
close(serial);
// close the I/O
close(player);
// close the player, release the HW resources
exit();
}
getTones(packet, writeBuf); // convert packet to tones
writeBuf[3] = duration;
// add duration
write(player, writeBuf, 4); // write to the player
break;
case IDLE:
if (byte == 'S') {
state = STREAMING;
read(serial,&duration,1);
// time slice duration...this is a blocking read
}
}
}
CSE 466 – Fall 2000 - Introduction - 10