ARM 프로세서에는 특이하게 7개의 모드가 존재한다.
동작모드는 프로세서가 어떤 권한을 가지고 무슨 일을 처리하는지 나타내는 프로세서의 동작상태를 일컷는다.
이 7개의 Mode서, 각 모드가 따로 SP(Stack Point)를 갖고 있는다. 
(User와 System은 갖은 Stack 사용, 즉 6개의 Stack이 사용된다.)

 

Mode

Description

CPSR M[4:0]

User

User Task나 Application을 수행할때의 동작모드로 모든 동작모드중유일하게 비특권 모드이다. User Mode는 메모리, I/O장치와 같은 시스템 자원을 사용하는데 제한을 두어 사용자의 실수를 방지한다. 다른 모드(SVC)로 이동하기 위한 방법으로는 소프트웨어 인터럽트를 발생시킨다.

10000b

FIQ

(Fast IRQ)

2개의 인터럽트 소스중 아주 빠르게 인터럽트를 처리할 수 있도록 구성된 모드. 빠른 처리를 위해서 Exception Vector에서도 최하단에 존재하고 별도의 레지스터를 소유한다.

10001b

IRQ

(Interrupt Request)

일반적으로 사용되는 인터럽트로 외부 장치에서 요청되는 하드웨어적인 IRQ의 발생에 의해 ARM 코어는 IRQ모드로 전환하고 인터럽트를 처리한다.

10010b

SVC

(Superviser)

대부분의 시스템 자원을 자유롭게 관리할 수 있는 동작모드로 주로 커널이나 디바이스 드라이버를 처리할 때(System Call) 동작되는 모드이다.
Reset신호가 입력되거나 SWI가 발생하면 SVC모드로 전환된다.

10011b

Abort

메모리에서 명령을 읽거나 데이터를 읽거나 쓸 때 오류가 발생할 때 Abort Mode로 전환하여 오류를 처리한다.

10111b

Undefined

명령어를 읽어 실행하고자 하나 읽어온 명령이 디코더에 정의되어 있지 않은 명령인 경우 발생되는 오류를 처리하는 모드이다.

11011b

System

User 모드와 동일한 Register를 사용하고 동일한 용도로 사용된다. User 모드와의 차이점은 특권을 갖고 있다는 것이다. 
(ex : OS Kernel)

11111b

 

위 표에서 우측의 5bit짜리 정보는 CPSR이라는 상태 Register내에 저장된 정보이다. CPSR은 현재 모드의 상태를 저장하고 있는데, 그중 우측 0~4bit 총 5bit는 각 모드의 정보를 담고 있다. 32bit중 나머지 bit는 N,Z,C,V로 컨디션 코드 및 기타 정보로 사용된다. (Register 부분에서 언급예정)

인터럽트나 에러 또는 프로그래머에 의하여 모드가 변경될 수 있다.
다음에는 Exception에 대해 알아 볼 것인데 Exception에 의해서 모드가 변경되기 때문에 각 모드의 특징에 대해 알고 있어야 한다.

System/User/SVC Mode가 은근히 헷갈리고 명확히 정의내리기 애매했었다.
System과 User는 같은 Stack을 이용하여 거의 비슷하나, User Mode에서는 Device등의 자원을 사용하는데 제한이 주어진다. SVC Mode는 처음 Reset되었을 때 접근하는 Mode로 시스템 자원을 자유롭게 관리가 가능하며 별도의 Stack을 이용한다.
User Mode는 OS상에 올라가는 Application으로 생각하고,
OS는 기본적으로 System Mode,
OS나 Application이 시스템 자원(I/O등)을 사용할때는 SVC모드로 바뀐후 사용한다고 보면 된다.

이때, SVC모드로 바뀌어서 시스템 자원을 사용할 권한을 획득하는 것을 System Call이라고 지칭한다. (추후 자세히)


※ 이러한 모드가 눈에 보이는 것이 아니라, 개념적이고 추상적인 부분이라 정의를 명확히 해야한다. 현재 모드를 확인하려면 CPSR의 5bit를 출력해 봐야 비로소 눈으로 확인이 가능하다 -.,-; (가끔 헷갈려서 필자도 몇번 레지스터를 출력해보았다^_^)


출 처 : http://shinluckyarchive.tistory.com/270


1. 개요

    이 문서는 GNU 어셈블러 문법에서 지시자로 사용되는 의사 명령어를 간단히 정리 한 문서이다. 
    더 많은 참조를 원한다면 다음 사이트를 방문한다.
    
        http://tigcc.ticalc.org/doc/gnuasm.html#SEC70
    
2. 데이터 지시자 

    .byte   <byte1> {,<byte2>} ...      : 8  비트 데이터 
    .hword  <short1> {,<short2>} ...    : 16 비트 데이터 
    .word   <word1> {, <word2>} ...     : 32 비트 데이터 
    .ascii  "<string>"                  : 문자열 
    .asciz  "<string>"                  : 문자열 : 마지막에 자동으로 NUL 문자인 0을 추가 한다. 
    .space  size[, fill]                : 주어진 바이트 수를 할당한다. 바이트들은 0 이나 fill 값으로 채워져 있다. 

3. 상수 또는 심볼릭 관련 지시자 

    .equ <symbol name>, <value>                 : 심볼값을 정의 한다. 
    <register_name> .req <register_name>        : 레지스터의 이름을 짓는다. 
    .global <symbol>                            : 심볼을 외부 참조가 가능하게 한다 
    .set <variable_name>, <variable_value>      : 변수 값 설정
    

4. 코드 블럭 관련 지시자 
    
    .code <number_of_bits>    : 명령어 폭을 비트로 설정한다.

                                                Thumb 어셈블리에서는 16을, ARM 어셈블리에서는 32를 사용한다. 
    .section name[, "flags"]  : 새로운 코드 섹션 또는 데이터 섹션을 지정한다. 
                                섹션 명은 링크 디스크립터에 정의 되어 있어야 한다. 일반적으로 다음항목을 사용한다.
                                   .text : 코드 섹션
                                   .data : 초기화된 데이터 섹션
                                   .bss  : 초기화되지 않은 데이터 섹션. 
                                flags 는 ELF 포멧에서 
                                   a     : 섹션 할당
                                   w     : 쓰기 가능한 섹션
                                   x     : 실행 가능한 섹션


    .align alignment[, [fill][, max]]    : 주소를 2^n 바이트 단위로  정렬한다. 
                                           어셈블러는 fill나 적절한 디폴트 값을 추가하여 정렬을 맞춘다. 
                                           만약 max보다 더 많은 fill 바이트가 필요하다면 정렬되지 않는다.
                                                  
     .rept count                         : count 만큼 코드 블록을 반복한다. .endr로 끝난다.
    .endr                                : 반복 루프를 끝낸다. 

5. 매크로 

    .macro name [macargs...]       : name 이름의 어셈블러 매크로를 정의한다. 매크로 정의는 .endm으로 끝난다. 
    .endm                          : 매크로 정의를 끝낸다. 
    .exitm                         : 매크로를 빠져나온다. armasm에서의  유사하다.

6. 조건 컴파일 

    .if absolute_expression        : 컴파일 조건문 시작 .endif를 사용하여 끝낸다. 
    .ifdef symbol                  : symbol 이 정의되어 컴파일 대상에 포함되는 시작 .endif를 사용하여 끝낸다. 
    .else                          : .if와 .endif와 예외 조건이다. 
    .elseif                        : else 와 if 를 합친 것이다. 
    .endif                         : 조건부 컴파일 지정을 끝낸다(.if, .ifdef, .ifndef 참고). 
    .err                           : 에러가 있으면 어셈블리를 정지시킨다.

7. 기타 

    .include "<filename>"          : 지정한 소스 파일을 포함한다

8. GNU ASM 과 ARM ASM 의 대치표

    .ascii      : DCB
    .byte       : DCB
    .hword      : DCW
    .word       : DCD
    .space      : SPACE
    .set        : SETA
    
    .equ        : EQU
    .req        : RN
    
    .code       : CODE16,CODE32
    .sectoin    : AREA
    .balign     : ALAIN
    
    .macro      : MACRO
    .endm       : MEND
    .exitm      : MEXIT
    
    .if         : IF     
    .else       : ELSE
    .endif      : ENDIF
    .include    : INCLUDE


출 처 : http://forum.falinux.com/zbxe/index.php?document_srl=550700&mid=lecture_tip



ABI

application binary interface


EABI

embedded application binary interface


None-EABI

특정 OS에 맞춘 EABI가 아니라는 뜻


ABI는

응용 프로그램 - 운영체제,

응용 프로그램 -  해당 라이브러리,

응용 프로그램의 구성 요소 간에서 사용되는 낮은 수준의 인터페이스이다.,


ABI 와 API 비교

API -> 소스코드

ABI -> 바이너리


결론

난 cross-compile을 할려고 했는데, target platform이 EABI인 arm-none-eabi를 설치했다.

헛 짓을 며칠 하다 위의 내용을 알고 arm-none-gnueabi로 다시 설치.


eabi는 arm-none-gnueabi를 컴파일 할 때 사용 한단다.


arm-none-eabi를 gnu target을 컴파일 하면


/home/kang/다운로드/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../.. /../arm-none-eabi/bin/ld: warning: cannot find entry symbol _start; defaulting to 00008018

/home/kang/다운로드/arm-2013.05/bin/../lib/gcc /arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':

sbrkr.c:(.text+0x18): undefined reference to `_sbrk'

/home /kang/다운로드/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../.. /arm-none-eabi/lib/libc.a(lib_a-writer.o): In function `_write_r':

writer.c:(.text+0x20): undefined reference to `_write'

/home /kang/다운로드/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../.. /arm-none-eabi/lib/libc.a(lib_a-closer.o): In function `_close_r':

closer.c:(.text+0x18): undefined reference to `_close'

/home /kang/다운로드/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../.. /arm-none-eabi/lib/libc.a(lib_a-fstatr.o): In function `_fstat_r':

fstatr.c:(.text+0x1c): undefined reference to `_fstat'

/home /kang/다운로드/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../.. /arm-none-eabi/lib/libc.a(lib_a-isattyr.o): In function `_isatty_r':

isattyr.c:(.text+0x18): undefined reference to `_isatty'

/home /kang/다운로드/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../.. /arm-none-eabi/lib/libc.a(lib_a-lseekr.o): In function `_lseek_r':

lseekr.c:(.text+0x20): undefined reference to `_lseek'

/home /kang/다운로드/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../.. /arm-none-eabi/lib/libc.a(lib_a-readr.o): In function `_read_r':

readr.c:(.text+0x20): undefined reference to `_read'

collect2: error: ld returned 1 exit status


위와 같은 오류가 나타난다.


target platform 에 대해 더 자세하게는 아랫글을 보도록 하자

EABI/ELF


RTOS systems or "bare metal" systems where no operating system is present. These toolchains should not be used to build Linux kernels or applications.


GNU/Linux


Systems running "full" Linux, i.e., Linux on CPUs with an MMU. Use Sourcery CodeBench to build both the Linux kernel and applications.


출 처 : http://blog.daum.net/wonjin92/37



1) Literal pool
- 영어 의미 그대로 상수(Literal)들이 담겨있는 메모리 특정영역(pool)을 의미한다.
- ARM assemble에서는 ARM 범용레지스터에 '32bit 상수값'을 넣기 위해 사용한다.

2) ARM 범용레지스터에 32bit값 대입하기
LDR{cond}{size} Rd =DATA(32bit)
    ex) LDR        R1,  =0x12345678 ;  데이터 0x12345678을  R1에 대입
- 어셈블러가 '=DATA' 부분을 [PC, #<offset>] 형태로 바꾸고 PC+offset 위치에 있는 'Literal pool'에서
  size만큼 데이터를 읽어 Rd에 저장한다.
- LDR instruction의 디코드표를 보면 offset은 12bit가 할당되어 있으므로, 최대 '4kB' 까지 나타낼 수 있다.
  따라서 Literal pool은 pc값 주소의 4kB안에 있어야 한다.

출 처 :  
http://supsupi.tistory.com/entry/1-Literal-pool%B0%FA-32bit-%C1%D6%BC%D2-%B0%AA-%B7%B9%C1%F6%BD%BA%C5%CD%BF%A1-%BA%D2%B7%AF%BF%C0%B1%E2

SPI의 개요

SPI (Serial Peripheral Interconnect) 버스는 Motorola에 의해 개발된 전이중 (full duplex) 통신이 가능한 동기 통신 규격이다. I2C와 마찬가지로 매스터 슬레이브 방식으로 동작하며 매스터가 동기를 위한 클럭을 출력한다각 SPI 슬레이브 장치는 chip enable (/CE) 입력을 가지고 있으며 이 입력이 활성화되었을 때에만 동작한다따라서 매스터는 여러 개의 slave select (SS) 선을 슬레이브들의 /CE에 연결하고 한 순간에 하나의 슬레이브만 선택하는 방법을 사용하여 두 개 이상의 슬레이브 장치들을 구동할 수 있다. SPI의 통신 속도는 최고 70 MHz에 이르기 때문에I2C에 비해 훨씬 빠르다.

 

다음 그림은 SPI 버스를 통해 매스터가 한 개의 슬레이브와 일대일로 연결된 상황을 보여준다.

 

 

그림에 표시된 4 개의 신호는 SPI 버스에서 정의된 신호이다.

 

● SCLK : Serial Clock. 매스터가 출력하는 동기용 클럭

● MOSI : Master Output Slave Input. 매스터의 출력이며 슬레이브에게는 입력

● MISO : Master Input Slave Output. 슬레이브의 출력이며 매스터에게는 입력

● SS : Slave Select. 매스터의 출력으로 슬레이브를 선택하기 위한 신호

 

SCLK는 매스터가 출력하는 클럭 신호이다. SCLK를 기준으로 매스터와 슬레이브 사이의 데이터 교환이 진행된다. MOSI는 매스터의 출력으로 슬레이브로 정보를 보내기 위한 선이다반대로 MISO는 슬레이브의 출력으로 매스터가 슬레이브의 정보를 받기 위한 선이다앞의 그림에서 보듯이 매스터와 슬레이브의 MOSI끼리 서로 연결되며 MISO끼리 서로 연결된다. SS는 매스터가 슬레이브를 선택하기 위한 매스터의 출력으로 슬레이브의 /CE 입력에 연결된다슬레이브는 /CE 입력이 ‘0’인 동안에만 활성화된다.

 

통신을 진행하기 위해서 매스터는 우선 SS로 ‘0’을 출력하여 해당 슬레이브를 활성화시킨다그런 다음 매스터는 SLCK로 동기를 위한 클럭을 출력하는데 이 클럭에 맞추어 MOSI로 데이터를 한 비트씩 내보낸다이와 동시에 매스터는 자신이 출력하는 클럭에 맞추어 MISO를 한 비트씩 읽는다다시 말해서 SPI 매스터는 자신의 출력인 SCLK에 맞추어 MOSI로 데이터를 내보내며 동시에 MISO로는 데이터를 수신한다. SPI 버스는 언제나 양방향 통신을 진행한다. SCLK에 맞추어 MOSI로 데이터를 출력하는 동안 MISO로는 데이터가 수신된다수신되는 데이터는 상황에 따라 의미가 있는 값일 수도 있고 쓰레기 값일 수도 있다마찬가지로 슬레이브의 데이터를 읽기 위하여 SLCK에 맞추어 MISO로 입력을 받는 동안 MOSI로는 데이터가 출력된다.

 

보통 SPI 통신은 8 비트 단위로 진행되지만 12 비트나 16 비트 또는 그 이상의 길이가 한 단위가 될 수도 있다비트 전송 순서에 대한 규정은 없다데이터의 전송은 MSB부터 시작될 수도 있고 LSB부터 시작될 수도 있다데이터를 연속 전송하는 경우 한 단위의 데이터를 보낼 때마다SS 신호를 매번 인가할 수도 있지만 SS 신호를 ‘0’으로 설정한 후 모든 데이터를 다 보낼 때까지 이 상태를 유지하고 있다가 데이터의 전송이 끝났을 때 SS를 ‘1’로 바꿀 수도 있다. SPI 규격은 이런 부분까지 규정하고 있지 않으며 매스터와 슬레이브 사이의 약속에 따라 결정된다. SPI슬레이브 장치의 용도와 특성에 따라 사용 방법이 다르므로 슬레이브 장치의 데이터쉬트를 반드시 확인해야 한다.

 

어떤 마이크로컨트롤러는 설정된 전송 단위에 맞추어 데이터 전송 때마다 자동으로 SS 신호를 출력해 주는 기능을 가지고 있다. ATMEL사의ARM7 기반 AT91SAM7S 계열 마이크로컨트롤러가 그 예이다데이터 전송 단위를 16 비트로 설정했다면 SPI 매스터가 SCLK 신호를 출력하기 전에 자동으로 SS 신호를 ‘0’으로 내리고 데이터가 출력되는 동안 이 상태를 유지하다 전송이 끝나면 이 신호를 다시 ‘1’로 올려준다이런 용도로 사용할 수 있는 SS 핀이 여러 개 있어서 사용자가 선택할 수 있다이런 기능이 있으면 정해진 길이의 데이터를 반복해서 출력하는 경우예를 들면 주기적으로 DAC에 값을 전송하는 경우에 매우 편리하다이런 기능이 없는 마이크로컨트롤러의 경우에는 사용자가 프로그램을 통해 수동으로 SS 신호를 제어해야 한다. AVR 마이크로컨트롤러는 이 기능을 지원하지 않으므로 GPIO 핀을 슬레이브 선택용으로 정하고 수동으로 그 신호를 제어해야 한다.

 

SPI 모드 (mode)

SPI 매스터와 슬레이브는 매스터의 출력인 SCLK에 맞추어 데이터를 한 비트씩 교환한다그런데 클럭에 동기를 맞추는 방법은 한 가지만 있는 것이 아니다클럭이 출력되고 있지 않은 상황에서 클럭의 기본 값은 ‘0’일 수도 있고 ‘1’일 수도 있다그리고 매스터와 슬레이브가 매 클럭의 첫 번째 에지에서 데이터를 읽을 수도 있고 매 클럭의 두 번째 에지에서 데이터를 읽을 수도 있다앞의 특성을 클럭의 극성 (polarity)이라고 하고 뒤의 특성을 클럭의 위상 (phase)이라고 한다클럭의 극성과 위상의 조합에 따라 모두 4 가지 방법이 사용 가능하다. SPI 슬레이브는 4가지 가능한 방법 중 한 가지를 사용하도록 만들어지고 매스터는 4 가지 방법을 모두 지원해야 한다.

 

AVR 마이크로컨트롤러의 SPI 제어 레지스터에는 CPOL CPHA라는 비트가 있는데 이 비트의 설정에 따라 출력되는 클럭의 극성과 위상이 달라진다다른 마이크로컨트롤러도 이와 같거나 비슷한 이름의 비트를 가지고 있다. CPOL 비트가 0이면 클럭의 기본 상태가 ‘0’이며 이 비트가 1이면 클럭의 기본 상태는 ‘1’이다그리고 CPHA 비트가 0이면 매 클럭의 첫 번째 에지에서 데이터가 샘플되며 이 값이 1이면 두 번째 에지에서 데이터가 샘플된다.

 

다음 그림은 CPHA 비트가 0일 때의 타이밍을 설명하고 있다.

  

 

CPHA 값이 0이므로 클럭의 극성에 상관없이 매스터와 슬레이브는 모두 매 클럭의 첫 번째 에지에서 데이터를 샘플한다따라서 매 클럭의 두 번째 에지에서 비트 전환이 일어난다.

 

다음은 CPHA 비트가 1일 때의 타이밍을 설명한다.

  

 

클럭의 극성에 상관없이 매 클럭의 두 번째 에지가 데이터 샘플에 사용되며 따라서 매 클럭의 첫 번째 에지에서 비트 전환이 일어난다.


위의 4 가지 극성과 위상 조합에 0에서 3까지의 숫자를 부여하여 이를 SPI 모드라고 부른다.


SPI mode

CPOL

CPHA

0

0

0

1

0

1

2

1

0

3

1

1

 

두 개 이상의 SPI 슬레이브 연결

I2버스처럼 SPI 버스에서도 한 개의 매스터가 두 개 이상의 슬레이브와 연결될 수 있다. I2슬레이브가 고유한 주소를 가지고 있는 것처럼 각각의 SPI 슬레이브는 chip enable (/CE) 신호를 가지고 있다. SPI 매스터는 각 슬레이브의 /CE 신호를 제어하여 원하는 슬레이브를 선택한다.다음 그림은 한 개의 SPI 매스터에 두 개의 슬레이브들을 연결하는 방법을 설명한다.

 

 

세 장치의 SCLK, MOSI, MISO는 각각 서로 연결되어 있지만 슬레이브의 /CE 신호들은 서로 묶이지 않고 매스터의 다른 핀들로 연결된다슬레이브의 수에 상관없이 한 순간에는 하나의 슬레이브만 매스터와 통신할 수 있다두 슬레이브가 모두 활성화되면 슬레이브의 출력인 MISO에서 데이터의 충돌이 일어난다그래서 매스터는 자신이 원하는 슬레이브의 /CE 신호만 ‘0’으로 설정하여 활성화시키고 나머지 슬레이브의/CE는 ‘1’로 두어야 한다. /CE 입력이 ‘1’인 슬레이브는 선택되지 않았기 때문에 자신의 MISO 출력을 hi-Z 상태로 만들어 선택된 슬레이브와 매스터 간의 통신에 영향을 주지 않는다따라서 모든 SPI 슬레이브의 MISO 출력은 3 상태를 지원한다. /CE 입력이 ‘1’인 슬레이브는 당연히 매스터가 출력한 SCLK와 MOSI 신호를 무시한다.

 

세 개 이상의 슬레이브도 같은 방법으로 매스터와 연결할 수 있다슬레이브의 수가 하나씩 늘어날 때마다 새로운 슬레이브를 위한 /CE 신호만 하나 더 필요할 뿐이다그런데 이 때 매스터에 연결된 슬레이브들이 사용하는 SPI 모드가 한 가지가 아니거나 비트 전송 순서가 다를 수 있는데 이런 경우에는 통신의 효율이 많이 낮아진다가령 어떤 슬레이브는 모드 0을 사용하고 또 다른 슬레이브는 모드 1을 사용한다면 매스터가 슬레이브를 바꿀 때마다 동작 모드를 매번 다시 설정해야 한다또한 동작 모드가 같아도 비트 전송 순서가 다르다면 마찬가지 문제가 생긴다.

 

매스터가 하나의 슬레이브만 구동한다면 슬레이브의 /CE 신호를 GND로 고정시켜 두어도 상관없다어차피 SCLK, MOSI, MISO를 공유할 다른 슬레이브가 없기 때문에 이 선들은 하나뿐인 슬레이브 전용으로 사용된다그렇기 때문에 슬레이브를 항상 활성화시켜 둬도 기능상의 문제는 생기지는 않는다.

 

SPI 통신의 예

AT45DB161D은 SPI 인터페이스를 사용하는 16 Mbit 직렬 플래쉬 메모리이다이 플래쉬 메모리에 정보를 기록하거나 저장된 정보를 읽기 위한 여러 방법 중 다음 그림은 main memory page read 명령을 설명하고 있다이 그림에서 데이터는 바이트 단위로 표시되어 있다.

 

 

main memory page read 명령은 AT45DB161D 내부의 특정 페이지의 내용을 연속으로 읽기 위한 것이다이 플래쉬 메모리의 용량은 2 Mbytes이므로 주소를 지정하기 위해서 21 비트가 필요하다매스터는 가장 먼저 AT45DB161D /CE 신호를 ‘0’으로 만든 다음 main memory page read를 위한 비트 명령을 출력하고 이어서 읽기를 원하는 주소 바이트를 출력한다. (AT45DB161D MSB 우선의 비트 전송 순서를 사용한다.) main memory page read 명령과 바이트 주소를 받으면 AT45DB161D는 저장된 데이터를 읽어서 출력할 준비를 하는데 이 과정에 시간이 필요하다이를 위해 매스터는 4 바이트를 더 출력한다매스터가 추가로 전송하는 4 바이트를 전송하는 것은 SLCK를 출력하기 위한 동작이므로 출력하는 데이터는 어떤 값이든 상관없다.

 

이렇게 8 바이트를 MOSI로 출력하는 동안 계속해서 매스터의 MISO AT45DB161D의 출력이 들어오지만 이 값은 아무런 의미가 없는 쓰레기 값이다. AT45DB161D의 데이터 전송은 9 번째 바이트부터 시작된다. AT45DB161D 9 번째 바이트에서 매스터가 지정한 주소의 내용을MISO로 출력한 후 내부 카운터를 사용하여 주소를 1 증가시킨다이 후 매스터가 MOSI로 한 바이트씩 출력할 때마다 AT45DB161D는 데이터를 출력하고 주소를 1 증가시키는 과정을 계속 되풀이한다이런 과정을 통해 매스터는 AT45DB161D의 데이터를 필요한 만큼 연속해서 읽고 마지막으로 AT45DB161D /CE 신호를 ‘1’로 만들어 통신을 끝낸다. 9 번째 바이트부터 매스터가 SCLK를 출력할 뿐 MOSI로 출력해야 하는 데이터는 없으므로 어떤 값을 보내도 상관 없다.

 

이 명령 외에도 AT45DB161D을 사용에 필요한 다른 많은 명령들이 더 있다각 명령마다 위 그림과 비슷한 타이밍도를 가지고 있으므로 각 명령의 쓰임새와 사용법을 알려면 AT45DB161D의 데이터쉬트를 참고해야 한다.

 

SPI의 장·단점

SPI 버스의 가장 큰 장점으로는 최고 70 MHz에 이르는 빠른 통신 속도와 동시 양방향 통신이 가능하다는 점을 들 수 있다전송 데이터 단위에 대한 제약이 없어서 8 비트, 16 비트, 24 비트 등 원하는 길이를 한 워드로 설정할 수 있다비트 순서에 대한 제약도 없으므로 필요에 따라MSB부터 전송할 수도 있고 LSB부터 전송할 수도 있다. I2슬레이브와 달리 SPI 슬레이브는 자체 주소를 가지고 있지 않으므로 주소 충돌의 문제도 발생하지 않는다.

 

I2버스와 달리 SPI 버스에는 한 개의 버스 매스터만 있을 수 있으며 I2버스에 비해 필요한 핀의 수가 더 많다. SPI 버스는 기본적으로 4 가닥의 선을 사용하며 매스터에 연결된 슬레이브의 숫자가 많아질수록 슬레이브를 선택하기 위한 SS 핀의 수 역시 슬레이브 수에 비례해서 늘어난다또한 I2버스의 ACK와 같은 메커니즘이 없어서 매스터는 자신이 통신하고 있는 장치가 실제 존재하는지 여부를 확인할 수 없다.

출 처 :  
http://eslectures.blog.me/80137862792


1. nand scrub

 - nand 의 모든 영역을 지우는 명령어


2. nand erase 'start_address' 'end_address'

 - nand 의 특정 영역을 지우는 명령어.
 - 'start_address'와 'end_address' 영역의 nand 내용을 지운다.
 - 'start_address'와 'end_address'에는 16진수를 써 넣는다. 단 0x는 붙이지 않는다.

 ex) # nand erase 0 8000


3. printenv

 - 환경 설정값을 읽어오는 명령어


4. setenv '환경변수'

 - u-boot에서 사용하는 환경변수를 설정하는 명령어

 ex) # setenv ipaddr 192.168.1.3
      # setenv bootargs "rootfstype=jffs2 root=/dev/mtdblock2 init=/init console=ttySAC1,115200"


5. saveenv

 - 설정 변경된 값을 저장하는 명령어
 - setenv 명령 후, 반드시 save를 해야 적용 됨


6. nand read [to:ram addr] [from:rom addr] [image size]

 - rom에 있는 image를 size 만큼 읽어, ram에 올리는 명령어

 ex) # nand read 30008000 40000 300000


7. nand write [from: ram addr] [to: rom addr] [image size]

 - ram에 있는 image를, rom에 size만큼 올리는 명령어

 ex) nand write 30008000 40000 300000


8. bootm [ram addr]

 - ram addr로 이동하여 image를 수행하는 명령어

 ex) bootm 30008000














 

각 프로세서별로 별도의 캐시 메모리를 가지고 있는 공유 메모리 멀티프로세서에서, 한 명령어 피연산자의 복제본이 주기억장치에 하나, 그리고 각 캐시 메모리에 하나씩, 여러 개 존재할 수 있다. 이러한 상황에서 피연산자가 변경되면, 나머지 복제본 역시 변경되어야만 한다. 캐시 일관성은 공유된 피연산자의 값이 변경되면, 그 사실이 전체 시스템에 즉시 전파되는 것을 보장하는 하나의 질서이다.

캐시 일관성에는 다음 세 가지의 명확한 단계가 있다.

  1. 모든 쓰기 연산은 즉시 발생하는 것처럼 보인다.
  2. 모든 프로세스들은 독립되어 있는 각 피연산자들의 값이 정확히 같은 순서대로 변경되는 것을 본다.
  3. 다른 프로세스들은, 값들의 순서가 다른 것을 사실이라고 생각하는 피연산자를 볼 수 있을지도 모른다 (이것은 일관성이 없는 행동으로 간주된다).

2 단계의 행동과 3 단계의 행동 둘 모두에서, 프로그램은 틀린 데이터를 볼 수 있다. 컴퓨터 설계자들은 최근, 2 단계 행동을 다루는데 필요한 프로그래밍 규율이, 3 단계 행동을 다루는데 충분하다는 것을 깨닫게 되었다. 그러므로, 어떤 경우에는 같은 컴퓨터에서는 오직 1 단계와 3 단계 행동만이 보일 것이다.

출 처 : http://www.terms.co.kr/cachecoherence.htm

3.2.1.  Registers

The 64-bit PowerPC Architecture provides 32 general purpose registers,
each 64 bits wide.  In addition, the architecture provides 32
floating-point registers, each 64 bits wide, and several special
purpose registers.  All of the integer, special purpose, and
floating-point registers are global to all functions in a running
program.  The following table shows how the registers are used.

r0        Volatile register used in function prologs
r1        Stack frame pointer
r2        TOC pointer
r3        Volatile parameter and return value register
r4-r10    Volatile registers used for function parameters
r11       Volatile register used in calls by pointer and as an
          environment pointer for languages which require one
r12       Volatile register used for exception handling and glink code
r13       Reserved for use as system thread ID
r14-r31   Nonvolatile registers used for local variables

f0        Volatile scratch register
f1-f4     Volatile floating point parameter and return value registers
f5-f13    Volatile floating point parameter registers
f14-f31   Nonvolatile registers

LR        Link register (volatile)
CTR       Loop counter register (volatile)
XER       Fixed point exception register (volatile)
FPSCR     Floating point status and control register (volatile)

CR0-CR1   Volatile condition code register fields
CR2-CR4   Nonvolatile condition code register fields
CR5-CR7   Volatile condition code register fields

On processors with the VMX feature.

v0-v1     Volatile scratch registers
v2-v13    Volatile vector parameters registers
v14-v19   Volatile scratch registers
v20-v31   Non-volatile registers
vrsave    Non-volatile 32-bit register

mtsprg 0, rs mtspr 272, rs yes SPRG0
mtsprg 1, rs mtspr 273, rs yes SPRG1
mtsprg 2, rs mtspr 274, rs yes SPRG2
mtsprg 3, rs mtspr 275, rs yes SPRG3

출처 : http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=/com.ibm.aix.aixassem/doc/alangref/moving_special_reg.htm

Below, the instruction set for the PowerPC architecture is given. A lot of instructions were intentionally left out:

  • Instructions for 64-bit Implementations Only
  • Floating Point Instructions
  • Supervisor-Level Instructions
  • I/O-specific Instructions
  • Instructions for Multiprocessor Support
  • Trap / System Call Instructions

This leaves 107 instructions: the core PowerPC Instruction Set.

When following the links below, you will be taken to a page describing a (family of) instructions. Note that these descriptions are taken from the 64-bit version of the instruction set; bit numbering are different for some instructions on 32-bit implementations. The lab course software uses a 32-bit PowerPC emulator.

The mnemonics column shows all valid forms of an instruction; it also shows simplified mnemonics in italics.

InstructionMnemonicsDescription
add add / add. / addo / addo. Add
addc addc / addc. / addco /addco. Add Carrying
adde adde / adde. / addeo /addeo. Add Extended
addi addi / li / la / subi Add Immediate
addic addic / subic Add Immediate Carrying
addic. addic. / subic. Add Immediate Carrying and Record
addis addis / lis / subis Add Immediate Shifted
addme addme / addme. / addmeo / addmeo. Add to Minus One Extended
addze addze / addze. / addzeo / addzeo. Add to Zero Extended
and and / and. AND
andc andc / andc. AND with Complement
andi. andi. AND Immediate
andis. andis. AND Immediate Shifted
b b / ba / bl / bla Branch
bc bc /bca / bcl bcla Branch Conditional
bcctr bcctr / bcctrl Branch Conditional to Count Register
bclr bclr / bclrl Branch Conditional to Link Register
cmp cmp / cmpw Compare
cmpi cmpi / cmpwi Compare Immediate
cmpl cmpl / cmplw Compare Logical
cmpli cmpli / cmplwi Compare Logical Immediate
cntlzw cntlzw / cntlzw. Count Leading Zeros Word
crand crand Condition Register AND
crandc crandc Condition Register AND with Complement
creqv creqv / crset Condition Register Equivalent
crnand crnand Condition Register NAND
crnor crnor / crnot Condition Register NOR
cror cror / crmove Condition Register OR
crorc crorc Condition Register OR with Complement
crxor crxor / crclr Condition Register XOR
divw divw / divw. / divwo / divwo. Divide Word
divwu divwu / divwu. / divwuo / divwuo. Divide Word Unsigned
eqv eqv / eqv. Equivalent
extsb extsb / extsb. Extend Sign Byte
extsh extsh / extsh. Extend Sign Half Word
lbz lbz Load Byte and Zero
lbzu lbzu Load Byte and Zero with Update
lbzux lbzux Load Byte and Zero with Update Indexed
lbzx lbzx Load Byte and Zero Indexed
lha lha Load Half Word Algebraic
lhau lhau Load Half Word Algebraic with Update
lhaux lhaux Load Half Word Algebraic with Update Indexed
lhax lhax Load Half Word Algebraic Indexed
lhbrx lhbrx Load Half Word Byte-Reverse Indexed
lhz lhz Load Half Word and Zero
lhzu lhzu Load Half Word and Zero with Update
lhzux lhzux Load Half Word and Zero with Update Indexed
lhzx lhzx Load Half Word and Zero Indexed
lmw lmw Load Multiple Word
lswi lswi Load String Word Immediate
lswx lswx Load String Word Indexed
lwbrx lwbrx Load Word Byte-Reversed Indexed
lwz lwz Load Word and Zero
lwzu lwzu Load Word and Zero with Update
lwzux lwzux Load Word and Zero with Update Indexed
lwzx lwzx Load Word and Zero Indexed
mcrf mcrf Move Condition Regisiter Field
mcrxr mcrxr Move to Condition Register from XER
mfcr mfcr Move from Condition Register
mfspr mfspr / mfxer / mflr / mfctr Move from Special-Purpose Register
mftb mftb Move from Time Base
mtcrf mtcrf Move to Condition Register Fields
mtspr mtspr / mtxer / mtlr / mtctr Move to Special-Purpose Register
mulhw mulhw / mulhw. Multiply High Word
mulhwu mulhwu / mulhwu. Multiply High Word Unsigned
mulli mulli Multiply Low Immediate
mullw mullw / mullw. / mullwo / mullwo. Multiply Low Word
nand nand / nand. NAND
neg neg / neg. / nego / nego. Negate
nor nor /nor. NOR
or or / or. OR
orc orc / orc. OR with Complement
ori ori OR Immediate
oris oris OR Immediate Shifted
rlwimi rlwimi / rlwimi. / inslwi / insrwi Rotate Left Word Immediate then Mask Insert
rlwinm rlwinm / rlwinm. / extlwi / extrwi
rotlwi / rotrwi / slwi / srwi
clrlwi / clrrwi / clrlslwi
Rotate Left Word Immediate then AND with Mask
rlwnm rlwnm / rlwnm. / rotlw Rotate Left Word then AND with Mask
slw slw / slw. Shift Left Word
sraw sraw /sraw. Shift Right Algebraic Word
srawi srawi / srawi. Shift Right Algebraic Word Immediate
srw srw / srw. Shift Right Word
stb stb Store Byte
stbu stbu Store Byte with Update
stbux stbux Store Byte with Update Indexed
stbx stbx Store Byte Indexed
sth sth Store Half Word
sthbrx sthbrx Store Half Word Byte-Reverse Indexed
sthu sthu Store Half Word with Update
sthux sthux Store Half Word with Update Indexed
sthx sthx Store Half Word Indexed
stmw stmw Store Multiple Word
stswi stswi Store String Word Immediate
stswx stswx Store String Word Indexed
stw stw Store Word
stwbrx stwbrx Store Word Byte-Reverse Indexed
stwu stwu Store Word with Update
stwux stwux Store Word with Update Indexed
stwx stwx Store Word Indexed
subf subf / subf. / subfo / subfo. / sub Subtract From
subfc subfc / subfc. / subfco / subfco. / subc Subtract from Carrying
subfe subfe / subfe. / subfeo. / subfeo. Subtrect from Extended
subfic subfic Subtract from Immediate Carrying
subfme subfme / subfme. / subfmeo / subfmeo. Subtract from Minus One Extended
subfze subfze / subfze. / subfzeo / subfzeo. Subtract from Zero Extended
xor xor / xor. XOR
xori xori XOR Immediate
xoris xoris XOR Immediate Shifted

출 처 : http://pds.twi.tudelft.nl/vakken/in1200/labcourse/instruction-set/

+ Recent posts