Assembler Directives
.으로 시작하고 뒤에 키워드가 나옵니다.
.ascii 'string"
문자열은 ""안에 넣어야 문자열이구나 하고 인식하고 알파벳 하나 하나에 해당하는 메모리에 들어간다.
byte나 word
뒤에 숫자를 쓰면 거기에 해당하는 형태로 초기화가 된다.
.data
뒤에 있는것은 데이터이다.
.equ
define 하는것과 비슷함
symbol, expression이 같은것
.global symbol
모든 영역에서 다 보이는 변수를 지정
.include "filename"
c에서도 마찬가지로 헤더파일을 사용하는데
일종의 헤더파일을 설정할 때 include를 해서 사용
(equ등을 지정해놔서 include 해줄 수 있는것)
.org new-Ic
잘 안씀
.skip size
size만큼 공간을 비워 놓고 가라
=>output 결과를 저장할 때 사용한다.
.text
여기서부터는 텍스트
.end
여기서 종료한다.
Example Program
start
대부분의 프로그램은 초반에 메모리에서 레지스터로 데이터를 ld로 가져오고
마지막에 결과 값을 메모리에 저장했었죠
레이블을 맨 왼쪽 칸에 맞춰 쓰고 레이블에 해당하는 instruction을 한 탭 정도
띄워서 쓰는게 관습입니다.==>보기 좋아서. 주석도 가능합니다.
movia r2 AVECTOR
카피해오는것.i:숫자.a:주소
AVECTOR에 해당하는 주소를 r2에 저장을 하게 됩니다.
일종의 포인터 역할을 하게 되는것이죠
ldw r4,0(r4)
r4가 가르치고 있는 위치의 값==>6이 됩니다.
6을 r4에 저장한다.
add r5,r0,r0
r5에 0이 들어간다.
r5는 sum이다
ldw r6,0(r2)
r6<=5
ldw r7,0(r3)
r7<=2
mul
r8<=r6*r7
addi r2,r2,4
다음 것을 가리킬 수 있도록 +4바이트 해주는것
subi r4,r4,1
r4를 루프가 끝낼 때 마다 1씩 줄여주고
bgt r4,r0,LOOP
r4>r0일 때 루프를 돌라는 의미
stw r5,DOT_PRODUCT(r0)
store the result in memory
DOT_PRODUCT 어드레스에 저장을 하겠다.
STOP: br STOP
코드가 사라지지 않게 maintain해준다.
Exception Processing
예외 처리
외부 IO와 관련된 부분은 Exception으로 처리하고 있다.
main에서는 놀고 있고 exeption만 처리하는 경우로 프로그램이 바뀌는 경우도 있다.
Exception 프로세싱은 중요하다!!..
일반적인 마이크로프로세서에서 비슷한 형식으로 다루고 있다.
Software trap 인위적으로 발생시킬 수 있다.
==>우리는 운영체제를 짜는것이 아니기 때문에 잘 건드리지는 않는다.
Hardware interrupt
우리가 주로 다룰 부분
Unimplemented instruction
모든 비트를 다쓰는것은 아니고,,
못알아듣는 명령어가 왔을 때 exeption을 발생 시키는것
CPU에서는 어떤일이 일어날까?
==>CPU내부에서 자동적으로 일어나는 일들
현재 돌고 있는 상황을 저장해 놓아야하니 카피를 한다.
status register(ctl0)를 estatus register (ctl1)에 카피를 함
U bit를 클리어한다.
U bit clear==> 유저 비트를 클리어 한다는것은 슈퍼바이저 모드로 들어간다.
PIE clear
Process Interrupt Enabel 비트를 0으로 한다.
다른 인터럽트를 처리하지 않겠다.
instruction의 어드레스를 Ea register에 저장한다.
Exception gandeler의 주소를 Execution에 넘긴다.
Exception 핸들러의 주소는 어떻게 결정되느냐?
설계할 때 적게 된다.==>미리 정하는것입니다.
필요에 따라서 동적으로 바꾸는것이 아니에요
Software trap
말 그대로 trap이라는 명령어를 사용해서 exeption을 프로그래머가 발생시키는것
O/S가 다양한 프로그램들을 왔다갔다 하면서 스케쥴링할 때 사용한다.
외부 시그널이 들어오면 I/O 디바이스에서 인터럽트가 뜨는것
irq0 through irq31==> 32비트에 들어감
어떤 interrupt-request input이 발생했는지
하드웨어 인터럽트는 사용자가 셋업을 해야 발생한다
PIE but는 status register에 저장되어있는데
PIE가 1로 셋 되어 있어야 발생한다.==>두꺼비 집과 같은 존재
interrupt-enable bit가 1로 셋팅이 되어야 한다.
32개의 인터럽트를 전부사용하는것은 아니잖아요?
다 열어두지는 않아요. ex)키보드, 타이머만 쓸것이다..
irqk is asserted 실제로 키보드의 해당키가 들어온다던지==>실제 이벤트를 말하는것
위의 세가지 조건을 만족하면 인터럽트가 발생한다.
32개의 다양한 인터럽트가 발생할 수 있는데
인터럽트가 발생했는데 어느 인터럽트가 발생했는지 알 수있는 방법이 있다.
어떻게 알 수 있는가
ctl4에 가서 ipending register를 읽어볼 수 있어요.
나머지는 0이고 해당 비트만 1로 셋팅이 되어있다.
정확히 한클락에 들어오면 highest priority에 따라서 처리함
ISR:interrupt-service routine==인터럽트 핸들러
ISR로 점프해서 원래 해야하는 일들을 하게 되는겁니다.
Exception Type을 결정할 때
1.Ipending register를 봅니다.
하드웨어 인터럽트가 발생했으면 Ipending register가 발생했을것.
2.Exception이 발생했을 때
PC값의 value가 ea 레지스터의 값이 카피가 되는데
이때의 어드레스가 +4가 ea레지스터에 저장이 되죠
-4 그 전것으로 가면 그 직전에 발생했던 인스트럭션을 알 수 있는데
그것이 만약 trap이다 그러면 software-trap이라고 생각할 수 있는것이죠.
1번도 2번도 아니면 unimplemented instruction이에요==>버그 같은 존재
하드웨어 인터럽트에 대한 예제 코드에요.
==>irq1번이 셋팅되는거
Exception handler>
ipending 레지스터 값을 et에 카피를 해서
et와 r0를 비교를 하죠
같으면 oter_exeption으로 보내버리는거죠
0이 아니면 하드웨어 인터럽트가 되고
그때 ea레지스터를 4만큼 감소를 시켜라
et와 2와 and를 해요==> 두번째 레지스터만 1이되면 되는거죠
이것을 r13에 저장을 하는겁니다. ==>이게 1이되면 irq1은 1로 살아남는것이죠.
r13이랑 r0랑 equal인지 확인을 합니다.
0이면 ==>irq1은 0이다 ==>우리가 원했던 인터럽트가 아님==>oter_in ~ 으로
1이면 calll EXT_IRQ1 ==>원래하려던 일을 합니다.
하려던일을하고 return됩니다.
br END_HANDELER
eret로 가서 끝남
하드웨어 인터럽터는 항상 마지막에는 eret으로 간다.
캐쉬 메모리
멀리있는 실제 메모리의 실제 데이터를 가져오기 힘드니 중간에 캐시메모리를 두는것
I-cache와
8워드로 사이즈가 정해져 있다.
==>정할수 있긴하다, 외울필요는 없어요
D-chche가 있다
다양한 사이즈로 되어있다. ==>데이터 사이즈는 다양하니까
그리고 서로 분리되어있어요.
init:0으로 만드는거
flush 데이터가 실제 메모리로 가서 쓰여지느냐?.?
==>우리는 잘 쓰지는 않는다고 합니다.
우리는 캐쉬를 잘 만지지는 않으니까
Cache Bypass Methods
CPU에서 메모리로 갈때
메모리가 아니라 I/O모드에 대해서는 Cache는 거치지 않는 인스트럭션들이 존재한다.
뒤에 io를 붙이면 캐쉬를 건너 뛰고 바로 I/O로 Access한다.
CPU안에 있는 메모리
프로그래머는 외부에 있는 메모리인것처럼 다루면 됩니다.
ldaw,,stw,,
좋은 엔지니어는 TCM을 잘 다루긴 해야됩니다.
'제어 > 전자HW설계' 카테고리의 다른 글
[전자HW설계] LAB3 (0) | 2020.09.30 |
---|---|
[전자HW설계] LAB2 (0) | 2020.09.22 |
[전자HW설계] 2-2 (0) | 2020.09.10 |
Introduction to Nios II (0) | 2020.09.07 |
[전자HW설계] [1-1] (0) | 2020.09.01 |