임베디드/임베디드 레시피

struct , packed

twoweeks-within 2024. 12. 5. 19:35

 

struct customer {
char *name;
int height;
int weight;
} kim[100]; 이라든가,

 

struct customer {
char *name;
int height;
int weight;
} *kim;


typedef : 기존의 Data형으로 새로운 Data형을 만드는 것

 

typedef unsigned char byte; : Unsigned 8 bit value type.
typedef unsigned char uint8; Unsigned 8 bit value.
typedef unsigned short word; Unsinged 16 bit value type.
typedef unsigned long dword; Unsigned 32 bit value type.

 

typedef struct customer {
char *name;
int height;
int weight;
} kim;

 

kim lee[100], kim *lee  > 선언. 

//  kim의 자리에 cutomer_type 이라던가 type의 의미를 덧붙여서 헷갈림 방지

 

typedef struct customer {
char *name;
int height;
int weight;
} customer_type;

 

 customer_type kim;  customer_type kim[100]; customer_type *kim; 

 

linked list

 

typedef struct heap_node {
char filename [SIZ_FILE_NAME];
unsigned int line_number;
void * allocated;
struct heap_node *next;
heap_node_type;

 

 heap_node : heap_node를 가지고 있음

 

 enum type

 

typedef enum {
    START,
    WALK,
    RUN
} customer_activity_type;


customer_activity_type activity;

 

 >>  activity는 START (0), WALK (1), RUN (2)의 3가지 enum값을 갖는 변수가 탄생

 

switch (activity)
{
   case START:
      뭐뭐뭐
    break;
    case WALK:
      뭐뭐뭐
    break;
    case RUN:
      뭐뭐뭐
    break;
}

 

 __packed  지시어

 


typedef struct customer {
char name;
int height;
int weight;
} customer_type;


typedef __packed struct customer {
char name;
int height;
int weight;
} customer_type;

 

 

ⓐ의 경우에는 총 Memory를 차지하는게 12 byte를 차지하고요,

ⓑ의 경우에는 총 9 byte를 차지해요.

 

__packed 사용 > byte alignment

__packed 미사용 > struct내부에서 실제 자기 크기하고는 상관없이 4byte 단위로 Data를 alignment.

(다른 System은 안그런데, ARM은 고전적인 성능 문제때문에)

 

 대신 4 byte 이내의 것들은 한번에 붙여씀
typedef struct customer {
char name; /* 1byte + 쓰레기 3byte */
int height /* 4 byte */
} customer_type; /* 총 8 byte */
 >>
typedef struct customer {
char name; /* 1byte */
char flag; /* 1 byte + 쓰레기 2byte */
int height /* 4 byte */
} customer_type; /* 총 8 byte */

4byte 넘는 8 byte면?

typedef struct customer {
char name; /* 1byte + 쓰레기 3byte */
double height; /* 8 byte */
int weight; /* 4 byte */
char office; /* 1byte + 쓰레기 3byte */
} customer_type /* 총 20 byte */



typedef struct customer {
char name; /* 1byte */
char height; /* 1byte */
char weight ; /* 1byte + 쓰레기 1byte */
} customer_type /* 총 4 byte  */

 sizeof() == 3

   > struct : 3byte를 잡음

   >  메모리 입장 : 못잡는 1byte가 실제로는 있음

 packed의 필요성

 > 서로 다른 System끼리 Packet통신을 할 때

 (  Embedded System <>  PC Host가 서로 USB로 통신 )

 PC : int를 4byte로 인식

Embedded System :int를 2byte로 인식

 >서로 같은 Data > packet형태로는 다르게 인식

  >>  최소한 Data Packet으로 만드는 Data의 byte alignment

        >  byte로 하자

      +  packet에 Data를 꽉꽉 채워 넣어 성능 유리

ARM사의 ADS : __packed struct   

GNU gcc :  type이름 앞에다가 __attribute__ ((packed)) 이걸 붙여서 표현

 

typedef struct customer {
char *name;
int height;
int weight;
} __attribute__ ((packed))customer_type;

 

 

자기자신의 type을 갖는 structure 선언

 

version 1.

typedef struct node {
    char *item;
    struct node *next;
} *NODEPTR;

 

version 2.

typedef struct node *NODEPTR;
struct node {
    char *item;
    NODEPTR next;
}

 

version 3.

struct node {
    char *item;
    struct node *next;
};
typedef struct node *NODEPTR;

 

'임베디드 > 임베디드 레시피' 카테고리의 다른 글

stack initialization  (0) 2024.12.05
Stack , Heap  (0) 2024.12.05
Pointer  (0) 2024.12.04
Context와 AAPCS  (0) 2024.12.03
Scatter Loading 주의점, heap 및 stack  (2) 2024.12.02