배열과 포인터

항 번

항목

RL78 패밀리 용 컴파일러 사양

1

포인터 형 데이터의 크기

near : 2 바이트 far : 4 바이트

2

배열의 크기의昀大값 (size_t 형)

unsigned int 형

3

다른 형식에 대한 포인터끼리의 변환 결과

오류 확인은하지 않습니다.

4

포인터 형식을 정수로 변환

(포인터 형의 크기 정수 크기)

__ far void * pa = (__far void *) 0x12345;

 short a = (short) pa;

포인터 형식의 하위 바이트의 값이됩니다 . a의 값은 0x2345이다.

5

포인터 형식을 정수로 변환

(포인터 형의 크기 <정수 크기)

__ near void * pa = (__near void *) 0xFFFE;

long a = (long) pa;

변수 포인터는 상위 0 x000F 추가 합니다

(0은 예외 0 확장합니다).

 함수 포인터는 0 확장합니다. a의 값은 1048574이된다. (0x000FFFFE)

6

정수에서 포인터 형식으로 변환 (정수 크기 포인터 형의 크기)

정수의 하위 바이트의 값이됩니다.

7

정수형에서 포인터 형식으로 변환 (정수 크기 <포인터 형의 크기)

제로 확장합니다.

8

동일한 배열의 포인터 사이의 차이를 유지하는 데 필요한 정수 형 (ptrdiff_t 형)

int

주 : 항 번 3 ~ 항 번 7 모든 캐스트 연산자를 사용하는 경우의 내용입니다.

 

배열과 포인터의 사양 RL78 패밀리 용 컴파일러는 1.4 절에서 설명하는 3 종류의 메모리 모델을 가지고 있습니다.

각 메모리 모델과near / far 형식 한정자 설정은 포인터 형 데이터의 크기가 변경됩니다.

또한, size_t 형의 사양이나 ptrdiff_t 형태의 사양은 기종에 맞는 데이터 형식이기 때문에 문제 없다고 생각하고 좋습니다.

 

스칼라의 정렬 조건

항목 번호

데이터 크기

정렬 조건

1

char

1 바이트

1 바이트

2

unsigned char

3

short

2 바이트

2 바이트

4

unsigned short

5

int

2 바이트

 

6

unsigned int

7

long

4 바이트

 

8

unsigned long

9

float

4 바이트

 

10

double

11

long double

12

포인터

2 바이트 4 바이트

 

 

 

스칼라의 정렬 조건 (정렬) RL78 패밀리 용 컴파일러는 2 바이트 이상의 데이터는 워드 경계에 배치합니다.

• 1 바이트 크기의 스칼라 변수는 정렬 조건 1 (바이트)이다.

• 2 바이트 크기 이상의 스칼라 변수는 정렬 조건이 2 (워드 경계)가 된다.

또한, 기본 변수이면 정렬 조건의 차이에 의한 이동성 문제가 발생하지 않을 것입니다.

정렬 조건의 차이에 의한 문제는 집성 형, 즉 구조체 나 공용체,

비트 필드에서만 발생하지 않습니다. 기본형 인 한 문제 없다고 생각 될 수 있습니다.

 

 

 

 

 

 

구조체, 공용체, 열거, 비트 필드의

사양번

항목

RL78 컴파일러 사양

1

다른 형식의 멤버에 액세스하는 공유 체형의 멤버 참조

참조 할 수 있지만, 값은 보장하지 않습니다.

2

구조체 멤버 정렬 조건 * 1

2 바이트 이상의 구조체는 2 바이트에 배치하고 각 멤버는 정렬 조건에 따라 패딩이 들어가 있습니다.

3

공용체 멤버의 정렬 조건

공용체의 선두는 2 바이트에 배치합니다.

4

단지 i nt 형의 비트 필드의 부호

unsigned int 형

5

비트 필드의 할당 순서 * 2

하위 비트 (오른쪽)에서 할당합니다.

6

할당 비트 필드의 크기가 남아있는 크기를 초과 할 때 할당 방법

다음 영역에 할당합니다.

7

비트 필드에서 허용되는 형식 지정자

char, unsigned char, short, unsigned short, int, unsigned int

8

열거 값을 표현하는 정수형

다음 형식에서 모든 열거 상수를 표현할 수있는昀初것입니다. signed char, unsignedchar, signed int

【주】 * 1-rc 옵션을 지정하여 정렬 조건을 1로 변경 가능합니다.

 

구조체, 공용체, 열거, 비트 필드의 사양 RL78 패밀리 용 컴파일러는 구조체 비트 필드의 각 멤버는 정렬 조건에

따라 배치하기 때문에 멤버의 선언 순서에 따라 빈 공간 ( 패딩)가 들어갑니다.

공용체는 짧게 2 바이트에 배치되지만, 배열로 선언했을 때의 미사용 영역은 들어 가지 않습니다.

또한 부호 지정이없는 비트 필드는 unsigned 형의 부호 없음으로 처리, 비트 필드의 할당 순서는 하위 비트 (LSB)의 오른쪽에서 할당합니다.

다음 페이지 이후에 구체적인 할당을 보여줍니다.

 

<구조체 멤버 할당>

 

  1. 전체 크기가 1 바이트 때는 사용하지 않는 공간을 차지하지 않고 무엇 번지라도 배치 가능합니다.
  2. • struct c1은 전체가 1 바이트이기 때문에 n 번지 배치입니다.
  3. 전체 크기가 2 바이트 이상일 때는 각 멤버를 정렬 조건에 맞게 사용되지 않는 공간이 존재한다.

     

  4. • struct c2는 int 형 멤버가 있기 때문에 정렬 조건은 2에 맞춘 미사용 영역이 존재한다.
  5. • struct c3, struct c4는 long 형 멤버가 있기 때문에 정렬 조건은 2에 맞춘 미사용 영역이 존재한다.

     

    공용체의 멤버 할당

    1. 전체 크기에 관계없이 항상 2 바이트에서 배포한다.

    2. 그러나 사용되지 않는 공간은 존재하지 않기 때문에 배열로 선언하면 크기에 따라 홀수 번지 배치된다.

     

    [주의 사항】 현재의 RL78 패밀리 용 컴파일러는 홀수 크기의 공용체 배열의 2 바이트 이상의 멤버는 홀수 번지에서 배치 될 수 있습니다.

    그 경우, 홀수 번지에서 배치 된 2 바이트 이상의 멤버가 제대로 액세스 할 수 있습니다.

    공용체를 배열로 선언하는 경우, 반드시 전체 크기가 짝수 크기가 되도록 멤버 구성을 조정하십시오.

    ( LBS 부터 정의 된다.)

    15 5 4 2 1 0

     

    struct b1 {

    short a:2;

    short b:3;

    } x;

     

    struct b2 {

    short a:2;

    short :5;

    short b:3;

    } y;

     

     

    struct b3 {

    char a:5;

    char b:4;

    } z;

     

    struct b4 {

    char a:5;

    char :0;

    char b:3;

    } v;

     

     

    비트 필드 멤버 할당 (LSB)

     

    struct b1 예를 위와 같이 RL78 패밀리 용 컴파일러는 비트 필드 멤버는 하위 비트 (LSB)의 오른쪽에서 할당합니다.

    또한 struct b2의 예와 같이, 무명의 비트 필드는 지정된 비트 폭을 비우는 것을 의미합니다.

    이식성 문제에서 피해 주셨으면 코딩 예는 struct b3입니다. 형식 지정자를 넘는 비트 폭을 선언하면

    자동으로 다음 필드에 배치되어 사용하지 않는 비트 (패딩)가 들어갑니다.

    struct b4의 비트 폭 0의 지정은 ANSI 규격대로 다음 필드로 비우고 있지만 문법 위반 개발 환경이 많이

    존재하기 때문에 사용은 피하는 것이 좋습니다.

     

     

    struct b1 {

    short a:2;

    short b:3;

    } x;

     

    struct b2 {

    short a:2;

    short :5;

    short b:3;

    } y;

     

    struct b3 {

    char a:5;

    char b:4;

    } z;

     

    struct b4 {

    char a:5;

    char :0;

    char b:3;

    } v;

    비트 필드 멤버 할당 (MSB) RL78 패밀리 용 컴파일러에서는 "비트 필드를 MSB에서 할당"옵션 (-rb)는

    비트 필드 멤버 할당 순서를 상위 비트 (MSB)의 오른쪽에서 변경 될 수 있습니다.

    또한, 할당 순서를 변경해도,

    • 무명의 비트 필드  

    • 필드를 넘는 비트 폭  

    • 비트 폭 0의 비트 필드에 대한 취급은 동일합니다.

     

     

     

'공부 > RL78' 카테고리의 다른 글

RL78 컴파일러 사용 4  (0) 2013.04.05
RL78 컴파일러 사용 3  (0) 2013.04.05
RL78 컴파일러 사용 1  (0) 2013.04.05
RL78 컴파일러  (0) 2013.04.05
일본 RL78 세미나 자료  (0) 2013.04.05

+ Recent posts