[ Daily Study _ 4] #190302
1. code plus 강의 (재귀 함수, 비트마스크 )
재귀함수_ 서로 다른 방법을 구현할수 있게 만드는 걸 파라미터로 넣는게 중요
ex> 123 더하기_ go(cnt, sum, goal)
1) 불가능 한 경우 _ 함수호출을 해도 답을 구하지 못하는 경우
2) 정답을 찾은 경우
3) 다음 경우를 호출하는 경우
ex2> 암호 만들기 _go(n, alpha, password, i) //(길이, 알파벳, 암호, 인덱스)
최소 한개 모음 두개 자음 문자종류 c가지 가능성 암호 모두구하기(부르트포스!!)
--> 123 더하기와 다르게 암호 길이 확인을 먼저 해줘야댐
ex3> 로또_go(a, index, cnt)
ex4> 부분집합의 합_ go(index, sum)
서로 다른 n개의 정수로 이루어진 집합이 있을 때,
ex5> 퇴사, 연산자 끼워넣기
비트마스크 _ 모든 경우의 수 만들기 (bit 연산 이용 모든 부분집합 표현)
비트연산 _ ex) and, or , xor, not --> (A+B) /2 ==(A+B)>>1
비트마스크는 정수로 집합을 나타낼 수 있다. 0부터 N-1 까지!
어떤 수 알아보기, 추가 |, 검사 & 제거 or, 토글 ^ // bitset
ex> 집합, 부분 집합의 합
2. 면접 정리(기업분석,, 용어정리)
- 성공, 成功 // 인생에서의 성공이란?
- 1.목적이나 뜻을 이루는 것.
- 2.사회적 지위나 부(富)를 얻는 것.
- 보통 제품을 개발하는 회사를 보면 H/W 엔지니어는 하드웨어를 설계하고 PCB를 조립하고 하드웨어의 오류를 검증하고
하드웨어에 이상이 없다고 판단되면 S/W 엔지니어가 하드웨어를 동작시키기 위한 펌웨어를 작성합니다.
요즘에는 펌웨어를 작성하지 않고도 JTAG 인터페이스가 지원되는 디버그 장비를 통하여 하드웨어를 검사할 수 있습니다.
JTAG 디버그 장비를 가지고 있으면 기본적으로 하드웨어의 리셋, 메모리(RAM) 및 외부 I/O에 Read/Write 를 확인해 봄으로써 기본적인 검증을 마무리 할 수 있습니다.
- RAM이 정상 동작하는지에 대한 여부는 RAM영역의 메모리 번지를 덤프하여 해당 번지에 원하는 값을 Write 하였을때
정상적으로 쓰기가 되는지 확인 가능하며 회로 설계가 잘못 되었을 경우에는 RAM 번지를 덤프해서 보고 있으면
값이 계속 변하거나 특정 비트값들만 틀어지는 증상이 나오는데 이런 경우는 하드웨어에 의한 불량인 경우가 많습니다.
DDR RAM처럼 고속으로 CPU와 버스로 연결되어 있는 부품은 하드웨어 설계시 어드레스/데이터 버스의 버스 길이를
맞추지 않으면 위와 같은 증상이 발생합니다.
- 그럼 S/W 엔지니어는 기본적인 하드웨어 동작에 문제가 없으면 CPU를 살리기 위한 부트프로그램 및 펌웨어를 작성하는데
이 부트코드들은 대부분 어셈블리 언어로 작성되어 집니다.
부트 프로그램이 기본적으로 하는 일은 아래와 같습니다.
- CPU 클럭 셋팅
- RAM 컨트롤러 초기화
- C프로그램 사용이 가능하도록 Stack 설정.
- 요즘에는 OS(리눅스, RTOS)를 사용하는 경우에 대부분 부트로더를 사용하는데 하드웨어를 구매하여 사용하는 경우에는
제조사에서 부트로더를 제공하지만 하드웨어를 직접 제작하거나 수정해야 하는 경우에는 어셈블리언어를 이용하여
부트로더 프로그램을 수정하여 하드웨어에 맞도록 설정을 해주어야 합니다.
위의 단계가 끝나면 OS를 포팅하는데 아래와 같은 단계가 필요합니다.
1. 초기화 코드에서 MMU/Cache를 Disable 하고 OS에서 사용할 스택, BSS(초기화되지 않는 변수들의 영역) 등을 초기화 합니다.
2. 내/외부 인터럽트를 처리하도록 인터럽트 백터 코드 설정 및 인터럽트 처리 로직을 구현합니다.
(인터럽트 처리 로직은 대부분 어셈블리로 작성되므로 해당 지식이 많이 필요하겠죠?? )
3. OS가 동작하는데 반드시 필요한 커널 틱 타이머 서비스를 외부 인터럽트를 통하여 구현합니다.
(OS는 외부틱 타이머를 이용하여 커널 스케줄링이 일어납니다)
4. Cache/MMU의 구조를 이해하고 MMU를 구성해야 합니다.
4. 각종 드라이버를 개발합니다.
이더넷 드라이버, 시리얼 드라이버, 타이머드라이버 등등
임베디드 시스템 S/W 엔지니어는
1. 기본적으로 사용하고자 하는 CPU에 대해서 이해를 하고 있어야 하는데 특히 Core에 대한 이해가 필요합니다.
ARM을 예로 들면 ARM-CortexA9 코어를 사용하여 제조한 CPU라면 먼저 ARM-CortexA9에 대한 코어 이해를 한 이후에
CPU메뉴얼을 보아야 합니다. CPU메뉴얼에는 해당 Core에 대한 설명이 많이 빠져있습니다.
2. 어셈블리 언어를 사용할 줄 알아야 합니다.
ARM은 ARM Assembler Guide 문서를 읽어야 합니다.
3. JTAG과 같은 디버깅 도구를 잘 다루어야 합니다.
디버깅 도구를 잘 쓰는 것은 삽질을 피하는 최선의 방법입니다.
4. 드라이버 개발에 대한 지식이 많이 필요합니다.
(이더넷 드라이버등은 난이도가 필요한 드라이버 이므로 초보자는 i2c나 spi 처럼 간단한 디바이스 드라이버를 직접 구현해보는걸 추천합니다.)
5. OS의 핵심개념(스케줄러, 세마포어, 뮤텍스, 이벤트 등)을 이해
3. 백준 // 깨작깨작 대다가 성공하지못태따.......
4. 영숙어 한큐정리,
- I'm over it _ IDGAF
내일할래
///////////////////
이재은멘탈개씹쓰레기...........
'잰이_IT > 취준 | 이준' 카테고리의 다른 글
#190418 현상황 리뷰 (0) | 2019.04.18 |
---|---|
[ Daily Study _ 12] 백준, 자소서 190311 (0) | 2019.03.11 |
[ Daily Study _ 11] 백준, 면접 190308 (0) | 2019.03.09 |
[ Daily Study _ 2] code plus 강의, ktfuturestar, 면접 질문답,백준 190228 (0) | 2019.02.28 |
[ Daily Study _ 1] code plus 강의, 자소서 작성, 면접 질문정리,백준 8958 190227 (0) | 2019.02.28 |