라벨이 c/cpp인 게시물 표시

aligned malloc free 예제 코드

이미지
 원하는 단위로 정렬된 메모리를 할당하는 예제 코드이다. aligned malloc void * aligned_malloc(size_t size, size_t align) {      void *ptr = NULL;      void *aligned_ptr = NULL;      if (size == 0 || align & (align-1))      {           return (void*)0;      }      ptr = malloc(size+align);      if (!ptr)      {           return (void*)0;      }      memset(ptr,0,size+align);      aligned_ptr = (void*)(((size_t)ptr+align) & ~(align-1));      ((void **)aligned_ptr)[-1] = ptr;      return aligned_ptr; } aligned free void aligned_free(void *aligned_ptr) {      if (...

ARM NEON asm memcpy 코드

이미지
ARM NEON 어셈블리 코드를 이용한 memcpy 이다. D0~D7 레지스터를 사용하여 src 포인터의 데이터를 dest 포인터로 복사한다.  ARM NEON 레지스터 < 출처 :  https://developer.arm.com/documentation/dht0002/a/Introducing-NEON/NEON-architecture-overview/NEON-registers > memcpy  코드 void __attribute__ ((noninline)) memcpy_neon(void *dest, const void *src, size_t n) {    // r0 : dest    // r1 : src    // r2 : n    asm(    "_copy_inner_loop:\n"    " pld [r1,#0xC00]\n" // cache preload    " vldm r1!,{d0-d7}\n" // load r1 point data do d0-d7 neno register, size is 64*8 bits = 64 bytes. and increase r1 pointer.    " vstm r0!,{d0-d7}\n" // store d0-d7 register to r0(dest) pointer, and increase r0 pointer    " subs r2,r2,#0x40\n" // decrease size of remains to copy    " bgt _copy_inner_loop\n" // continue loop until complete    ); } 빌드 옵션에 -mfpu=neon 을 ...

OpenSSL인증서 시간 에러 해결 방법

OpenSSL을 사용하여 서버 연결시 인증서 유효 기간 체크 중 발생하는 에러의 해결 방법에 요약. #define X509_V_ERR_CERT_NOT_YET_VALID                   9 #define X509_V_ERR_CERT_HAS_EXPIRED                     10 1. 시스템 시간이 실 세계의 시간과 맞지 않아 발생할 수 있다.   인터넷 시간서버에서 시간 정보를 읽어와 시스템 시간을 동기화 한다.  2. 시스템 시간을 변경할 수 없는 경우 옵션 파라미터를 설정하여 해결할 수 있다. #define X509_V_FLAG_USE_CHECK_TIME              0x2 #define X509_V_FLAG_NO_CHECK_TIME               0x200000 void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t); int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, unsigned long flags); X509_VERIFY_PARAM_set_time를 사용하여 원하는 시간을 설정하여, 인증서 검사 때 설정된 시간을 사용할 수 있다. X509_VERIFY_PARAM_set_flags 함수로 X509_V_FLAG_NO_CHECK_TIME flag를 설정하면 인증서 시간 검사를 수행하지 않게 된다....

linux 개발 및 디버깅에 유용한 hexdump 로그 c 소스 코드

이미지
 로그 메시지만으로 개발 및 디버깅을 하는 경우 메모리 버퍼 내에 어떤 데이터가 들어있는지 눈으로 확인하면 편한 경우가 많다. 이럴 때 사용하면 좋은 예제 코드이다. #include <stdio.h> #include <ctype.h> #include <string.h> void hexdump(unsigned char *data, int len) {   int i = 0;   int str_i = 0;   char *hexdigits = "0123456789abcdef";   unsigned char str[67] = { 0, };   if (!data || len <= 0)   {   return;   }   memset(str, ' ', sizeof(str));   for (i = 0; i < len; i++)   {   str[str_i * 3] = hexdigits[data[i] >> 4];   str[str_i * 3 + 1] = hexdigits[data[i] & 0xf];           str[str_i * 3 + 2] = ' ';   str[50 + str_i] = isprint((int)data[i]) ? (char)data[i] : '.';           str_i++;           if (str_i == 16) ...

linux shell script (.sh)에서 파라미터 인자(argument) 간단 처리 방법

이미지
리눅스 쉘 스크립트(.sh)에서 인자(argument)을 입력 받아 처리하는 방법의 예는 다음과 같다. build.sh  #!/bin/bash if [ "$1" = "boot" ] ; then ./build_boot.sh exit 0 fi if [ "$1" = "kernel" ] ; then ./build_kernel.sh exit 0 fi build.sh에서 인자로 boot를 받으면 build_boot.sh을 수행하고, kernel을 인자로 받으면 build_kernel.sh를 수행한다. 스크립트 내에서 인자의 개수는 $#, 첫번째 인자는 $1, 모든 인자는 $@으로 표현된다. #!/bin/bash echo $# echo $1 echo $2 echo $@

리눅스에서 clock_gettime을 사용하여 gettickcount만들기

임베디드 리눅스에서 GetTickCount같은 함수를 만들 때 clock_gettime 을 사용하면 쉽게 만들 수 있다. #include <time.h> unsigned long GetTickCount() {      struct timespec tp;      clock_gettime(CLOCK_MONOTONIC,&tp);      return (unsigned long)(tp.tv_sec *1000 + tp.tv_nsec / 1000000); } clock_gettime을 사용하면 좀더 세밀한 시간 해상도를 가진 GetTickCount를 만들 수 있다. clock id는 CLOCK_REALTIME , CLOCK_MONOTONIC 등이 있다. 시스템 마다 clock id에 차이가 있을 수 있으니 사용전에 테스트해보고 사용하는 것이 좋다. clock의 해상도는 아래 코드를 사용하여 받아올 수 있다. struct timespec tp; clock_getres(CLOCK_MONOTONIC,&tp);

리눅스 소켓 등의 IO 시그널 sigio 처리

이미지
IO 시그널 처리  소켓, uart등의 io 시그널 처리방법은 아래와 같다.  #include <sys/signal.h> void sigio_handler(int status) { } struct sigaction saio; saio.sa_handler = sigio_handler; sigemptyset(&saio.sa_mask); saio.sa_flags = 0; saio.sa_restorer = NULL; sigaction(SIGIO,&saio,NULL); 1. 위 코드를 사용하여 IO 시그널이 발생할 때 호출될 함수를 등록한다. 2. IO 시그널이 발생하여 핸들러 함수가 호출되면 이벤트를 처리한다. Note: sigio처리는 thread가 아는 process에서 처리하도록 하자. [관련 포스트] 리눅스 Ctrl+C  및 종료 시그널 처리

리눅스 Ctrl+c 및 종료 시그널 처리

이미지
인터럽트 종료 시그널 처리  Linux application에서 인터럽트 종료 시그널 처리 예는 아래와 같다. #include <sys/signal.h> void sigint_handler( int signo) {     // } int main(int argc, char *argv[]) {     signal(SIGINT, sigint_handler);     signal(SIGTERM, sigint_handler);     ...     return 0; } 1. signal 함수를 통해 시그널 핸들러 함수를 등록한다. 2. 인터럽트가 발생하면 핸들러 함수가 호출된다. 3. 핸들러 함수에서 해당 인터럽트를 처리한다. 기타 종료 시그널 닫혀 있는 소켓에 데이터를 쓰면,SIGPIPE 시그널이 발생해 application이 종료된다. 이때 application이 종료되지 않도록 하려면 아래와 같은 코드를 추가하면 된다. signal(SIGPIPE, SIG_IGN);

간단한 makefile 만들기 예제

리눅스에서 make를 사용하여 빌드할 때 makefile에 정의된 컴파일/링크 규칙을 사용한다. 본 포스트에서는 간단하게 만들 수 있는 makefile 예제를 싣고 있다. 실행파일 만들기용 makefile .SUFFIXES : .c .o CC=gcc LIBS = -lm -lrt -lpthread -L./libpath INC = -I./include CFLAGS = -g -Wall $(INC) SRCS = main.c OBJS=$(SRCS:.c=.o) TARGET = test all : $(TARGET) $(TARGET) : $(OBJS)                          $(CC) -o $@ $(CFLAGS) $(OBJS) $(LIBS) clean :                     rm -rf $(OBJS) $(TARGET) core new :                      $(MAKE) clean                      $(MAKE)  CC= 컴파일에 사용할 컴파일러를 넣어준다. LIBS= 사용하는 lib를 넣어준다. INC= include 위치를 넣어준다. CFLAGS= 컴파일에 사용할 플래그를 넣어준다. SRCS= 컴파일할 소스를 넣어준다. TARGET= 실행파일 이름을 넣어준다. 정적 라이브러리 만들기용 m...

python crc32와 polynomial과 c로 구현한 crc32

python crc32 파이썬의 standard library에서 crc32를 지원한다. zlib.crc32와 binascii.crc32 두가지가 있다.  import binascii import zlib print('binascii.crc32(\'123456789\') = ',hex(binascii.crc32('123456789'.encode('UTF-8'))&0xffffffff)) print('zlib.crc32(\'123456789\') = ',hex(zlib.crc32('123456789'.encode('UTF-8'))&0xffffffff)) 입력데이터는 bytes-like object를 사용해야 하며, 위 코드의 결과는 아래와 같다.  binascii.crc32('123456789') =  0xcbf43926 zlib.crc32('123456789') =  0xcbf43926 온라인 사이트에서 crc32 계산 결과와 같다. https://www.lammertbies.nl/comm/info/crc-calculation

바로 프로젝트 적용 가능한 FIR Filter (low/high/band pass filter )를 c나 python으로 만들기

이미지
 band pass filter 코드가 필요해 인터넷을 검색을 해봤지만, 쓸 만한 코드와 자료가 별로 없어 그냥 만들어 쓰기로 했다. 필요한 공식은 위키피디아에 나와있다. https://en.wikipedia.org/wiki/Finite_impulse_response 1. filter 크기 FIR filter를 만들 때 filter의 크기(tpas의 크기)를 결정할 때 도움될 수식이 있다.   N=A㏈Fs / 22*Δf A㏈ : 감쇄될 db Fs : Sampling Frequency Δf : frequency bandwidth 출처 :  https://www.allaboutcircuits.com/technical-articles/design-of-fir-filters-design-octave-matlab/ def estimatefilterlen(fl,fh,fs,db):     N = int(np.round(db * fs / (22 * (fh-fl)))-1)     return N 2. Low Pass Filter [ python code ] def lowpassfilter(f,fs,N):     taps = np.zeros(N)          fc = f / fs     omega = 2*np.pi*fc     middle = int(N/2)     for i in range(N):         if i == middle:             taps[i] = 2*fc         else:    ...

간단한 무손실 압축 run-length encoding 예제 소스

이미지
데이터 압축은 보통 (데이터) 손실 압축과 무손실 압축으로 구분할 수 있다. 일반적인 이미지 압축인 jpeg은 손실 압축에 속하고, 파일 압축에 사용하는 zip같은 경우는 무손실 압축에 속한다. 무손실 압축중에 가장 간단한 것이 run-length encoding(RLE)이다. run-length encoding은 아래 예와 같이 중복된 데이터를 없애 데이터를 압축한다. 원본 : 0 0 0 1 1 0 0 0 0 0 1 1 1 1    (data size:14)  RLE : 0 3 1 2 0 5 1 4                    (data size:8) 원본에서 순서대로 0은 3개, 1은 2개, 0은 5개 1은 4개로 표시하는 방식이다.  하지만, 이런 방식때문에 경우에 따라선 데이터 양이 늘어나는 단점 이 있다. 중복되 데이터가 없는 겨우 아래의 예처럼 RLE 한 데이터 양이 원본보다 크게 되는 경우가 있다. 원본 : 1 0 1 0 1                                   (data size : 5)  RLE : 1 1 0 1 1 1 0 1 1 1                    (data size : 10) 이런 단점이 있어도 특정 경우에 예를 들어 메모리가 적고, RTOS 구동중인 프로세서에 GUI를 구현해야 할 때 요긴하게 사용할 수 있다. RLE의 encoder/decoder의 소스는 아래와...

bitmap 이미지를 배열 형태의 c/c++ header로 만드는 소스

이미지
이미지 디코더도 없고, RTOS가 사용된 프로세서에서 GUI구성을 위해 만들었던 소스다.  24bit bitmap 파일을 읽어 이미지 부분을 아래와 같은 형태로 만들어준다. unsigned short icon_joystick[] = { 48, 48,  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,   ... 중략 ... 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,  0x0000, 0x0000, 0x0000, 0x0000  };  배열의 첫번째와 두번째 데이터는 이미지의 width, height다. 이미지의 픽셀 데이터는 RGB16형태로 저장했다. [사용법] > bmp2header [bmp file path] ... bmp 파일은 여러개 사용가능하다. 실행하면 icon.h이 생성된다. [source code] /*=========================================================     INCLUDE =========================================================*/ #include <stdio.h> #include <stdarg.h>...

md5 예제 c 소스

이미지
본 포스트는 데이터 무결성 검사에 많이 사용되는 md5 예제 c 소스를 싣고 있다. md5 128bits 암호화 hash함수로, rfc1321( https://www.ietf.org/rfc/rfc1321 )로 지정되어 있다. 암호화 함수이지만, md5의 암호화에 결함이 발견되어 사용되지 않는다고 한다. (위키백과  https://ko.wikipedia.org/wiki/MD5 참조) 아래의 md5 c 소스 코드는 위키백과의 md5 문서와 rfc1321을 참조해 구현하였다. rfc1321의 소스 코드와는 다른 코드이다.  API int md5_reset( md5_t * ctx ); - md5 데이터 구조체를 초기화하는 함수, 최초 이 함수를 호출해야 한다. int md5_update( md5_t * ctx , char * msg , int msg_len ); - msg 데이터를 512bits단위로 잘라 hash를 업데이트 한다. 큰 데이터를 여러 번 나눠 호출해도 되도록 처리했다.  int md5_getdigest( md5_t * ctx , unsigned char digest [16]); - 처리 안된 나머지 데이터를 512bits가 되도록 아래 형태를 만들어 md5 hash 코드 업데이트한 후, hash 코드를 digest 변수에 넣어 반환한다.    "버퍼에 남은 데이터 + 0x80 + padding + 데이터 bits 사이즈(64bits 크기로) " md5 c 소스 코드 /*======================================================= INCLUDE ================================================...

Eigen 라이브러리 matrix 사용법

이미지
본 글은 eigen 라이브러리의 matrix 간단한 사용법에 관한 글을 싣고 있다. Eigen 라이브러리는 http://eigen.tuxfamily.org/ 에서 다운받아 사용할 수 있다. 별도의 라이브러리 빌드 없이 헤더만 불러와 사용할 수 있어 편리하다. 개인적으론 opencv의 Mat보다 Eigen의 Matrix가 사용하기 편한 것 같다. 라이브러리 경로 project 설정 추가 다운받은 라이브러리 파일은 압축해제 후 project 설정에서 경로만 추가하면 된다. 라이브러리 헤더  #include <Eigen/Dense> namespace  아래와 같이 Eigen namespace를 사용하도록 설정하던가, 아니면, 호출 때 마다 Eigen::을 사용하면 된다.  using namespace Eigen; matrix 데이터 형식  Matrix 타입의 맨 뒤는 matrix내 데이터의 형식을 의미한다. EIGEN_MAKE_TYPEDEFS_ALL_SIZES(int,                  i) EIGEN_MAKE_TYPEDEFS_ALL_SIZES(float,                f) EIGEN_MAKE_TYPEDEFS_ALL_SIZES(double,               d) EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<float>,  cf) EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<double>, cd) matrix 타입 Eigen의 matrix 타입은 고정 사이즈와 가변 사이즈 두가지가 있다. 아래는 두 타입을 비교한 코드다. Dynamic-Size의 matrix타입은 사용시 ...