ADC = Analog Digital Converter (아날로그를 디지털 변환기)

아날로그를 디지털로 변환할 때는 샘플링을 해야 한다. 샘플링이란 아날로그처럼 연속적인 신호를 규칙적인 부분으로 나눠서 그 부분의 데이터 값을 가져오는 방법이다.

파란선으로 된 부분이 아날로그 신호를 디지털화 하기 위해서 샘플링 한 것인데, 이 샘플링을 1초에 몇 번 하느냐에 따라서 샘플링 주파수가 나오게 된다. 만약 5Hz의 샘플링 주파수를 가지고 있다면 1초에 5번의 샘플링을 진행하는 것이다. 그리고 이 샘플링이 가로축에 대해서만 하는 것이 아니라 세로축에 대해서도 샘플링을 할 수가 있는데, 

빨간선으로 보이는 부분이 세로축(진폭)에 대해서 샘플링을 수행 한 것이다. 이것도 아까 위에서 말한 것처럼 샘플링 주파수를 계산할 수 있다.


예를 들어 CD의 샘플링 주파수는 16bit 44.1kHz이다. 즉 44100Hz*65536bit(2^16=2byte)=88200Byte가 나온다. 88200Byte는 음원의 1초 용량이다. 만약 음원이 스테레오면 *2, 3분짜리 음원이면 *180, 메가바이트 단위로 바꾸려면 1024를 두 번 나누어 주면 된다.


DAC = Digital Analog Converter (디지털 신호를 아날로그 신호로)

양자화의 특성 때문에 아무리 디테일하게 샘플링을 해도 디지털이랑 아날로그는 똑같을 수 없다. 아날로그에서 디지털로 변환할 때 손실 압축이 진행된다.

ADC가 녹음기(샘플링 시켜서 디지털화)라고 본다면, DAC는 재생기라고 볼 수 있다.


JTAG = 선 규약(국제표준) JTAG 지원 장비를 사서 꽂으면 내부를 볼 수 있고, control이 가능하다.

Embeded System 개발 시에 사용하는 디버깅 장비이다. Embeded System을 개발하기 위해 통합한 회로로 사용되는 IEEE 1149.1의 일반적인 이름이지만 보통 디버거를 가리킨다. 일반적으로 JTAG란 말 보다는 Boundary-Scan이란 말을 더 많이 사용한다. CPU의 상태와는 상관 없이 디바이스의 모든 외부 핀을 구동시키거나 값을 읽어 들일 수 있는 기능을 제공한다.

JTAG의 작동방식?

칩 내부에 Boundary Cell을 만들어 이것이 외부의 핀과 1:1로 연결되어 프로세서가 할 수 있는 동작을 중간의 Cell을 통해 인위적으로 수행할 수 있도록 하는 것이다. 이런 방식으로 JTAG는 다양한 하드웨어의 테스트나 연결 상태등을 체크할 수 있다. 또한 JTAG 라인을 통해 칩 내부를 조사(capture 기능) 및 제어(INTEST 기능)을 할 수 있다. 이 밖에도 EXTEST 기능을 이용하여 Embeded System의 다른 칩을 제어 할 수도 있다. 예를 들면 Embeded Systemm의 ROM(Nor Flash일 경우), NAND Flash 등의 내용을 기록하거나 읽어 낼 수 있다. 리눅스의 부트로더등을 다운로드하여 아무런 코드도 없는 Embeded System을 부팅하게 만들 수 있다.

Posted by 知彼知己百戰不殆
,

grep 사용법

OS/Linux 2016. 9. 2. 03:07

현재 디렉토리부터 서브 디렉토리까지 리커시브하게 찾아가면서 찾고 싶을 때

ex1)

grep -r 찾을 문자열 ./


grep의 결과중에서 원치 않는 결과 제거

ex2)

grep -r(해도 되고 안 해도 됨) 찾을 문자열 | grep -v tags //tags란 글자를 제외한 결과를 출력

'OS > Linux' 카테고리의 다른 글

Vim 에디터 syntax highlighting 설정하는 법  (0) 2016.09.27
페도라 syntax highlighting 설정  (0) 2016.09.26
CentOS 5.1 ifconfig command  (0) 2016.06.16
CentOS 5.1 gcc 설치법  (0) 2016.06.16
리눅스 파일 찾기 - find  (0) 2016.05.09
Posted by 知彼知己百戰不殆
,

http://www.kocoafab.cc/tutorial/view/526


http://air802.tistory.com/2


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

Posted by 知彼知己百戰不殆
,

vim Code syntax highlighting

1. cd /usr/share/vim/vim81

2. ls

3. cp ./vimrc_example.vim ~/.vimrc     <<  ./파일명은 붙여서 써야 함.

Finish


directory Coloring

home directory 밑의 .zshrc 파일 수정. 기존에는 .bash_profile을 수정했으나 안 되는 경우 수행.

.zshrc파일에서 

export TERM=xterm-color

export CLICOLOR=1

export LSCOLORS=ExGxDxFxCxegedabagaced

export GREP_OPTIONS='--color=auto'

alias ls='ls -G'

추가

그리고 

source ./.zshrc 실행해서 프로필 적용


============== 추가 설명 ==============

export LSCOLORS=ExGxDxFxCxegedabagaced

여기서 각각 순서대로 쌍을 이룸.

1. directory

2. symbolic link

3. socket

4. pipe

5. executable

CodeMeaning (Color)
aBlack
bRed
cGreen
dBrown
eBlue
fMagenta
gCyan
hLight grey
ABold black, usually shows up as dark grey
BBold red
CBold green
DBold brown, usually shows up as yellow
EBold blue
FBold magenta
GBold cyan
HBold light grey; looks like bright white
xDefault foreground or background

source : https://www.cyberciti.biz/faq/apple-mac-osx-terminal-color-ls-output-option/


'OS > Mac OS' 카테고리의 다른 글

vi 에디터로 작성 시 마우스 휠로 커서 옮기기  (0) 2016.11.13
Vim 자동완성  (0) 2016.11.13
Mac ettercap 패킷캡쳐, 스니핑 프로그램  (0) 2016.05.11
Mac 패킷 캡쳐  (0) 2016.05.10
GCC 어셈블리 사용법  (0) 2016.05.02
Posted by 知彼知己百戰不殆
,

Little Endian과 Big Endian

위의 그림은 Big Endian의 메모리 저장 방식이다. Most Significant Byte(최상위 바이트)부터 메모리에 저장을 하여 Least Significant Byte(최하위 바이트)까지 저장하는 방식이다.

위의 그림은 Little Endian의 메모리 저장 방식이다. 메모리에 저장할 때 LSB부터 저장을 하여 MSB까지 저장을 한다. 


이렇게 굳이 2가지로 구분을 해서 저장을 해야 할까? 그냥 Big Endian이든 Little Endian이든 한 가지 방식으로만 통합해서 사용하면 훨씬 편할텐데 왜 이렇게 했을까? 

이유는 Big Endian 방식은 논리적인 것들이나 숫자의 대소 비교를 할 때 Little Endian 방식보다 훨씬 빠르다. 예를 들어서 0x98251501, 0x11251501 있다고 하면, 숫자의 대소 비교는 제일 앞부터 비교를 하는 것이 시간을 단축할 수 있다. 만약 Little Endian 방식으로 사용해서 비교를 한다면 3바이트를 비교한 후, 마지막 바이트까지 검사를 해야 숫자의 대소 비교가 끝날 것이다. 또한 사람이 숫자를 읽고 쓰는 방식과 유사하기 때문에 소프트웨어의 디버깅이 쉽다는 장점이 있다.

하지만 계산에 있어서는 Little Endian 방식이 훨씬 효과적이다. 0x0145와 0xFA99가 있다고 하면 앞에서부터 계산하는 것이 쉽겠는가 뒤에서부터 계산하는 것이 쉽겠는가?

Posted by 知彼知己百戰不殆
,

함수 포인터는 반환형+(*함수이름)+인자로 이루어진다. 함수 이름을 진한색으로 표시한 이유는 단순 함수 이름이 아니라 (*)의 함수 이름이기 때문이다.


printf의 함수 원형(프로토타입) 

int printf (const char*, ...);

↓↓↓↓

타입 추출 (함수 이름만 제거)

int () (const char*, ...);

↓↓↓↓

int (*) (const char*, ...);

symbol table로 나타내면 

 반환형

함수 이름 

 주소

 int (*) (const char*, ...)

printf 

?? 


즉, printf의 함수 타입을 추출해 보면 int (*) (const char*, ...);란 결과를 얻을 수 있다.


자 그럼 내가 만든 함수에서 return 값으로 printf 함수 자체를 반환하면 어떻게 함수 구현을 해야 할까?

일단, 함수의 기본을 보면 예를 들어서 인자는 없고 int형 test함수를 만들고 싶다고 생각했다면 int test(void) { ~~~}를 떠올릴 수 있다. 여기서 반환형은 int, 함수 이름은 test, 인자는 (void) 이다. 

방금 printf 함수의 반환형 int (*) (const char*, ...)라고 하였다. 그렇다면 return printf을 하여서 나오는 반환형은 저 부분이 되어야 하니까 

int (*) (const char*, ...) { ~~ return printf } 가 되게 된다. 여기서 함수 이름을 test로 한다고 하면

int (*test (void)) (const char*, ...) {~~ return printf }

여기서 test(void) 함수 대신 뭐 p를 쓴다던가 단순 변수를 쓰게 되면 그냥 변수가 돼버린다. 주의!!!


이렇게 printf 함수를 반환하는 test함수를 만들었다면, 이걸 main에서 호출해 보자. 방금 만든 test함수의 원형을 살펴보면

맨 처음에 했던 타입 추출하는 방법대로 함수 이름 부분을 (*)로 바꿔주면 된다.

즉, int (*(*)(void)) (const char*, ...) 가 함수 타입 추출이다. 그렇다면 여기에 call이란 함수 포인터 변수를 만들어 준다면?

int (*(*call)(void)) (const char*, ...)

int main()

{

    int (*(*call)(void) (const char*, ...);

    call = test;

}

이렇게 해주면 main에서 내가 만들어준 함수인 test를 호출하고 test함수에서 printf 함수를 리턴하는 것까지 에러, 경고 없이 컴파일이 된다.

'언어 > 큐브인턴(Embedded)' 카테고리의 다른 글

풀업 저항, 풀다운 저항, 플로팅  (0) 2016.08.31
Little Endian, Big Endian  (0) 2016.08.25
리눅스 ASLR 해제  (0) 2016.08.17
C언어 컴파일 과정  (0) 2016.08.16
컴퓨터 구조(CPU, 메모리, 버스) 특강  (0) 2016.08.03
Posted by 知彼知己百戰不殆
,

ㅎㅎ

http://kkamagui.tistory.com/861

https://bpsecblog.wordpress.com/2016/05/16/memory_protect_linux_1/

참고

Posted by 知彼知己百戰不殆
,

컴파일 과정

비주얼 스튜디오 = IDE (통합개발환경) == 에디터, 컴파일러, 에디터

Posted by 知彼知己百戰不殆
,

MCU (Micro Controller Unit) : 마이크로프로세서와 입출력 모듈을 하나의 칩으로 만들어져 정해진 기능을 수행하는 컴퓨터

개인용 컴퓨터(PC)가 다양한 요구에 따라 동작하는 일반적인 일에 사용된다면, MCU는 기능을 설정하고 정해진 일을 수행하도록 프로그래밍되어 장치 등에 장착되어 동작한다. MCU는 임베디드 시스템에 널리 사용된다.


Central Processing Unit (CPU-중앙처리장치) 3대 구성요소

1. Arithmetic Logic Unit (ALU) :  두 숫자의 산술연산(덧셈, 뺄셈 등)과 배타적 논리합 xor, 논리곱, 논리합같은 논리연산을 계산하는 디지털 회로이다. 산술논리장치(ALU)는 컴퓨터 중앙처리장치의 기본 설계 블록

2. Register (Processor Register) : 컴퓨터의 프로세서 내에서 자료를 보관하는 아주 빠른 기억 장소이다. 일반적으로 현재 계산을 수행중인 값을 저장하는 데 사용된다. CPU랑 속도는 동급으로 두는 메모리. 레지스터의 크기는 버스의 크기와 동일.

3. Control Unit (CU) 프로세서의 조작을 지시하는 컴퓨터 중앙처리장치(CPU)의 한 부품이다. 입출력 장치 간 통신 및 조율을 제어한다. 명령어들을 읽고 해석하며 데이터 처리를 위한 시퀀스를 결정


프로그램의 실행 순서:

하드디스크의 .exe파일 -> SRAM -> 주소를 Register가 받아서 -> ALU 나 CU -> 실행


MCU는 CPU보다 확장성이 떨어진다. MCU 안에는 CPU + 여러 칩(RAM, ROM)들이 들어가 있기 때문에. CPU는 메모리가 필요 없으면 메모리를 빼면 되고, 필요하면 꽂으면 되니까 확장성이 좋다.

플래시 메모리 : 전기적으로 데이터를 지우고 다시 기록할 수 있는 비휘발성 컴퓨터 기억 장치. EEPROM과 다르게 여러 구역으로 구성된 블록 안에서 지우고 쓸 수 있다. 

플래시 메모리의 종류

구분

NAND 타입

NOR 타입

용도

USB 메모리, SSD 등 저장 매체

RAM처럼 실행 가능한 코드 저장

읽기

랜덤 액세스이나 한 블록이 모두 동작함. 비교적 느림

셀 단위 랜덤 액세스. 빠름

쓰기

한 번에 한 블록을 통째로 기록하여 빠름

한 셀씩 기록하여 느림

밀도

고밀도

저밀도

가격(용량 대비)

저가

고가

버스의 크기 = 몇 bit 컴퓨터

(ex. 버스의 크기 32bit -> 32비트 컴퓨터)

RAM의 주소(번지)를 관리하는 것이 바로 포인터

부산(CPU)에서 서울로 처음에 주소값(ex.0110)을 보내고 데이터로 1111 1010을 보냄. 그러면 서울(RAM) 6번지(0110)에 처음에 4bit 1111을 받고, 그리고 두 번째로 1010을 받음(버스가 4bit여서 한 번에 4bit만 전송 가능). RAM의 1번지당 크기는 1byte(8bit)로 잡음. 따라서 6번지에 들어가는 값은 1111 1010.


반도체 : 한쪽으로만 전류가 흐를 수 있도록 만든 것. (ex. 다이오드, 트랜지스터)

도체 : 전류가 아무렇게 흐를 수 있도록 만든 것

부도체 : 전류가 흐르지 않게 만든 것


하드디스크를 대신해서 나온 것 : SSD (Solid State Disk)

SSD는 DRAM 휘발성 메모리나 NAND 플래시 비휘발성 메모리로 이루어져 있다.

'언어 > 큐브인턴(Embedded)' 카테고리의 다른 글

Little Endian, Big Endian  (0) 2016.08.25
함수 포인터 (printf함수의 원형과 함수 포인터 사용)  (0) 2016.08.23
리눅스 ASLR 해제  (0) 2016.08.17
C언어 컴파일 과정  (0) 2016.08.16
I2C communication  (0) 2016.08.02
Posted by 知彼知己百戰不殆
,

I2C write

I2C 통신 시 Device Address를 보내고 나서 First Address와 Second Address를 보내고 나서 DATA를 보내야 함. 

그래서 코드 작성 시

#include "mbed.h"

#define ADDR (0xA0)  // 이렇게 Device Address를 16bit로 정해주고

I2C i2c(PB_9, PB_8);

int main() {

char data[3];

data[0]=0x01; // first word address

data[1]=0xAA; // second word address

data[2]='A' // 보낼 데이터

i2c.write(ADDR, data, 3); 

}

I2C read

current address read는 아직 current address를 모른다. 그러므로 current address를 정해주어야 한다.

random read는 device address(1byte) 다음에 1st address(1byte)와 2nd address(1byte) (current address - 2byte)를 write 해주고 나서, read를 해야 한다. (current address = dummy write = dummy byte)

write-read 과정: write(device address, data, byte)로 데이터 보냄 -> read 전에 write(device address, current address, byte)로 address를 보냄 -> read(device address, buffer, byte)로 데이터 읽어들임

read 할 때 write 과정이 없이 바로 read를 하게 되면 current address가 없으므로 데이터를 제대로 못 읽어온다.

Posted by 知彼知己百戰不殆
,