간단한 Flag 값을 저장하고 싶고 메모리도 줄이고 싶을때 우리는 보통 bit field를 사용한다. 잘만 사용하면 메모리 활용을 극대화 시킬 수 있다.
bit field를 사용하는 2가지 방법을 정리해본다.
1. h와 #define 을 사용한 bit field 배열화
2. 기본적인 bit field와 구조체를 사용한 배열화를 진행해 본다.
#define Prov_Stopwatch_Max_N 1000
typedef Prov_u8 BIT_FIELD_TYPE ;
#define BIT_SIZE (BIT_FIELD_TYPE)(sizeof(BIT_FIELD_TYPE) * 8)
#define StwhArrSize (Prov_Stopwatch_Max_N / BIT_SIZE) + 1
#define SetBit(array, n) do { array[n / BIT_SIZE] |= (1 << (n % BIT_SIZE)); } while (0)
#define GetBit(array, n) ((array[n / BIT_SIZE] >> (n % BIT_SIZE)) & 1)
volatile BIT_FIELD_TYPE arr_st[StwhArrSize];
void main()
{
SetBit(arr_st, 0);
SetBit(arr_st, 1);
SetBit(arr_st, 2);
SetBit(arr_st, 3);
SetBit(arr_st, (Prov_Stopwatch_Max_N -1));
}
<기존적인 Bit Field 사용법>
struct st
{
unsigned char _stwhflag :1; // Will take only a byte
unsigned char _auflag :1; // Will take only a byte
} arr_st[100];
해당 구조체를 보면 unsigned char (1byte)를 사용해 2개의 flag를 생성하였다.
1. bit16 헤더 생성
/*
* bit16.h
*
* Created on: 2020. 6. 22.
* Author: sure
*/
#ifndef BIT16_H_
#define BIT16_H_
__bit16(0)
__bit16(1)
__bit16(2)
__bit16(3)
__bit16(4)
__bit16(5)
__bit16(6)
__bit16(7)
__bit16(8)
__bit16(9)
__bit16(10)
__bit16(11)
__bit16(12)
__bit16(13)
__bit16(14)
__bit16(15)
#endif /* BIT16_H_ */
char 8개 , short 16개, int 32개 원하는대로 설정해서 사용 가능하다.
2. 구조체 선언
typedef struct _S_Prov_BIT16
{
#define __bit16(idx) unsigned bit16##idx :1;
#include "Prov_bit16.h"
#undef __bit16
}S_Prov_BIT16, *PS_Prov_BIT16;
#define _bit16(idx) bit16##idx
#define bit(idx) _bit16(idx)
포인터로도 사용할 수 있다.
3. 사용방법
S_Prov_BIT16 stwcFlag_16b_[100];
unsigned char law = 10;
stwcFlag_16b_[law].bit(0);
해당 방법의 문제점 (적용하기 전에 꼭 보세요)
- ~.bit(0) <- 해당 부분이 H 파일에 선언된 (0) 과 일치해야만 접근 가능하다.
만약 #define INDEX_# 0 과같이 선언후 사용하는 경우 ~.bit(INDEX) 와 같이 사용하면 정상 작동한다.
때에따라 적용해서 사용하면 될 듯하다.
반응형
사업자 정보 표시
라울앤알바 | 장수호 | 서울특별시 관악구 봉천로 13나길 58-10, 404호(봉천동) | 사업자 등록번호 : 363-72-00290 | TEL : 010-5790-0933 | Mail : shjang@raulnalba.com | 통신판매신고번호 : 2020-서울관악-0892호 | 사이버몰의 이용약관 바로가기
'programmer > Programming' 카테고리의 다른 글
함수 포인터 사용 예 (0) | 2020.10.22 |
---|---|
원형 큐(circuit queue) 예제 (0) | 2020.10.21 |
Pthread 개념 및 예제 (0) | 2020.10.21 |