Writing an Embedded Controller. It usually consists of two parts – Initialization – A main loop Experience: – The main loop usually has to deal with many.

Slides:



Advertisements
Similar presentations
Catch up on previous topics Summary and putting together first four classes.
Advertisements

1 Lecture 3: MIPS Instruction Set Today’s topic:  More MIPS instructions  Procedure call/return Reminder: Assignment 1 is on the class web-page (due.
Branches Two branch instructions:
CDA 3100 Recitation Week 8. Question 1.data A:.word 21,3,2,9,100,22,6,15,33,90.text.globl main main: la $a0, A li $a1, 17 li $a2, 10 jal funct li $v0,
CDA 3100 Recitation Week 15. What does the function f1 do:.data A:.word 10,21,45,8,100,15,29,12,3,19 B:.word 2,5,33,5,20,1,53,52,5,5 C:.word 6,8,5,4,5,22,53,12,33,89.text.globl.
1 Procedure Calls, Linking & Launching Applications Lecture 15 Digital Design and Computer Architecture Harris & Harris Morgan Kaufmann / Elsevier, 2007.
Solution 2nd Exam.
SPIM and MIPS programming
Some Samples of MIPS Assembly Language Lecture for CPSC 5155 Edward Bosworth, Ph.D. Computer Science Department Columbus State University.
MIPS Function Continued
Ch. 8 Functions.
Input and Output CS 215 Lecture #20.
Recitation Material of Engineering an Assembler June 11, 2013.
PCSpim Introduction. Register contentProgramMemory contentMessage.
The University of Adelaide, School of Computer Science
Assembly Language Working with the CPU.
.text fact: addiu $sp, $sp, -32 sw $ra, 20($sp) sw $fp, 16($sp) addiu $fp, $sp, 28 sw $a0, 0($fp) bgtz $a0, L2 li $v0, 1 b suffix L2: addi $a0, $a0,
ECE 0142 Recitation #5.
MIPS Coding. Exercise – the bubble sort 5/8/2015week04-3.ppt2.
Writing an Embedded Controller. It usually consists of two parts – Initialization – A main loop More challenging than HW3 because HW3 is stateless, the.
MIPS I/O and Interrupt. SPIM I/O and MIPS Interrupts The materials of this lecture can be found in A7-A8 (3 rd Edition) and B7-B8 (4 th Edition).
COMP201 Computer Systems Exceptions and Interrupts.
Writing an Embedded Controller. It usually consists of two parts – Initialization – A main loop More challenging than HW3 because HW3 is stateless, the.
MIPS function continued. Recursive functions So far, we have seen how to write – A simple function – A simple function that have to use the stack to save.
MIPS I/O and Interrupt. .data val1:.float 0.6 val2:.float 0.8 msg_done:.asciiz "done\n".text.globl main main: li.s $f0, mfc1 $a0, $f0 jal calsqrt.
In Class Execise. .data A:.word 0,1,2,3,4,5,6,7,8,9.text.globl main main: la $a0,A li $a1,6 li $a2,5 jal onUpStream done: li $v0, 10# exit syscall onUpStream:
MIPS coding. Review Shifting – Shift Left Logical (sll) – Shift Right Logical (srl) – Moves all of the bits to the left/right and fills in gap with 0’s.
MIPS I/O and Interrupt.
HW4. A TV controller Let’s use this lecture to start to develop a simple TV controller together.
Interrupts and Exception Handling. Execution We are quite aware of the Fetch, Execute process of the control unit of the CPU –Fetch and instruction as.
Exceptions and Interrupts ◆ Breakpoints, arithmetic overflow, traps, and interrupts are all classified as exceptions. ◆ An exception is an event that requires.
Introduction to Lab #1 José Nelson Amaral.
Computer System Structures
Writing an Embedded Controller
MIPS I/O and Interrupt.
MIPS Procedures.
MIPS Coding Continued.
Lecture 4: MIPS Instruction Set
MIPS instructions.
Pseudo instructions.
MIPS I/O and Interrupt.
MIPS coding.
MIPS I/O and Interrupt.
SPIM Syscalls.
MIPS Procedures.
Solutions Chapter 2.
MIPS Functions.
MIPS coding.
MIPS Functions.
Pseudo instructions.
MIPS Functions.
MIPS coding.
MIPS Procedures.
Review.
MIPS Coding.
MIPS function continued
Компьютерийн зохион байгуулалт, ассемблер CS201
Interrupts and Exception Handling
MIPS Functions.
MIPS Coding.
MIPS I/O and Interrupt.
Writing an Embedded Controller
Review.
MIPS Coding Continued.
MIPS coding.
MIPS Functions.
HW4.
Interrupts and Exception Handling
MIPS function continued
MIPS Functions.
Presentation transcript:

Writing an Embedded Controller

It usually consists of two parts – Initialization – A main loop Experience: – The main loop usually has to deal with many things. It is important NOT to stay in any job for too long. You should process an event and almost immediately return to the main loop.

A Simple Program to Get Started Write a program which – Prints out “TV is working” every 3 seconds – Print out the ASCII of any key you have pressed immediately.

Two Jobs The simple program has two jobs: 1.A periodical job executed every 3 seconds 2.A job to process the input Note: – Cannot sleep for 3 seconds and then print out the sentence because cannot process the input while sleeping Must make sure that each iteration of the main loop is short, such that you can check at a fine time granularity if need to print status Has new keyboard input

The code should look like loop: if key pressed print ascii value if 3 sec timer expires print msg goto loop

.data new_line:.asciiz "\n" msg_tvworking:.asciiz "TV is working\n".text.globl main main:mfc0 $a0, $12# read from the status register ori $a0, 0xff11# enable all interrupts mtc0 $a0, $12# write back to the status register lui $t0, 0xFFFF# $t0 = 0xFFFF0000; ori $a0, $0, 2# enable keyboard interrupt sw $a0, 0($t0)# write back to 0xFFFF0000; li $s0, 300# li $s6, 10000# $s6 used to pass the ascii code li $s7, 10000# a large number impossible to be an ascii code loop: beq $s6, $s7, mainloopnext1 ori $a0, $s6, 0 li $v0,1# print it here. syscall li $v0,4# print the new line la $a0, new_line syscall mfc0 $t0, $12# Set Status register andi $t0, 0xfffe# clear ENABLE mtc0 $t0, $12# write back to status li $s6, 10000# $s0 used to pass the ascii code mfc0 $t0, $12# Set Status register ori $t0, 1# set ENABLE mtc0 $t0, $12# write back to status mainloopnext1: # 2. delay for 10ms to emulate time-consuming jobs jal delay_10ms # 3. print status addi $s0, $s0, -1 bne $s0, $0, mainloopnext4 li $s0, 300 la $a0, msg_tvworking li $v0, 4 syscall mainloopnext4: j loop li $v0, 10# exit,if it ever comes here syscall delay_10ms: li $t0, 3000 delay_10ms_loop: addi $t0, $t0, -1 bne $t0, $0, delay_10ms_loop jr $ra.ktext 0x # kernel code starts here mfc0 $k0, $13# Cause register srl $k0, $k0, 2# Extract ExcCode Field andi $k0, $k0, 0x1f bne $k0, $zero, kdone# Exception Code 0 is I/O. Only processing I/O here lui $k0, 0xFFFF# $k0 = 0xFFFF0000; lw $s6, 4($k0)# get the input key kdone:mtc0 $0, $13# Clear Cause register mfc0 $k0, $12# Set Status register andi $k0, 0xfffd# clear EXL bit ori $k0, 0x11# Interrupts enabled mtc0 $k0, $12# write back to status eret# return to EPC

A Slightly More Advanced Version Write a process_input function that responds to `m’, `h’, `q’ (ascii code 109, 104, 112, respectively). Basically, the TV is initially not in the ``menu state.’’ When the user presses `m’ while the TV is not in the menu state, the TV should show a very simple menu, and enters the menu state: – “`h' to print hello, `q' to quit.” In the menu state, – if the user presses `h’, print out “Hello!” – if the user presses `q’, print out “quit” and quits the menu state. If not in the menu state, – the TV does not respond to `h’ and `q’.

The Challenge How do you know whether to respond to ‘h’ or ‘q’ or not? – Should not respond in the normal state – Should respond under menu A naïve way is to write a process_input function that – Called when ‘m’ is pressed then waits there for ‘h’ and ‘q’ – Problem?

The solution Maintain a global variable to remember if we are in the menu state Write the process_input function by checking the variable first The program almost inevitablely has states which makes it complicated.

In menu state? n Is the key ‘m’ y Print the menu, set the menu state flag Is the key ‘h’ y Print “Hello” Is the key ‘q’ y Print “Quit”, clear the menu state flag y n n n

The code.data menuLevel:.word 0 msg_tvworking:.asciiz "tv is working\n" msg_menu:.asciiz "`h' to print hello, `q' to quit.\n" msg_hello:.asciiz "hello!\n" msg_quit:.asciiz "quit.\n" # text.globl main main:mfc0 $a0, $12# read from the status register ori $a0, 0xff11# enable all interrupts mtc0 $a0, $12# write back to the status register lui $t0, 0xFFFF# $t0 = 0xFFFF0000; ori $a0, $0, 2# enable keyboard interrupt sw $a0, 0($t0)# write back to 0xFFFF0000; li $s0, 300# li $s6, 10000# $s6 used to pass the ascii code li $s7, 10000# a large number impossible to be an ascii code mainloop: # 1. read keyboard input, and process it beq $s6, $s7, mainloopnext1 ori $a0, $s6, 0 mfc0 $t0, $12# Set Status register andi $t0, 0xfffe# clear ENABLE mtc0 $t0, $12# write back to status li $s6, 10000# $s0 used to pass the ascii code mfc0 $t0, $12# Set Status register ori $t0, 1# set ENABLE mtc0 $t0, $12# write back to status jal process_input mainloopnext1: # 2. update counter, check sleep timer jal delay_10ms # 3. $s0 as the 10ms counter, go from 0 to 299 addi $s0, $s0, -1 bne $s0, $0, mainloop li $v0, 4 la $a0, msg_tvworking syscall addi $s0, $0, 300 j mainloop li $v0,10 # exit syscall # delay_10ms: li $t0, 1000 delay_10ms_loop: addi $t0, $t0, -1 beq $t0, $0, delay_10ms_done j delay_10ms_loop delay_10ms_done: jr $ra # process_input: la $t0, menuLevel lw $t1, 0($t0) bne $t1, $0, pi_menu_L_1 li $t0, 109 # comparing with the ascii of `m' bne $a0, $t0, process_input_done la $t0, menuLevel li $t1, 1 sw $t1, 0($t0) la $a0, msg_menu li $v0, 4 syscall j process_input_done pi_menu_L_1: li $t0, 104 # comparing with the ascii of `h' bne $a0, $t0, pi_menu_L_1_comp_q # la $a0, msg_hello li $v0, 4 syscall j process_input_done pi_menu_L_1_comp_q: li $t0, 113 # comparing with the ascii of `q' bne $a0, $t0, process_input_done # la $a0, msg_quit li $v0, 4 syscall la $t0, menuLevel sw $0, 0($t0) j process_input_done process_input_done: jr $ra # ktext 0x # kernel code starts here mfc0 $k0, $13# Cause register srl $k0, $k0, 2# Extract ExcCode Field andi $k0, $k0, 0x1f bne $k0, $zero, kdone# Exception Code 0 is I/O. Only processing I/O here lui $k0, 0xFFFF# $k0 = 0xFFFF0000; lw $s6, 4($k0)# get the input key kdone:mtc0 $0, $13# Clear Cause register mfc0 $k0, $12# Set Status register andi $k0, 0xfffd# clear EXL bit ori $k0, 0x11# Interrupts enabled mtc0 $k0, $12# write back to status eret# return to EPC #