1 / 45

Real Time Systems

Real Time Systems. Part 1. Fadi’s HW 11 Solution. line level source 1 #pragma CODE 2 #include <c8051f020.h> // SFR declarations 3 extern unsigned char rd_buttons(void); // in uni.c 4 unsigned char mbtn() //16 or 17 bytes

Download Presentation

Real Time Systems

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Real Time Systems Part 1

  2. Fadi’s HW 11 Solution line level source 1 #pragma CODE 2 #include <c8051f020.h> // SFR declarations 3 extern unsigned char rd_buttons(void); // in uni.c 4 unsigned char mbtn() //16 or 17 bytes 5 { 6 1 static unsigned char last_button=1; 7 1 unsigned char prev_button; 8 1 9 1 prev_button = rd_buttons(); 10 1 11 1 if(8%prev_button==0) 12 1 last_button = prev_button; 13 1 14 1 15 1 return(last_button); 16 1 } 17 18 //if(!last_button) 19 //last_button += 1; // if not static 23...

  3. 0000 120000 E LCALL rd_buttons ;---- Variable 'prev_button' assigned to Register 'R7' ---- ; SOURCE LINE # 11 0003 7408 MOV A,#08H 0005 8FF0 MOV B,R7 0007 84 DIV AB 0008 E5F0 MOV A,B 000A 7002 JNZ ?C0001 ; SOURCE LINE # 12 000C 8F00 R MOV last_button,R7 000E ?C0001: ; SOURCE LINE # 15 000E AF00 R MOV R7,last_button ; SOURCE LINE # 16 0010 ?C0002: 0010 22 RET

  4. Real time systems differ from conventional systems in: • Dominant role of timing constraints. • Concurrency • Significance of reliability and fault tolerance

  5. Timing constraints • Real time systems must not only provide correct answers, but must provide it on time. • Hard and soft real time systems • Hard real time systems are those that, without exception, must meet their timing constraints – if a constraint is violated the system fails. • Soft real time systems can be considered successful even if some constraints are missed. i.e. The telephone system. • Real time software must satisfy timing assertions that involve relations over relative and absolute times. The most common and simplest such assertion is a deadline – a limit on the absolute or relative time when a computation must complete. • Most timing constraints are deterministic.

  6. Concurrency • Computer systems use concurrency to improve performance, for example, by employing parallel processors. • Concurrency can also be used to model parallel activities, even though they may be implement by interleaving the activities on a single processor. • Real time systems must deal with the concurrency of the real world. • Combining concurrency and time constraints is especially difficult.

  7. Reliability and fault tolerance • Reliability is a measure of how often a system fails. • No system is perfectly reliable. • Failures will occur. • Fault tolerance is concerned with the recognition and handling of failures. • Systems or parts of systems can be classified according to critically. • Critically is a measurement of the failure cost.

  8. Concurrent processes • Concurrency is typically implemented by using processes. • Each processes is a separate program executing sequential statements. • Each process appears to execute concurrently with other processes. • Recall how processes work in VHDL.

  9. Heartbeat Monitoring System Task 1: Read pulse If pulse < Lo then Activate Siren If pulse > Hi then Activate Siren Sleep 1 second Repeat Task 2: If B1/B2 pressed then Lo = Lo +/– 1 If B3/B4 pressed then Hi = Hi +/– 1 Sleep 500 ms Repeat B[1..4] Heart-beat pulse Set-top Box Task 1: Read Signal Separate Audio/Video Send Audio to Task 2 Send Video to Task 3 Repeat Task 2: Wait on Task 1 Decode/output Audio Repeat Video Audio Input Signal Task 3: Wait on Task 1 Decode/output Video Repeat Concurrent processes • Consider two examples having separate tasks running independently but sharing data • Difficult to write system using sequential program model • Concurrent process model easier • Separate sequential programs (processes) for each task • Programs communicate with each other

  10. Process • A sequential program, typically an infinite loop • Executes concurrently with other processes • Basic operations on processes • Create and terminate • Create is like a procedure call but caller doesn’t wait • Created process can itself create new processes • Terminate kills a process, destroying all data • Suspend and resume • Suspend puts a process on hold, saving state for later execution • Resume starts the process again where it left off • Join • A process suspends until a particular child process finishes execution

  11. Communication among processes Encoded video packets • Processes need to communicate data and signals to solve their computation problem • Processes that don’t communicate are just independent programs solving separate problems • Basic example: producer/consumer • Process A produces data items, Process B consumes them • E.g., A decodes video packets, B display decoded packets on a screen • How do we achieve this communication? • Two basic methods • Shared memory • Message passing processA() { // Decode packet // Communicate packet to B } } Decoded video packets void processB() { // Get packet from A // Display packet } To display

  12. Shared Memory • Processes read and write shared variables • No time overhead, easy to implement • But, hard to use – mistakes are common

  13. Shared Memory continued • Example: Producer/consumer with a mistake • Share buffer[N], count • count = # of valid data items in buffer • processA produces data items and stores in buffer • If buffer is full, must wait • processB consumes data items from buffer • If buffer is empty, must wait

  14. Shared Memory continued 01: data_type buffer[N]; 02: int count = 0; 03: void processA() { 04: int i; 05: while( 1 ) { 06: produce(&data); 07: while( count == N );/*loop*/ 08: buffer[i] = data; 09: i = (i + 1) % N; 10: count = count + 1; 11: } 12: }

  15. Shared Memory continued 13: void processB() { 14: int i; 15: while( 1 ) { 16: while( count == 0 );/*loop*/ 17: data = buffer[i]; 18: i = (i + 1) % N; 19: count = count - 1; 20: consume(&data); 21: } 22: } 23: void main() { 24: create_process(processA); 25: create_process(processB); 26: }

  16. Shared Memory continued • Error when both processes try to update count concurrently (lines 10 and 19) and the following execution sequence occurs. Say “count” is 3. • A loads count (count = 3) from memory into register R1 (R1 = 3) • A increments R1 (R1 = 4) • B loads count (count = 3) from memory into register R2 (R2 = 3) • B decrements R2 (R2 = 2) • A stores R1 back to count in memory (count = 4) • B stores R2 back to count in memory (count = 2) • count now has incorrect value of 2

  17. Message Passing void processA() { while( 1 ) { produce(&data) send(B, &data); /* region 1 */ receive(B, &data); consume(&data); } } • Data explicitly sent from one process to another • Sending process performs special operation, send • Receiving process must perform special operation, receive, to receive the data • Both operations must explicitly specify which process it is sending to or receiving from • Receive is blocking, send may or may not be blocking • Safer model, but less flexible void processB() { while( 1 ) { receive(A, &data); transform(&data) send(A, &data); /* region 2 */ } }

  18. void processA() { while( 1 ) { produce(&data) send(B, &data); /* region 1 */ receive(B, &data); consume(&data); } } void processB() { while( 1 ) { receive(A, &data); transform(&data) send(A, &data); /* region 2 */ } }

  19. Back to Shared Memory: Mutual Exclusion • Certain sections of code should not be performed concurrently • Critical section • Possibly noncontiguous section of code where simultaneous updates, by multiple processes to a shared memory location, can occur • When a process enters the critical section, all other processes must be locked out until it leaves the critical section • Can be accomplished using MUTEX primative

  20. Correct Shared Memory Solution to the Consumer-Producer Problem 01: data_type buffer[N]; 02: int count = 0; 03: mutex count_mutex; 04: void processA() { 05: int i; 06: while( 1 ) { 07: produce(&data); 08: while( count == N );/*loop*/ 09: buffer[i] = data; 10: i = (i + 1) % N; 11: count_mutex.lock(); 12: count = count + 1; 13: count_mutex.unlock(); 14: } 15: } 16: void processB() { 17: int i; 18: while( 1 ) { 19: while( count == 0 );/*loop*/ 20: data = buffer[i]; 21: i = (i + 1) % N; 22: count_mutex.lock(); 23: count = count - 1; 24: count_mutex.unlock(); 25: consume(&data); 26: } 27: } 28: void main() { 29: create_process(processA); 30: create_process(processB); 31: } • The primitive mutex is used to ensure critical sections are executed in mutual exclusion of each other

  21. Following the same execution sequence as before: • A/B execute lock operation on count_mutex • Either AorB will acquire lock • Say B acquires it • A will be put in blocked state • B loads count (count = 3) from memory into register R2 • (R2 = 3) • B decrements R2 (R2 = 2) • B stores R2 back to count in memory (count = 2) • B executes unlock operation • A is placed in runnable state again • A loads count (count = 2) from memory into register R1 (R1 = 2) • A increments R1 (R1 = 3) • A stores R1 back to count in memory (count = 3) • Count now has correct value of 3

  22. 01: data_type buffer[N]; 02: int count = 0; 03: mutex count_mutex; 04: void processA() { 05: int i; 06: while( 1 ) { 07: produce(&data); 08: while( count == N );/*loop*/ 09: buffer[i] = data; 10: i = (i + 1) % N; 11: count_mutex.lock(); 12: count = count + 1; 13: count_mutex.unlock(); 14: } 15: }

  23. 16: void processB() { 17: int i; 18: while( 1 ) { 19: while( count == 0 );/*loop*/ 20: data = buffer[i]; 21: i = (i + 1) % N; 22: count_mutex.lock(); 23: count = count - 1; 24: count_mutex.unlock(); 25: consume(&data); 26: } 27: } 28: void main() { 29: create_process(processA); 30: create_process(processB); 31: }

More Related