본문 바로가기

전체 글67

Rocky Linux(로키 리눅스)에서 한글 입력 설정 Rocky Linux에서 한글 입력이 안 될때 다음의 방법으로 한글을 추가할 수 있음. ** 전제: 현재 계정(user-name)에서 sudo 명령 실행할 수 있어야 함. 1. 권한이 없다면 root 권한이 있는 사용자 계정으로 로그인해서user-name 계정을 wheel 그룹에 추가. # wheel 그룹에 추가sudo usermod -aG wheel 'user-name' 2. user-name 계정으로 다시 로그인해서 터미널에서 다음 확인groups # wheel 이 보이면 OKsudo -v # 비번 묻고 통과하면 OKsudo whoami # root 출력되면 완료 3. 다음 명령 순서대로 입력 (sudo 명령 실행 권한이 .. 2025. 10. 3.
[ATmega328P] 레지스터: I/O 주소와 데이터 주소 이해하기 MCU 프로그래밍을 할 때 데이터시트를 보면 같은 레지스터에 두 가지 주소가 붙어있는 걸 볼 수 있다. 하나는 I/O 주소, 다른 하나는 데이터 주소다. I/O 주소ATmega328P에는 64바이트짜리 작은 공간이 있다.여기에 PORTB, DDRB, PINB 같은 하드웨어 제어 레지스터가 배치돼 있다.이 공간의 주소를 I/O 주소라고 부른다.이 영역은 CPU의 특수 명령어 IN, OUT, SBI, CBI 같은 걸로 접근할 수 있다.장점은 빠르다는 것. 1클럭에 입출력을 처리할 수 있다. 데이터 주소동시에, 똑같은 레지스터들이 SRAM 공간에도 매핑돼 있다.이게 데이터 주소다.예를 들어 PORTB의 경우:I/O 주소: 0x05데이터 주소: 0x25데이터 주소로 접근할 때는 LDS, STS 같은 일반 메모리.. 2025. 10. 1.
[ATmega328P] 레지스터 직접 제어 방식으로 프로그래밍 해보기 이번 포스팅에서는 ATmega328P 마이크로컨트롤러를 레지스터 직접 제어 방식으로 프로그래밍하는 방법에 대해서 알아본다. 레지스터 방식은 Arduino IDE에서 사용하는 digitalWrite() 같은 함수 호출 방식보다 더 효율적이고 하드웨어에 가깝게 제어할 수 있다. 💡 레지스터란?레지스터는 마이크로컨트롤러 내부에 있는 매우 빠른 임시 저장 공간이다.ATmega328P에서는 특정 기능을 제어하기 위해 여러 레지스터를 사용한다.아래 예시 프로그램에서는 포트의 입출력 방향을 설정하는 DDRB 레지스터와, 포트의 출력 상태를 제어하는 PORTB 레지스터를 사용한다. 예시: ATmega328P의 PB5 핀에 연결된 LED를 1초 간격으로 깜빡이는 프로그램#define F_CPU 16000000UL#in.. 2025. 9. 29.
[메모리] 엔디언(Endianness)과 포인터 캐스팅(casting) 이번 포스팅에서는 메모리 주소와 관련된 개념인 엔디언과 포인터 캐스팅에 대해 다루어 보려고 합니다.1. 엔디언(Endianness)이란?컴퓨터 메모리는 바이트(byte) 단위로 구성되어 있습니다.int와 같은 여러 바이트로 이루어진 데이터 타입을 메모리에 저장할 때, 바이트들의 순서를 정하는 방식이 바로 엔디언입니다.엔디언에는 크게 두 가지 방식이 있습니다.빅 엔디언(Big Endian): 가장 큰 바이트(최상위 바이트)를 가장 작은 주소에 저장하는 방식입니다. 사람이 숫자를 읽는 방식과 유사해 직관적입니다.리틀 엔디언(Little Endian): 가장 작은 바이트(최하위 바이트)를 가장 작은 주소에 저장하는 방식입니다. 대부분의 x86 아키텍처(인텔, AMD 등)가 이 방식을 사용합니다.예) 16진수 .. 2025. 9. 14.
[C] 2차원 배열의 포인터 연산으로 메모리 주소값 찾기 이번 포스팅에서는 C언어에서 2차원 배열과 메모리 주소와의 관계에 대해 알아보고, &, *, + 같은 포인터 연산자가 어떻게 동작하는지 예제를 통해 자세히 뜯어보려고 한다.포인터를 잘 이해하면 임베디드의 핵심인 메모리를 잘 다루는 데 도움이 된다고 하니 잘 익혀두는 것이 좋겠다. 우선 다음의 2행 3열의 배열의 각 요소들이 메모리에 어떤 순서로 저장되는지 살펴보자. int main(void){ int a[2][3] = {{0, 1, 2}, {3, 4, 5}};} 먼저, int a[2][3] = {{0, 1, 2}, {3, 4, 5}}; 배열의 메모리 구조를 이해하는 것이 중요하다.C 언어에서 2차원 배열은 행(row) 우선으로 메모리에 연속적으로 저장된다.int의 크기가 4바이트이므로, 각 요소의 주소.. 2025. 9. 14.
[자료구조] 스택(stack)을 이용하여 중위 표기식을 후위 표기식으로 변환해보자 프로그래밍 언어나 컴파일러 이론을 공부하다 보면 후위 표기식(Postfix notation)이라는 개념이 자주 등장하는 것을 볼 수 있습니다. 컴퓨터가 수식을 계산하는 방식은 우리가 흔히 사용하는 중위 표기식(Infix notation)과는 조금 다릅니다. 중위 표기식은 연산자가 피연산자 사이에 위치해 있어 사람에게는 직관적이지만, 컴퓨터가 처리하기 위해서는 연산자 우선순위와 괄호 등을 복잡하게 고려해야 하죠.이러한 문제를 해결하기 위해 사용되는 것이 바로 후위 표기식(Postfix notation)입니다. 후위 표기식은 연산자가 피연산자 뒤에 위치하며, 괄호가 필요 없고 연산자 우선순위를 고려하지 않고도 순서대로 계산할 수 있다는 장점이 있습니다. 그렇다면 중위 표기식을 후위 표기식으로 어떻게 변환할까.. 2025. 9. 12.
아두이노에서 어떤 정수 타입을 써야 할까? 데이터 타입 비교표 한 눈에 보기 아두이노 코드를 보다 보면 uint8_t, uint16_t, uint32_t 같은 낯선 타입이 자주 등장한다.uint8_t, uint16_t, uint32_t가 무슨 뜻인지, 아두이노 기본 타입과 어떻게 대응되는지, 그리고 어떤 상황에 어떤 타입을 써야 하는지 알아보자. 1. 읽는 방법uint32_t를 예로 들면:uunsigned (부호 없음, 0 이상)int정수(integer)32비트 수 (32비트 = 4바이트)_ttype (자료형) 2. Arduino 기본 타입과 1:1 대응표고정폭 타입 (stdint.h)Arduino 기본 타입크기(byte)값 범위부호uint8_tbyte10 ~ 255부호 없음int8_tchar1-128 ~ 127부호 있음uint16_tunsigned int20 ~ 65,535부호.. 2025. 8. 13.
[아두이노] millis() 타이머 함수로 진동모터와 LED 동시에 작동시키기 지난 포스팅에서 PWM을 적용해서 LED에 페이드 인 & 페이드 아웃 효과를 주는 방법에 대해 알아보았다. 이번에는 진동 모터(vibration motor) 기능을 추가하여 LED가 페이드인/아웃 하는 동시에 진동이 같이 울리는 프로그램을 구현해 보려고 한다. 우선 여기서 중요한 것이 LED와 진동모터 두 가지 작업을 어떻게 동시에 비동기적으로 처리하느냐가 될 것이다. 아두이노 프로그램은 기본적으로 loop() 함수 안의 코드를 매우 빠르게 반복 실행한다.만약 특정 동작(예: LED 켜기/끄기, 센서 값 읽기)을 일정 시간 간격으로 실행하고 싶다면 어떻게 해야 할까? 가장 간단하게 생각할 수 있는 방법은 delay() 함수를 사용하는 것이다.예를 들어, delay(1000); 를 사용하면 1초 동안 프.. 2025. 7. 27.
아두이노 스케치를 작성하다가 loop()함수에 대해 생긴 의문...그리고 답 최근에 소프트웨어 경진대회 프로젝트를 하다가 진동 모터를 하나 얻어오게 되었다.진동 모터를 가지고 어떤 실습을 해볼까 하다가, 아두이노에 진동 모터, LED, 버튼을 연결하여 버튼을 한 번 눌렀다 떼면 3초 동안 LED가 밝아졌다가 어두워지면서 동시에 진동 모터가 울리는 프로그램을 만들어 보기로 했다. 그런데 한 가지 의문이 생겼다. 아두이노 프로그램은 기본적으로 초기 설정을 하는 setup() 함수가 한 번 실행된 후에는 loop() 함수를 무한 반복 실행한다. 그런데 바로 그 '반복 실행'이라는 점이 약간 이해가 되지 않았다. 내가 지금 만들고자 하는 프로그램은 버튼을 한 번 릴리즈하면 진동과 LED가 3초 동작하고 끝나는 프로그램으로, 반복 동작이 없다.그런데 이걸 왜 setup() 함수가 아닌 .. 2025. 7. 27.