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 |