Journey to CS 98

[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바이트이므로, 각 요소의 주소..

[자료구조] 스택(stack)을 이용하여 중위 표기식을 후위 표기식으로 변환해보자

프로그래밍 언어나 컴파일러 이론을 공부하다 보면 후위 표기식(Postfix notation)이라는 개념이 자주 등장하는 것을 볼 수 있습니다. 컴퓨터가 수식을 계산하는 방식은 우리가 흔히 사용하는 중위 표기식(Infix notation)과는 조금 다릅니다. 중위 표기식은 연산자가 피연산자 사이에 위치해 있어 사람에게는 직관적이지만, 컴퓨터가 처리하기 위해서는 연산자 우선순위와 괄호 등을 복잡하게 고려해야 하죠.이러한 문제를 해결하기 위해 사용되는 것이 바로 후위 표기식(Postfix notation)입니다. 후위 표기식은 연산자가 피연산자 뒤에 위치하며, 괄호가 필요 없고 연산자 우선순위를 고려하지 않고도 순서대로 계산할 수 있다는 장점이 있습니다. 그렇다면 중위 표기식을 후위 표기식으로 어떻게 변환할까..

아두이노에서 어떤 정수 타입을 써야 할까? 데이터 타입 비교표 한 눈에 보기

아두이노 코드를 보다 보면 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부호..

[아두이노] millis() 타이머 함수로 진동모터와 LED 동시에 작동시키기

지난 포스팅에서 PWM을 적용해서 LED에 페이드 인 & 페이드 아웃 효과를 주는 방법에 대해 알아보았다. 이번에는 진동 모터(vibration motor) 기능을 추가하여 LED가 페이드인/아웃 하는 동시에 진동이 같이 울리는 프로그램을 구현해 보려고 한다. 우선 여기서 중요한 것이 LED와 진동모터 두 가지 작업을 어떻게 동시에 비동기적으로 처리하느냐가 될 것이다. 아두이노 프로그램은 기본적으로 loop() 함수 안의 코드를 매우 빠르게 반복 실행한다.만약 특정 동작(예: LED 켜기/끄기, 센서 값 읽기)을 일정 시간 간격으로 실행하고 싶다면 어떻게 해야 할까? 가장 간단하게 생각할 수 있는 방법은 delay() 함수를 사용하는 것이다.예를 들어, delay(1000); 를 사용하면 1초 동안 프..

아두이노 스케치를 작성하다가 loop()함수에 대해 생긴 의문...그리고 답

최근에 소프트웨어 경진대회 프로젝트를 하다가 진동 모터를 하나 얻어오게 되었다.진동 모터를 가지고 어떤 실습을 해볼까 하다가, 아두이노에 진동 모터, LED, 버튼을 연결하여 버튼을 한 번 눌렀다 떼면 3초 동안 LED가 밝아졌다가 어두워지면서 동시에 진동 모터가 울리는 프로그램을 만들어 보기로 했다. 그런데 한 가지 의문이 생겼다. 아두이노 프로그램은 기본적으로 초기 설정을 하는 setup() 함수가 한 번 실행된 후에는 loop() 함수를 무한 반복 실행한다. 그런데 바로 그 '반복 실행'이라는 점이 약간 이해가 되지 않았다. 내가 지금 만들고자 하는 프로그램은 버튼을 한 번 릴리즈하면 진동과 LED가 3초 동작하고 끝나는 프로그램으로, 반복 동작이 없다.그런데 이걸 왜 setup() 함수가 아닌 ..

아두이노에 PWM을 적용해서 LED에 페이드 인 & 페이드 아웃 효과 주기

알다시피 디지털 신호는 켜짐(HIGH)과 꺼짐(LOW) 딱 두 가지 상태만 가진다. 그런데 LED를 서서히 밝히거나 어둡게 하고 싶다면 어떻게 해야 할까? 마치 아날로그 신호처럼 부드러운 밝기 조절이 필요할 때, 바로 PWM(Pulse Width Modulation), 즉 펄스 폭 변조가 그 솔루션이 될 수 있다. PWM은 디지털 신호를 아날로그처럼 활용하는 기술이다.PWM 개념PWM은 일정한 주기를 가진 펄스 신호를 사용한다. 이 주기 안에서 신호가 켜져 있는 시간의 비율을 듀티 사이클(Duty Cycle)이라고 부른다.듀티 사이클이 높으면: 켜져 있는 시간이 길어져 평균 전압이 높아진다.듀티 사이클이 낮으면: 켜져 있는 시간이 짧아져 평균 전압이 낮아진다.이때 펄스가 너무 느리게 켜지고 꺼지면 장치가..

ESP32 시뮬레이터 - WOKWI 소개

오늘은 아두이노와 비슷하면서도 몇 가지 부가 기능을 더 갖춘 ESP32에 대해서 간략하게 설명하고, ESP32 보드를 웹에서 (일부) 무료로 시뮬레이션 해볼 수 있는 사이트를 소개하려고 한다. ESP32란? ESP32는 Espressif Systems에서 개발한 마이크로컨트롤러 보드로, Wi-Fi와 Bluetooth 기능이 내장되어 있어 IoT 프로젝트에 많이 사용된다. 저전력으로 동작하며 가격이 저렴하고, 다양한 센서 및 액추에이터와 쉽게 연동할 수 있어 스마트홈, 환경 모니터링, 원격 제어 시스템 등에 적합하다.개발은 Arduino IDE나 PlatformIO 같은 환경에서 진행할 수 있고, C나 C++를 기반으로 동작한다. ESP32는 아두이노처럼 사용할 수 있지만, 내장 무선통신, 높은 클럭 ..

[아두이노] 푸시버튼을 적용한 S.O.S 신호 점멸 구현

어제 우리 프로젝트 팀의 첫 오프라인 미팅이 있었다. 플젝 진행 방향에 대한 논의가 끝나고 잠시 남아서 리더님에게 아두이노 푸시버튼 연결을 좀 도와달라고 했다. 지난 글에서 아두이노 내장 LED로 S.O.S 신호 깜빡이기 실습을 했는데, 이 때 사실 원래 목표는 루프로 계속 돌리지 않고, 버튼을 한 번 눌렀다 떼면 S.O.S 신호가 한 차례 점멸하도록 하는 것이었다. 그런데 브래드보드에 푸시버튼과 점퍼와이어를 연결하는 방법을 제대로 몰라서 결국 이렇게 저렇게 시도하다가 포기했었는데, 어제 드디어 프로젝트 미팅에 가서 성공시켰다. (내가 한 건 아니고 리더님이 해주셨지만... ㅎㅎ) 우선 가장 중요한 회로를 다시 복기해 보도록 한다. 지난 포스팅에서 소개했던 팅커캐드를 이용해서 회로를 깔끔하게 정리해 보..

아두이노 내장 LED로 S.O.S 구조 신호 깜빡이게 만들어 보기

3주동안 나의 체력을 무지막지하게 갉아먹었던 기말시험이 드디어 끝났다. 시험이 끝난 기념으로 드디어 한 달 전에 산 아두이노 보드를 꺼내서 실제로 작동을 시켜보기로 했다. 어떤 프로그래밍을 해볼까 하다가, 모스 부호를 이용해서 SOS 신호를 만들어 보기로 했다. "따따따 따-따-따- 따따따" 지금 파이브북스에서 찰스 펫졸드의 를 읽고 있는데, 거기 모스부호에 대한 이야기가 나온다. 모스부호야 말로 1과 0 그 자체, 컴퓨터의 근본이 아니던가? 원래는 아두이노 주문할때 패키지로 딸려온 푸시버튼, 브래드보드, 와이어 등을 사용해서 버튼을 누르면 SOS 신호를 점멸하도록 만들려고 했는데, 무슨 이유에서인지 한 시간을 씨름을 했는데 스위치가 인식이 안 되었다. 방법은 나중에 차차 생각해 보기로 하고, 오늘은 ..

[DBS] 트랜잭션 - Part3. 타임스탬프 기반 트랜잭션 동기화 규약

🕒 타임스탬프 기반 규약이란?타임스탬프 기반 규약은 데이터베이스 시스템에서 여러 트랜잭션이 동시에 실행될 때 충돌 없이 안전하게 작동하도록 해주는 규칙이다.이 규약은 각 트랜잭션과 데이터 항목에 타임스탬프를 부여하고, 이 타임스탬프를 기준으로 읽기(Read)나 쓰기(Write) 연산의 허용 여부를 판단한다. 타임스탬프 설정TS(Ti): 트랜잭션 Ti가 시작될 때 부여받는 타임스탬프. 값이 작을수록 먼저 시작된 트랜잭션이다.각 데이터 항목 A는 다음과 같은 정보를 가진다:R-TS(A): 지금까지 A를 읽은 트랜잭션 중 가장 큰 타임스탬프 (가장 최근에 A를 읽은 트랜잭션의 TS)W-TS(A): 지금까지 A를 쓴 트랜잭션 중 가장 큰 타임스탬프 (가장 최근에 A를 쓴 트랜잭션의 TS)Read(A) 규칙트랜..