티스토리 뷰

전자회로/임베디드교육

4

쥬브62 2020. 4. 27. 14:17

(월)

 

- 어셈블리어를 모르고 c만 가지고는 절름발이와 같다.

 

- 어셈블리어는 코딩하자고 배우기 보단 체계, 마인드를 갖추기 위해 배운다고 생각하자.

 

- 보조기억장치(HDD,SSD)에 있는 프로그램은 주기억 장치(RAM)로 로딩되어야 실행할 수 있다.

 

- 레지스터는 CPU 내부에 들어 있다. 단순한 저장장치가 아니라 연산시 필요하다

 

-  MOV R0, #1 // 상수는 #(샾,해시태그)을 사용한다.

INSTRUCTION

(OP CODE)

OPERAND
MOV R0 #1

machine code로 바이너리화(32bit) 된다. 이 machine code에는 인스트럭션과 오퍼랜드에 대한게 들어 있다.

 

- 포팅 : 다른 플랫폼에 프로그램을 이식하는 것

 

-

.Aligned access

unsigned long *ptr=(unsigned long *)0x12340000;

unsigned long temp;

temp = *ptr; (O)

 

.Un-aligned access

unsigned long *ptr=(unsigned long *)0x12340001;

unsigned long temp;

temp = *ptr; (X)

-> ARM에서는 홀수번지의 주소에 접근하지 않는다.

-> 하게 되면 Abort(더이상 코드를 실행하지 않음)

 

. 하드웨어와 컴파일러는 Little endian식, Big endian식으로 나뉘어 진다

 

int a=1; //R2

int b=1; //R1

int c; //R0

c=a+b; //R0=R2+R1

 

. R은 일반적인 목적으로 사용한다. (연산 등)

 

sum(int, int)

{

  int sum; 

  a+b;
}

 

. stack에는 지역변수가 써졌다(push) 지워졌다(pop) 한다.

. stack memory는 재사용 된다.

 

-

sum(int a, int b)

{

  int sum; 

  sum=a+b;

  return sum;
}

temp=sum(1,2); // call하기 전에 LR(link register)에 return address를 저장

 

if(a>b) -> cmp r0, r1 // 계산결과의 상태정보를 cpsr에 저장

 

temp=sum1(1,2);

->

mov r0, #1 //1이 r0에 저장

mov r1, #2 //2가 r1에 저장

bl sum1 //bl(branch with link), return address를 LR에 저장하고 sum1을 call

 

I (IRQ prohibit bit)

F (FIQ prohibit bit)

 

- 동작모드마다 stack memory가 배정된다.

 

-

자동모드 변환 ex) USER->IRQ

1. user모드의 cpsr을 IRQ의 spsr에 저장

2. IRQ의 cpsr로 변경(모드(10010), I/F비트(인터럽트 걸렸으니 I bit는 1이 된다), T비트(0))

3. user모드의 pc를 lr에 저장

4. PC=Vector

5. r0~r12(context정보)를 stack에 저장, IRQ의 SP가 스택 위치를 나타냄

 

수동모드 변환 ex) IRQ->USER

1. stack에 저장된 것을 다시 복원

2. LR, SPSR에 저장된 값은 각각 PC, CPSR에 복원

 

- 터미널 단축키

1. SHIFT + CTRL + N : 새 터미널 창

2. SHIFT + CTRL + T : 새로운 탭

3. CTRL + ALT + T : 터미널 실행

4. SHIFT + CTRL + W : 탭창 종료

5. SHIFT + CTRL + Q : 터미널 종료

6. ALT + 숫자 : 탭간 이동

7. CTRL + PAGE UP/PAGE UP : 탭간 이동

8. CTRL + L : 창 클리어

 

- 터미널 명령어

1. $ pwd : 현재 디렉토리 확인

2. $ cd / : 최상위 디렉토리로 이동

3. $ cd .. : 상위 디렉토리로 이동

4. $ cd  : home 디렉토리 이동

5. $ tree -L 1 :  디렉토리 구조를 보여줌 (2,3,4 ...)

6. $ make clean && make : 

7. $ ll : 현재 디렉토리 탐색

8. $ ping 8.8.8.8 : 구글 dns 서버 ip주소로 인터넷 되는지 확인

9. $ sudo reboot : 리부팅

10. $ subl hello.c : hello.c의 문서 생성

11. $ subl ./ : 현 디렉토리를 연다

 

실습

- 예제파일 압축 해제

$ tar zxf ~/Documents/MDS2450/m2450.tar.gz

 

-

. 우리는 TFTP로 파일 보낼 것이다

 

-

시리얼 실행하기

 

$ subl ~/.bashrc -> alias m='minicom -w -D/dev/ttyUSB0' 에서 ttyUSB0를 ttyS0 으로 변경

$ source ~/.bashrc

$ m

 

- 터미널창에서

$ ~/Desktop/m2450/docs/02.M2450_보드자료/getBootEnv2 192.168.0.2 

입력하면 아래 아이피 정보 나옴

 

(MDS2450# 시리얼 창에 복사해 넣음)

# set gatewayip 192.168.0.1
# set netmask 255.255.255.0
# set ipaddr 192.168.0.3
# set serverip 192.168.0.2

 

(시리얼 창에 추가로 입력)

# set bootdelay 1

# set bootcmd 'tftp 30000000 MDS2450.bin; go 30000000'

# saveenv 

 

 

(보드를 껏다 키면 다운받은거 실행됨)

그런데 eth1로 잡아두셨기 때문에 만약 eth2로 잡혔다면 아래와 같은 과정 수행

$ sudo rm /etc/udev/rules.d/70-persistent-net.rules
$ sudo reboot

eth가 다시 잡힌다.

 

or 

 

$ reinit (선생님이 위의 과정을 스크립트로 만드신 것)

더보기

#!/bin/bash
echo 1 | sudo rm -f /etc/udev/rules.d/70-persistent-net.rules
sudo shutdown -r now

 

-

리눅스 랜선 연결 확인

Player->Removable devices->ASIX를 활성화되어 있는지 확인

 

- 미니컴(minicom) 종료법

CTRL+A

X

ENTER

 

-

. tools -> build system -> new build system -> 위와 같이 수정하고 저장

. 이제부터 build 하면 자동으로 make clean && make가 된다

 

 

(화)

- 뭐든 직접해봐야 기억에 잘 남는다.

 

- 명렁어는 모두 마지막에 register write로 끝난다.

MOV R0, #1

ADD R0, R0, #1

LDR R0, [MEM]

 

- 둘다 MEM1을 MEM2로 복사하는 것

LDR R0, [MEM1'S ADDRESS]

STR R0, [MEM2'S ADDRESS]

.RISC는 MEM TO MEM copy 불가

 

MOV [MEM2], [MEM1]

.CISC는 가능

 

-

 

- sublime 단축키

1. ctrl + shift + f : find in files

2. ctrl + f2 : bookmark

 

- 어셈블리어 주석

/* */ 가능

// 불가

@ 가능

 

- 어셈블리어의 label은 1번 컬럼부터 작성하고 ; (콜론)으로 끝낸다.

 

- .globl 를 적어놔야 다른 source에서 사용가능, 내부에서 사용시는 안써도 됨

 

- 어셈블리어 명령어

1. b .  : 자기 자신으로 분기

2. b 대상 : 대상의 주소로 분기  

2. mov pc, lr : return과 같다

3. add r0, r0,#1 : r0+=1

3-1.

adds r0, r0, #1 //조건플래그를 사용하여 N,Z,C,V 뽑아냄

=

add r0, r0, #1

cmp r0, #0

 

4. cmp r0, r1 : r0와 r1을 비교 // r0-r1 하여서 상태(N, Z, C, V)를 CPSR_f에 저장

5. blt : 왼쪽이 오른쪽보다 작으면 분기 //앞에 cmp 선 사용

6. bgt : 왼쪽이 오른쪽보다 크면 분기

7. beq : 왼쪽과 오른쪽이 같으면 분기

 

8. movlt r0, #1  :  비교해서 왼쪽이 작으면 r0에 1 저장 //앞에 cmp 선 사용

9. movgt r0, #2  :  비교해서 왼쪽이 크면면 r0에 2 저장

10. moveq r0, #3  : 비교해서 같으면 r0에 3 저장

 

 

- APCS(ATPCS)

. 함수의 인수는 r0, r1, r2, r3 까지 받을 수 있음, 5번째 부터는 memory에 stack을 쌓음(속도 저하)

.

 

- int와 char의 속도차이는 없다. 오히려 char가 느릴수 있다.

레지스터 사이즈가 32bit니까 기본으로 int를 사용하는 것이 좋다.

 

- 터미널 명령어

1. ll : 실패시 실행

$ ls dir2 || mkdir dir2  // dir2 디렉토리가 없으면 dir2 디렉토리를 만듬

 

2. && : 성공시 실행

$ make clean && make // make clean이 성공되면 make 실행

 

- .c 로 .S 만들어 보기

이부분만 변경

- 어셈블리어 명령어

1. mov r0, r0, lsl #1  :  r0=(r0<<1), lsl(logical shift left)

2. mov r0, r0, lsr #1 :  r0=(r0>>1), lsr(logical shift right)

 

3. and r0, r1, r2 :  r0=r1&r2

4. orr r0,r1,r,2 : r0=r1|r2

 

5. subgt r0, r0, r1 : 비교해서 왼쪽이 크면 r0=r0-r1  // 앞에 cmp 선사용

6. sublt r0, r0, r1 : 비교해서 왼쪽이 작으면 r0=r0-r1

 

7. bne : not equal 이면 분기

 

8. sub r0,r1,r2 : r0=r1-r2

8-1. rsb r0,r1,r2 : r0=r2-r1

 

9. bic r0, r0, #(1<<4)  : r0의 4번 bit를 0으로 클리어하고 r0에 저장  

 

10.

mov r0, #0xFFFFFFFF

=

mvn r0, #0x //토글시켜서 저장

 

10-1.

mov r0, #0x031c0000

=

ldr r0, =0x031c0000

큰수라도 넣을 수 있다.

 

-

if(!(status ^ 1))  // status가 1일때만 참이된다.

{

 

}

 

-

ror #4 : 오른쪽으로 4 bit 이동, 짝수만 가능 

 

-

$ arm-none-eabi-objdump -d MDS2450 > MDS2450.dis // MDS2450을 disassemble해서 .dis로 저장

 

. ldr r0, =0x031c1234 // r0에 0x031c1234를 저장

 

. PC + #588(0x24C)를 가면 031c1234이 저장되어 있다. pc는 실행기준 주소 + 8 을 가리킨다.

. .word = .const int

(수)

- 어셈블리어 명령어

1. msr cpsr, r0 : cpsr에 r0를 기록 // cpsr_f, s, x, c 특정 비트만 변경 가능

2. mrs r0, cpsr : cpsr을 r0로 읽음 // mrs는 불가

2-1. cpsr의 7번 비트만 1로 변경(IRQ를 disable)

mrs r0, cpsr

orr r0, r0, #(1<<7)

msr cpsr, r0

 

3. ldr/str

mov r4, #0x31000000

mov r5, #0x32000000

ldr r0, [r4]  : r4(0x31000000)의 값을 읽어서 r0에 저장 // 대괄호안은 주소

str r0, [r5,#4]  : r0의 값을 r5+4(0x32000004)에 저장

 

3-1. 어드레싱 모드(Pre Index)

mov r4, #0x31000000

mov r5, #0x32000000

ldr r0, [r4, #4]! : ldr실행시 r4는 0x31000004 갱신

str r0, [r5, #4]!

 

3-2. 어드레싱모드(Post Index)

mov r4, #0x31000000

mov r5, #0x32000000

ldr r0, [r4], #4 : ldr실행후 r4는 0x31000004 갱신

str r0, [r5], #4 

 

4. ldm/stm 블록 전송명령

ldmia r0!, {r5,r6,r7} // r0에서 부터 4*3=12byte 읽음, r0는 r0+12를 가리킴

stmia r1!, {r5,r6,r7} // r1에서 부터 r5-r7(12byte)를 저장, r1은 r1+12를 가리킴

 

5. return 으로 사용.

stmfd sp!, { ,lr}

ldmfd sp!, { ,pc}

 

6. swp r0,r1,[r2] : r2를 읽어서 r0에 저장하고 r1을 r2에 저장 

 

 

- 일단 스스로하다가 필요할 때 책을 본다.

 

- Thumb 명령어를 직접 사용하는 것은 드물다

 

- 공부법

추천 1

1. 보드 : stm32 Nucleo-64(메뉴얼이 잘 만들어져 있다)

2. 소스코드는 github 활용

3. 컴파일러 : stm32cubemx-ide

 

추천 2

1. 보드 : stm32f469i discovery kit

 

. 라즈베리파이 : 딱 리눅스 돌리는 정도로만 사용하기 좋다. 커널 개발용으론 x

 

- 메모리에 있는 것을 한번이라도 읽으면 캐시(i캐시,d캐시)에 저장된다. 다시 접근시 속도의 향상(시간도 적게들고, 전기도 덜 먹음)이 있다.

 

-

MMU_EnableICache:
  mrc  p15,0,r0,c1,c0,0  : r0에 c1 저장,
  orr  r0,r0,#R1_I  : #R1_I(c1의 bit12)를 1로 set
  mcr  p15,0,r0,c1,c0,0  : c1에 r0 저장
  mov  pc,lr

 

-

MMU_InvalidateIDCache:
  mcr  p15,0,r0,c7,c7,0  : flush(캐시에 담긴 걸 청소)
  mov  pc,lr

 

- 리눅스는 write back방식을 사용

  . 속도는 빠르나 캐시메모리와 주메모리의 씽크가 맞지 않음, 캐시클린 사용이 필요

 

- 삶의 질이 나아지는 공부를 하자

 

 

 

(금)

- 면접도 두괄식으로 답하여라.

 

- 면접괍이 짧게 물으면 짧게 답, 길게 물으면 길게 답해도 됨.

 

- 취업하려는 1순위 목적은? 

 . 돈, 지역 ...

 

- 자소서를 정독하기 보다는 소제목에 관심을 갖는다.

 

-

 

 

. 사용한 단어에 대한 근거가 이력서에 포함되어 있으면 좋다.

 

- 가만히 있으면 얻을 수 있는 것은 없다.

 

1. 이력서의 전체 분량이 중요하긴 하다

2. 자소서(단락정리, 틀 제대로, 일목요연)는 임원 면접

3. 적으라는 건 다 적고, 적지말라는 것도 다 적기

4. 동아리는 만들어서라도 

5. 거짓말을 하려면 완벽하게 준비

6. 1분 자기소개 때 이미 당락이 결정된다.(면접관에게 감동을 주는 임팩트 있는 첫마디가 중요하다!!)

7. 물어보기 전까지는 안다고 뽐내지 마라

8. 지원동기 : 선배, 동기한테 이야기를 들었다

 

9. 면접

 . 안녕하십니까. 인사하고 앉으라면 하면 앉고

 . 다대일 말속도 적당히 차분하게, 다대다 말속도 빠르게

 . 기억에 남을 키워드를 사용.

 . 형식빼고 솔직하게 말해보라고 하면 솔직하게 답. 

10. 면접은 연습이다.

11. 쳐다보게 만들면 50% 성공

 

- 자소서의 소제목을 잘 뽑아야 한다

 

- 짧게는 28초, 길게는 52초 자기소개

 

- 메라비언의 법칙

55% 시각적 요소(자세, 제스쳐, 헤어), 걸어 들어오는 자세가 중요!!, 미소!!

38% 청각적 요소(목소리 톤, 속도, 크기)

7% 언어적 요소

 

-

.자율복장

정장, 파란셔츠 or 반팔, 넥타이 풀고

 

.정장

정장, 흰와이셔츠, 넥타이

 

- 면접은 첫인상!!!!!!, 인상에 모든 것이 담겨 있다.

 

- 당당하게 걸어 들어 오는 모습, 밝은 얼굴 표정

 

- 긴장 없애주는 약 처방 받을 수 있다.(인데놀, 1시간후 효과)

 

- 자신의 색깔에 맞게 행동해야 한다

 

- 손은 강조시에만 확실히 사용. 안할꺼면 아얘 안하는게 낫다.

 

- 사전 pt는 내용, 당일 pt는 논리가 중요하다

 . 다 풀줄 모르겠으면 내가 알고 있는 걸 해도 되는지 여쭙자.

 

- 회식 : 갈등을 푸는 방법

 

- 앉는 자세

1. 다리는 뒷꿈치가 안보이게 11자로 놓는다.

1-1. 뒷꿈치가 무릎보다 나와야 함

2. 시선은 면전괍을 고루고루 바라봄

 

- 내뱉는 첫마디 톤이 중요하다!!! '솔' 정도?

 

- 자기소개

직무능력, 협업, 체력

 

- 면접은 스펙을 이길 수 있다.

 

- 마지막 면접..

1. 바로 들어와서 앉으라 하면 -> "지치셨을텐데 힘차게 인사한번 하고 가겠습니다."

2. 지치셨을테니까 목소리를 더 힘차게

3. 기선제압을 해야 함..

 

- 카메라로 내 모습을 찍어봐라. 피드백 필요

 

- 다대다 면접시 다른 면접자 차례에는 미소짓고 좌우로 바라보는게 좋다.

 

- 당당함을 보여라

'전자회로 > 임베디드교육' 카테고리의 다른 글

7주차  (0) 2020.05.18
6  (0) 2020.05.11
5  (0) 2020.05.04
MMU(memory management unit) -수정중  (0) 2020.04.21
3  (0) 2020.04.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함