728x90

2024/10 56

종단 저항(Termination Resistor)이란?

CAN, RS-485와 같은 프로토콜에서 사용되는 종단 저항에 대해 알아보자. 종단 저항이란?종단 저항은 전기 회로의 끝에 연결되는 저항으로, 신호의 반사를 방지하고 신호의 무결성(Singal Integrity)을 유지하는 데 사용된다. CAN 통신에서는 두 개의 통신 버스를 사용하며, 이 버스 끝단에 120Ω의 종단 저항을 연결하여 신호 반사를 흡수한다. 이를 통해 네트워크 내에서 안정적인 데이터 전송이 가능하다. 종단 저항의 역할종단 저항은 전송선 끝단에 연결되어 신호의 반사를 방지하는 역할을 한다.통신 버스의 임피던스와 저항 값을 일치시켜 신호가 자연스럽게 소멸되도록 만든다.신호 반사를 제거하여 데이터 오류를 최소화한다. 임피던스(Impedance)란?임피던스는 교류 신호에서 발생하는 저항의 총합으..

자동차-통신 2024.10.16

[C언어] 댕글링 포인터(Dangling Pointer)란?

댕글링 포인터는 해제된 메모리 영역을 여전히 참조하고 있는 포인터이다. 즉, 이미 해제된 공간을 가리키고 있지만 프로그램 상에서는 여전히 포인터를 사용하려 하기 때문에 문제가 발생한다. 특히 접근 오류(Segmentation Fault)를 유발하거나 보안 취약점의 원인이 되기도 한다. 댕글링 포인터가 발생하는 상황int *ptr = (int *)malloc(sizeof(int));*ptr = 42;free(ptr); // 메모리 해제*ptr = 50; // 이 시점에서 ptr은 댕글링 포인터 댕글링 포인터를 예방하는 방법free(ptr);ptr = NULL;메모리가 해제된 후에는 포인터를 NULL로 설정하는 것이 좋다.free로 해제한 후 ptr을 NULL 바꾸기 전 주소의 값은 초기화되지 않고 그대..

C언어 2024.10.15

ISO 파일이란?

ISO 파일은 디스크 이미지 파일 형식이다. CD, DVD, 블루레이 디스크의 모든 내용을 하나의 파일로 압축한 형태이다. 파일 구조와 콘텐츠를 그대로 보존하여 디스크의 정확한 복제본 역할을 한다.ISO 파일은 .iso 확장자를 가지며, 가상 드라이브에 마운트 하거나 물리적 디스크로 굽지 않고도 사용할 수 있다. 예를 들어, 특정 소프트웨어 설치 프로그램을 ISO 파일로 제공하여 사용자들이 가상 드라이브에서 직접 설치할 수 있다. ISO 파일의 주요 특징디스크의 완전한 이미지: 디스크의 모든 데이터를 포함하여 파일 시스템 구조와 부트 정보를 유지한다.다양한 용도: 소프트웨어 설치, 백업, 디스크 복제 등 다양한 용도로 활용할 수 있다.부팅 가능: 운영체제 설치를 위해 부팅 가능한 USB나 DVD로 ISO..

CS 2024.10.14

[C언어] main문이란?

main 함수는 C 프로그램의 진입점(entry point)으로, 실행 시 가장 먼저 호출되어 프로그램의 전체 실행 흐름을 제어한다. 모든 C 프로그램에는 하나의 main 함수가 필수이며, 이 함수는 프로그램의 초기화, 주요 로직 수행, 종료 시 자원 해제 등을 담당한다. 또한 운영체제와의 상호작용을 통해 프로그램의 실행 종료 방식을 정의한다. main 함수의 역할프로그램의 시작점으로 초기화 작업과 주요 로직 수행을 담당한다.main 함수의 반환값은 운영체제에게 종료 상태를 전달하여, 후속 작업을 결정하는 데 사용된다.main 함수가 종료될 때 동적 메모리와 파일 디스크립터 등의 자원을 회수한다. 다양한 main 함수형태int main() / int main(void)int main(int argc, c..

C언어 2024.10.14

[C언어] static 키워드란?

\static 키워드는 C언어에서 변수와 함수의 저장 기간(Storage Duration)과 링크 특성(Linkage)을 제어하는 키워드이다. static 변수란?선언된 함수 내에서만 사용이 가능하며, 단 한 번만 초기화하여 프로그램이 종료될 때까지 메모리 공간에 존재한다.#include void counter() { static int count = 0; // static 변수는 함수가 종료되어도 값을 유지한다. count++; printf("Count: %d\n", count);}int main() { counter(); // 출력: Count: 1 counter(); // 출력: Count: 2 counter(); // 출력: Count: 3 return..

C언어 2024.10.11

[C언어] volatile 키워드란?

volatile은 C언어에서 변수의 값이 언제든지 변경될 수 있음을 컴파일러에 알려주는 키워드이다. 주로 MCU의 레지스터, 인터럽트에 의해 변경될 수 있는 변수, 다중 쓰레드 환경에서 사용된다. 최적화 방지를 위해 사용되며, 컴파일러가 불필요한 최적화를 하지 않도록 보장한다. 컴파일러는 코드의 속도를 위하여 코드 최적화를 수행한다.  #define control_register 0x7FFF*(unsigned int *)control_register = 0x0001;*(unsigned int *)control_register = 0x0004; 코드에서는 0x7FFF를 0x0001로 바꾸고 0x0004로 바꾼다. 결과적으로 0x0004로 바뀌기 때문에 컴파일러는 최적화를 위해0x0001로 바꾸는 작업을 무..

C언어 2024.10.11

[C언어] 구조체, 열거형, 공용체란?

C 언어에서는 데이터를 효율적으로 관리하고 코드를 읽기 쉽게 작성하기 위해 구조체(struct), 열거형(enum), 공용체(union)라는 세 가지 중요한 데이터 구조를 제공한다. 구조체 (struct)구조체(struct)는 서로 다른 데이터 타입을 하나의 단위로 묶어주는 역할을 한다. 구조체의 특징서로 다른 데이터 타입을 하나로 묶을 수 있다.구조체를 정의하고 나면, 이를 하나의 데이터 타입처럼 사용할 수 있다. 구조체 정의 방법struct 구조체이름 { 데이터타입 멤버1; 데이터타입 멤버2; ...};struct : 구조체를 정의하기 위한 키워드이다.구조체이름 : 구조체의 이름으로, 사용자가 자유롭게 지정할 수 있다.멤버 : 구조체가 포함하는 데이터 필드로, 서로 다른 데이터 타입의..

C언어 2024.10.10

[C언어] 쉬프트 연산과 비트 연산

쉬프트 연산이란?쉬프트 연산은 이진수의 비트를 좌우로 이동시키는 연산이다. 쉽게 말해서 숫자의 비트를 좌측이나 우측으로 밀어서 새로운 값을 만드는 연산이다.왼쪽 쉬프트(비트를 왼쪽으로 민다.왼쪽 쉬프트는 곱셈처럼 동작한다. a 는 a * (2^b)와 같은 결과가 나온다.오른쪽 쉬프트(>>)비트를 오른쪽으로 민다.오른쪽 쉬프트는 나눗셈처럼 동작한다. a >> b는 a / (2^b)와 같은 결과가 나온다. 쉬프트 연산의 활용 예시비트 마스크 생성: 특정 비트를 1로 설정하거나 0으로 클리어할 때 쉬프트 연산을 많이 사용한다. 예를 들어, 1 은 00001000이 돼서 네 번째 비트를 1로 만드는 데 사용할 수 있다.빠른 계산: 곱셈과 나눗셈 대신 사용할 수 있어서 속도 최적화에 도움이 된다. x * 4 대신..

C언어 2024.10.10

인터럽트(Interrupt)란?

인터럽트는 시스템에서 예기치 않은 이벤트가 발생했을 때, 현재 실행 중인 작업을 잠시 중단하고, 해당 이벤트를 처리하는 기능을 의미한다. 쉽게 말해 끼어들기이다. 인터럽트가 발생하면, CPU는 현재 상태를 저장하고 인터럽트 서비스 루틴(ISR)을 실행하여 해당 이벤트를 처리한 후, 다시 이전 작업으로 복귀한다. 이를 통해 시스템은 중요한 이벤트에 빠르게 반응할 수 있다. 운영체제(OS)에서의 인터럽트운영체제에서 인터럽트는 CPU가 외부 장치나 내부 이벤트에 즉각적으로 반응할 수 있도록 하는 중요한 메커니즘이다. 인터럽트를 통해 CPU는 외부의 요청(예: 키보드 입력, 마우스 클릭)이나 하드웨어 장치의 상태 변화를 빠르게 처리할 수 있다. OS에서의 인터럽트 종류하드웨어 인터럽트: 하드웨어 장치에서 발생하..

CS 2024.10.10

[C언어] (void *) 포인터란?

(void *)는 특정 데이터 타입에 제한되지 않은 '일반 포인터'입니다. 보통 포인터는 특정 타입을 가리키지만, void *는 어떤 타입의 메모리든 가리킬 수 있는 일종의 만능 포인터라고 생각하면 됩니다. 쉽게 말하면, 이 포인터는 "난 어떤 타입이든 가리킬 수 있어!"라는 느낌입니다. 이런 특성 덕분에 void *는 다양한 상황에서 유용합니다. 특히 메모리 할당 함수에서 자주 등장합니다. 예를 들어, malloc() 함수는 동적으로 메모리를 할당하는데, 이때 반환값으로 void * 타입을 리턴합니다. 그 이유는, 이 메모리를 어떻게 사용할지에 따라 타입이 달라질 수 있기 때문입니다.int *p = (int *)malloc(sizeof(int) * 10); 위 코드에서 malloc()은 void *를 ..

C언어 2024.10.10
728x90