전체 글 35

[C 언어] 비트필드 구조체에 대해 알아보자

설 명절날 시골에 내려와 오늘은 어떤 글을 올릴까 고민을 하다가 비트필드 구조체에 대해 적어보기로 했다. (PC로 코드 검증이 필요 없는 것을 고민하다 나온 결론) IoT 또는 통신 분야 관련된 Firmware를 개발하다보면 data frame이라는 단어를 많이 마주치게 된다. 위의 그림은 BLE data frame중 하나이다. 위 그림은 많은 통신 분야 또는 chip register를 컨트롤할 때 많이 보게 되는데, 일정한 용량 안에 최대한 많은 데이터 의미를 넣기 때문에 bit 단위로 의미를 부여하게 된다. 예를 들어 위 그림에서 LL Ovhd를 코드로 해석할 때 아래와 같은 부분을 사용할 수 있다. 1 2 3 4 5 6 7 int main(void){ unsigned short length; uns..

C언어 2023.01.21

[C 언어] 데이터 타입의 형 변환 (2)

오늘은 데이터 형변환에 관련된 이야기를 추가로 해보려 한다. 먼저 아래 코드를 보자. 1 unsigned short val = -1; cs 이것은 정상일까 에러일까? 정답은 정상코드이다. 개발자의 흔한 오해중 하나가 unsigned 라는 단어를 보면 음수는 절대로 들어갈 수 없다고 생각한다는 것이다. 사실 음수는 변환 과정이 필요한 것 뿐이지 별다른 의미를 품고 있지는 않다. (음수 변환 과정에 대해서는 2의 보수 방법(bit 반전 후 더하기 1) 참조) 따라서 위의 코드는 val에 0xFFFF가 담겨 있는 의미로 해석된다. 그럼 아래 코드를 살펴보자 1 2 unsigned short val = -1; signed short val2 = -1; cs val과 val2 모두 -1이 들어있다. 이 값은 같은..

C언어 2023.01.20

[C 언어] [Embedded] 메모리 동적 할당에 대해 (2)

오늘은 지난글에 이어 Embedded system에서 메모리 동적할당을 대체하여 사용가능한 기법에 대해 적어보려 한다. 먼저 지난 포스팅에서 말한 동적할당의 리스크는 아래와 같다. 1. 동적할당의 리스크 1. 메모리 할당 실패에 따른 예외처리 - malloc을 이용했을 때 NULL pointer를 반환받았을 경우 2. 디바이스 속도 저하 - malloc에 의한 코드 동작 속도 저하로 잠재적 품질 리스크 발생 3. 메모리 공간 예측 실패 - malloc으로 할당시 관리 테이블로 인해 할당받은 메모리보다 더 많은 점유로 인해 메모리 부족 현상 발생 2. 대체가능한 기법들 위의 리스크를 줄일 수 있는 기법들을 몇가지 소개하려 한다. 이러한 기법들은 내가 실제로 개발하면서 적용해본 것도 있고, 전문 서적 또는 ..

Embedded 2023.01.19

[C 언어] [Embedded] 메모리 동적 할당에 대해 (1)

지난번 Embedded환경에 대한 간략한 설명과 함께 Endian mode와 컴파일러 최적화 오류 등에 대해 알아보았다. 오늘은 Firmware 개발자라면 누구나 쉽게 사용하고 있는 동적할당에 대해 몇가지 적어보려고 한다. 1. 동적할당이란? 먼저 동적할당이라는 개념부터 간단히 설명해보려 한다. 프로그래밍을 하다보면 데이터를 임시로 저장하거나 다른 이벤트의 인수로 데이터를 넘겨야 하는 경우가 있다. 데이터의 크기를 미리 알 수 없는 경우가 대부분이고 여러 조건에 따라 데이터의 크기와 유효범위가 달라질 수 있다. 아래 코드를 보자 (억지로 예제를 만든 것이니 참고만 하길) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #define SIZE 10 int func1(v..

Embedded 2023.01.17

[IoT] ZigBee에 대해서

오늘은 IoT 통신 방법중에 ZigBee(지그비)에 대해서 적어보려고 한다. 대학교 다닐때 프로젝트로 태권도 호구를 만들기 위해 처음 ZigBee 통신 방법에 대해 접해 보았었고, 그 당시에는 ZigBee 디바이스가 많지 않아서 상당히 비싼 디바이스를 사용했던 기억이 있다. 최근에는 IoT가 대중화 되면서 ZigBee 디바이스의 가격이 상당히 낮아졌고 스마트 홈을 위해 구매해볼만 하다고 생각한다. 1. ZigBee 통신은 무엇인가? 간단히 말하자면 표준화가 잘 된 무선통신이라고 할 수 있다. 복잡하게 말하자면 IEEE 802.15.4 표준의 PHY와 MAC을 사용하고 그 위에 NWK, APS를 올리고 ZCL, ZDO 레이어를 통해 정의된 데이터를 주고 받는 통신이라고 할 수 있다. 물론 이렇게 적으면 무..

IoT 2023.01.17

[C 언어] 데이터 타입 2번째

지난번 데이터 타입에 관련된 내용은 사실상 형 변환(타입 변경)에 집중된 내용이었다. 그래서 데이터 타입에 관해 좀 더 집중적으로 적어보고자 이 포스팅을 준비했다. 다소 지루하거나 이미 알고 있는 내용일수도 있으나 꽤 중요한 부분이니 복습한다는 의미로 봐주길 바란다. 1. 정수형 데이터 타입의 종류 C언어에서 정의된 데이터 타입은 아래와 같다. (32bit 기준) type size(byte) min max char 1 0 127 signed char 1 -127 127 unsigned char 1 0 255 signed short 2 -32767 32767 unsigned short 2 0 65535 signed int 4 -2147483647 2147483647 unsigned int 4 0 42949..

C언어 2023.01.14

[C 언어] [Embedded] Endian mode

PC를 기반으로 C 언어를 사용하는 사람은 크게 상관 없지만 Embedded를 하는 사람이라면 반드시 알고 있어야 하는 Endian mode라는 것에 대해 오늘 알아보고자 한다. 1. Endian mode 이것은 데이터가 어떻게 메모리에 저장되는지를 나타내는 방식이다. 쉽게 생각해서 메모리를 기차라고 비유한다면 위 그림처럼 사람들을 기차에 어떤 방향으로 순서대로 태울지에 관한 정의라고 보면 된다. 대부분의 시스템에서는 Little endian mode를 사용하지만 대표적으로 모토롤라의 경우 Big endian mode를 사용한다. 2. Endian mode를 왜 신경써야 하는가? Endian mode를 신경써야 하는 이유는 위그림을 기준으로 설명해보자면, A~D까지의 사람이 T1이라는 기차에 탄 것은 동..

Embedded 2023.01.14

[C 언어] [배열] 배열 기초

C 언어에서 많이 쓰는 자료구조 중 하나가 바로 배열이다. 모두가 아는 배열에 대한 이야기를 하려는건 아니니 끝까지 잘 읽어보길 추천드린다. 1. 배열 배열이란 같은 자료형의 묶음이라고 보면 된다. 마치 비엔나 소시지 같은 모양이라고 보면 된다. 같은 자료형이 묶여 있기 때문에 시작점을 알면 끝까지 연속적으로 이어져 있는 특징이 있다. 그런데!! 초보자가 많이 실수하는 부분이 여기에 있다. 사진처럼 배열은 비엔나 소시지 묶음으로만 이해하기 때문에 몇가지 문제가 발생하게 된다. 1 2 3 4 5 6 7 8 9 10 11 12 char arr[10]; void print_arr_size(char arr[]){ printf("array size : %d\n", sizeof(arr)); } int main(vo..

C언어 2023.01.13

[IoT][SmartHome] 기본

오늘은 IoT에 대해 기본적인 설명을 해보려고 한다. 내가 체감하기로 IoT가 우리 실생활에 다가온지 벌써 5년정도 된 것 같다. 물론 그 이전부터 IoT라는 용어와 디바이스는 있었지만 생태계가 활성화되어 일반 유저가 체감되기까지는 상당히 오래 걸린 것 같다. 그럼 이런 저런 가볍운 얘기를 해보면서 IoT에 대해 알아보자. 1. IoT 란? IoT - 사물인터넷 이라는 용어는 누구나 들어봤을 것 같다. 나는 이 용어가 마음에 들지 않는다. 사물인터넷이란 용어는 즉각적으로 와닿지도 않고 실제로 정확히 맞지도 않다. IoT를 간단하게 말하자면 내 주변의 기기를 시간과 공간에 제약되지 않고 제어 또는 접근할 수 있다로 표현할 수 있을 것 같다. 즉, 내가 정한 규칙에 따라 자동으로 공기청정기나 에어컨, 가습기..

IoT 2023.01.12

[C 언어] sizeof 연산자에 대하여

내가 firmware 개발을 처음 했을때 sizeof 연산자에 대해 잘못 알고 사용하여 디버깅을 했던 케이스가 생각나 이 포스팅을 하게 되었다. sizeof에 대해 제대로 알고 있는지 스스로 한번 점검해보는 기회가 되면 좋을 것 같다. 1. sizeof 의 정체 1 2 3 4 int a; printf("%d\n", sizeof(a)); printf("%d\n", sizeof a); cs sizeof를 함수로 잘못 알고 쓰는 사람들이 꽤 많다. 위의 코드에서 sizeof(a)로 사용하는 케이스가 많다보니 기존 코드를 재사용하여 습관적으로 사용하는 사람들은 라이브러리 함수로 오해를 한다. 그러나 sizeof는 ++ -- * 등과 같은 연산자이기 때문에 연산자 우선순위의 법칙에 영향을 받고 위 코드와 같이 (..

C언어 2023.01.11
728x90