WORK/Sotfware

[Memory Copy][Memory Set] C 언어를 이용한 메모리 저장 소스

KANG Stroy 2023. 1. 18. 11:29
728x90
728x90

메모리를 저장하기 위해서는 특정 함수를 사용하기도 합니다. 

이런 함수를 사용하지 못할때를 대비해서 간단하게 함수를 적용하여 사용할 수 있습니다. 

define을 이용해서 쉽게 접근 할 수 있습니다. define을 이용한 함수를 매크로 함수라고 합니다. 

매크로 함수란?
C언어에서는 #define 선행처리 지시문에 인수로 함수의 정의를 전달함으로써, 함수처럼 동작하는 매크로를 만들 수 있습니다. 이러한 매크로를 함수 같은 매크로(function-like macro) 또는 매크로 함수라고 합니다.

매크로 함수를 사용할때는 주의 사항을 반드시 숙지하시고 사용하시기 바랍니다. 

참조 : http://www.tcpschool.com/c/c_prepro_macroFunc 

 

Memory Copy는 Dest 에 Src 를 저장하는 방법 입니다. Src --> Dest 으로 메모리를 저장합니다. 일반적인 함수를 쓰게 되면 어떻게 동작하는지 잘 모르게 됩니다. 

#define UTIL_MEMCPY8( dest, value, size )   UTIL_MEMCPY_8( dest, value, size )
static void (*Dest[2])( void );

(void) UTIL_MEMCPY_8(void *dst, uint8_t *src, uint16_t size)
{
    (uint8_t *) dst8 = (uint8_t *) dst;
    (uint8_t *) src8 = (uint8_t *) src;
        
    while(size--) 
    {
         *dst8++ = *src++; // dst8,src8 이 증가 하면서 메모리에 저장 
    }
}
memcpy 함수의 인자인 source 가 가리키는 곳 부터 num 바이트 만큼을 destination 이 가리키는 곳에 복사한다. 이 때, destination 과 source 의 타입은 모두 위 함수와 무관하다. 왜냐하면 이 함수는 단순히 이진 데이터를 복사하는 것이기 때문이다.
또한, 이 함수는 source 의 널 종료 문자(null terminating character) 을 검사하지 않는다. 언제나 정확히 num 바이트 만큼을 복사한다.
참조 : https://modoocode.com/77 

 

Memory set은 0으로 저장 하는 방식을 매크로 함수와 함께 사용하고자 합니다. 그래서 매크로 함수를 설명하고 시작한 것입니다. 

#define UTIL_MEMSET8( dest, value, size )   UTIL_MEMSET_8( dest, value, size )
static void (*Dest[2])( void );

(void) UTIL_MEMSET_8(void *dst, uint8_t value, uint16_t size)
{
	(uint8_t *) dst8 = (uint8_t *) dst;
    
    while(size--) 
    {
    	dst8++ = value; // dst8 을 증가 하면서 0 으로 메모리에 저장 
    }
}

일반적으로 이와 같은 함수는 memset 이라는 함수를 사용합니다. 

포인터를 역참조한 뒤 값을 할당할 때는 해당 자료형 크기만큼만 할당할 수 있습니다. 만약 int형 포인터라면 4바이트 크기만큼 할당하겠죠?
memset 함수를 사용하면 메모리의 내용을 원하는 크기만큼 특정값으로 설정할 수 있으며 함수 이름은 memory set에서 따왔습니다(string.h 헤더 파일에 선언되어 있습니다). 이때 설정하는 크기는 바이트 단위입니다.

- memset(포인터, 설정할값, 크기);
      - void *memset(void *_Dst, int _Val, size_t _Size);
      - 값 설정이 끝난 포인터를 반환
참조 : https://dojang.io/mod/page/view.php?id=1745

여기서 meset 이라는것을 define으로 동작을 구현하면서 meset을 구현했다고 봐야 겠내요 

#define UTIL_MEMSET8( dest, value, size )   UTIL_MEMSET_8( dest, value, size )

이 매크로는 다음과 같이 사용 될 수 있습니다. 

// static void (*Dest[2])( void ); 

void init_func(void)
{
	(void)UTIL_MEMSET8(Dest, 0, sizeof(Dest)); // Dest 는 배열로 되어 있습니다. 
}

 

728x90