티스토리 뷰
(월)
- 어셈블리어를 모르고 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. 기선제압을 해야 함..
- 카메라로 내 모습을 찍어봐라. 피드백 필요
- 다대다 면접시 다른 면접자 차례에는 미소짓고 좌우로 바라보는게 좋다.
- 당당함을 보여라