이 자료는 일본사이트의 내용을 google을 이용해 번역한 내용임

 

구조체와 공용체

 R8C/25 , RL78/G13, RL78/G14 No Responses»

3 112013

   

구조체와 공용체는 마이크로 소프트 만들 초보자는 필수 기술입니다기존 소스의 이해 코드 생성 소스 해독에 중요하기 때문입니다그래서 초보자도 알기 쉬운 간단한 설명서를 만들었습니다.

구조체는여러 기존 형식에서 형식을 만드는 " 공용체는여러 기존 형식에서 메모리를 공유 한다. "  2 점을 기억하십시오그러면 다음 예제 (R8C/25) 이해할 있습니다. RL78 경우, "bit" 예약어 있으므로 적당히 바꾸면 (나의 경우, "b" 사용) 사용할 있습니다.

구조 설명

구조체의 내용

   

공용체의 해설

공용체 내용

 

 

 

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

RENESAS RL78 세미나 주요 정리 내용  (0) 2015.03.10
RL78 option byte  (0) 2014.08.28
RL78 컴파일러 사용 10  (0) 2013.04.05
RL78 컴파일러 사용 9  (0) 2013.04.05
RL78 컴파일러 사용 8  (0) 2013.04.05

 

 

4.1 특수 기능 레지스터 (sfr) 영역의 액세스 방법 레지스터 약칭 이름과 비트 이름 묘사

 

RL78 패밀리 컴파일러는 # pragma sfr 지령을 선언함으로써 SFR 역내 주변 I / O 레지스터에 액세스 있습니다. 설명하는 레지스터 이름은 설명서에 나와있는 레지스터 약어 이름 기재 비트 이름입니다.

주변 I / O 레지스터 이름 활성화 지정

레지스터 전체 액세스

1 비트 사용

 

 

레지스터 약칭 이름과 비트 이름 묘사 SFR 영역의 주변 I / O 레지스터의 액세스는 # pragma sfr 지령을 선언함으로써 가능해집니다.

# pragma sfr 지령을 선언하면

설명서 기재의 "레지스터 약칭 이름"에서 레지스터 전체 액세스 가능

설명서 기재가있는 비트는 "비트 이름"에서 1 비트 액세스가 가능합니다

 

 

 

 

기재되지 않은 비트는 레지스터 이름 뒤에 ". 비트 번호" 작성 하여 액세스 있습니다.

그러나 비트 번호에 대한 액세스는 1 비트 액세스 가능한 레지스터 이고 여러 비트를 모아 작업하는 경우 논리 연산이 필요합니다

비트 번호로 묘사

비트 번호로 묘사 SFR 영역의 주변 I / O 레지스터의 액세스는 # pragma sfr 지령을 선언함으로써 가능해집니다. # pragma sfr 지령을 선언하면

설명서언급없이 "등록 약칭 이름. 비트 번호"1 비트 액세스가 가능

그러나 1 비트 액세스 가능한 레지스터에 한함

또한 여러 비트를 모아 작업하는 경우 비트 논리가 필요합니다.

 

4.2 포트 포트 구성

포트 구성 위는 RL78/G14 P12 블록 다이어그램입니다. 모든 포트가 같은 블록 다이어그램은 없지만, 대표적인 포트의 블록도 생각하십시오. RL78/G14 포트는 대부분 입력 출력 포트 어느 것으로도 사용할 있고, 그것을 결정하는 레지스터 포트 모드 레지스터 (PMxx)입니다. 초기 상태는 입력 포트이며 단자에서의 입력 값은 포트 레지스터 (Pxx) 리드하는 것으로 읽을 있습니다. 또한 포트 모드 레지스터 (PMxx) 조작 출력 포트로 설정하면 포트 레지스터 (Pxx) (래치 ) 단자에서 출력됩니다. 또한 입력 포트에서 사용할 경우, 풀업 저항 옵션 레지스터 (PUxx) 내장 풀업 저항을 사용 수가 있습니다.

 

포트 모드 레지스터 (PMxx) 포트 레지스터 (Pxx)

포트 모드 레지스터 (PMxx) 포트 입력 / 출력을 1 비트 단위로 설정하는 레지스터입니다. 포트 모드 레지스터는 1 비트 메모리 조작 명령 또는 8 비트 메모리 조작 명령으로 설정합니다. 리셋 신호를 발생하여, FFH됩니다.

포트 레지스터 (Pxx) 포트 출력 래치 값을 설정하는 레지스터입니다. 리드하면 입력 모드는 단자 레벨 출력 모드는 포트 출력 래치 값이 읽습니다. 포트 레지스터는 1 비트 메모리 조작 명령 또는 8 비트 메모리 조작 명령으로 설정합니다. 리셋 신호를 발생하여, 00H됩니다

 

.  

풀업 저항 옵션 레지스터 (PUxx) 포트 입력 모드 레지스터 (PIMxx)

풀업 저항 옵션 레지스터 (PUxx) 내장 풀업 저항을 사용하거나 여부를 설정하는 레지스터입니다. 풀업 저항 옵션 레지스터로 내부 풀업 저항의 사용을 지정한 단자에서 입력 모드로 설정 비트에만 비트 단위로 내부 풀업 저항을 사용할 있습니다. 출력 모드로 설정 비트는 풀업 저항 옵션 레지스터의 설정에 관계없이 내부 풀업 저항은 연결되지 않습니다. 겸용 기능의 출력 단자로 사용하는 경우도 마찬가지입니다. 풀업 저항 옵션 레지스터는 1 비트 메모리 조작 명령 또는 8 비트 메모리 조작 명령으로 설정합니다. 리셋 신호를 발생하여, 00H (PU4 01H)입니다.

포트 입력 모드 레지스터 (PIMxx) 입력 버퍼를 1 비트 단위로 설정하는 레지스터입니다. 다른 전위의 외부 장치와 시리얼 통신시 TTL 입력 버퍼를 선택할 있습니다. 포트 입력 모드 레지스터는 1 비트 메모리 조작 명령 또는 8 비트 메모리 조작 명령으로 설정합니다. 리셋 신호를 발생하여, 00H됩니다.

    

포트 출력 모드 레지스터 (POMxx) 포트 모드 제어 레지스터 (PMCxx)

포트 출력 모드 레지스터 (POMxx) 출력 모드를 1 비트 단위로 설정하는 레지스터입니다. 다른 전위의 외부 장치와 시리얼 통신시와 같은 전위의 외부 장치와 간이 I2C 통신시 단자에 N-ch

오픈드레인 출력 (VDD 내압) 모드를 선택할 있습니다. 포트 출력 모드 레지스터는 1 비트 메모리 조작 명령 또는 8 비트 메모리 조작 명령으로 설정합니다. 리셋 신호를 발생하여, 00H됩니다.

포트 모드 제어 레지스터 (PMCxx) 디지털 입출력 / 아날로그 입력을 1 비트 단위로 설정하는 레지스터입니다. 포트 모드 제어 레지스터는 1 비트 메모리 조작 명령 또는 8 비트 메모리 조작 명령으로

설정합니다.리셋 신호를 발생하여, FFH됩니다.

 

    

RL78/G14 탑재하고있다 PMxx, Pxx, PUxx, PIMxx, POMxx, PMCxx 레지스터와 비트 (1 / 5)

   

ビット

  

64 pin

52 pin

48 pin

44 pin

40 pin

36 pin

32 pin

30 pin

  

PMxx

Pxx

PUxx

PIMxx

POMxx

PMCxx

0

0

PM00

P00

PU00

POM00

PMC001

1

PM01

P01

PU01

PIM01

PMC011

2

PM02

P02

PU02

POM02

PMC02

3

PM03

P03

PU03

PIM03

POM032

PMC03

4

PM04

P04

PU04

PIM04

POM04

5

PM05

P05

PU05

6

PM06

P06

PU06

7

1

0

PM10

P10

PU10

PIM10

POM10

1

PM11

P11

PU11

POM11

2

PM12

P12

PU12

3

PM13

P13

PU13

PIM13

POM13

4

PM14

P14

PU14

PIM14

POM14

5

PM15

P15

PU15

PIM15

POM15

6

PM16

P16

PU16

PIM16

7

PM17

P17

PU17

PIM17

POM17

2

0

PM20

P20

1

PM21

P21

2

PM22

P22

3

PM23

P23

4

PM24

P24

5

PM25

P25

6

PM26

P26

7

PM27

P27

3

0

PM30

P30

PU30

PIM30

POM30

1

PM31

P31

PU31

PIM31

2

3

4

5

6

7

4

0

PM40

P40

PU40

1

PM41

P41

PU41

2

PM42

P42

PU42

3

PM43

P43

PU43

4

5

6

7

1. 30 , 32 제품 2. 64 제품

 

RL78/G14 탑재하고있다 PMxx, Pxx, PUxx, PIMxx , POMxx, PMCxx 레지스터와 비트 (2 / 5)

   

ビット

  

64

52

48

44

40

36

32

30

  

PMxx

Pxx

PUxx

PIMxx

POMxx

PMCxx

pin

pin

pin

pin

pin

pin

pin

pin

5

0

PM50

P50

PU50

PIM50

POM50

 

1

PM51

P51

PU51

POM51

 

2

PM52

P52

PU52

 

3

PM53

P53

PU53

 

4

PM54

P54

PU54

 

5

PM55

P55

PU55

PIM55

POM55

 

6

 

7

6

0

PM60

P60

 

 

1

PM61

P61

 

 

2

PM62

P62

 

 

3

PM63

P63

 

 

4

 

5

 

6

 

7

7

0

PM70

P70

PU70

 

1

PM71

P71

PU71

POM71

 

2

PM72

P72

PU72

 

3

PM73

P73

PU73

 

4

PM74

P74

PU74

POM74

 

5

PM75

P75

PU75

 

6

PM76

P76

PU76

 

7

PM77

P77

PU77

12

0

PM120

P120

PU120

PMC120

 

1

P121

 

 

2

P122

 

 

3

P123

 

 

4

P124

 

 

5

 

6

 

7

13

0

P130

 

                
                
 

1

 

2

 

3

 

4

 

5

 

6

 

7

P137

 

14

0

PM140

P140

PU140

 

1

PM141

P141

PU141

 

2

 

3

 

4

 

5

 

6

PM146

P146

PU146

 

7

PM147

P147

PU147

PMC147

 

 

 

RL78/G14 탑재하고있다 PMxx, Pxx, PUxx, PIMxx, POMxx, PMCxx 레지스터와 비트 (3 / 5)

 

   

ビット

  

100 pin

80 pin

  

PMxx

Pxx

PUxx

PIMxx

POMxx

PMCxx

0

0

PM00

P00

PU00

POM00

1

PM01

P01

PU01

PIM01

2

PM02

P02

PU02

POM02

PMC02

3

PM03

P03

PU03

PIM03

POM03

PMC03

4

PM04

P04

PU04

PIM04

POM04

5

PM05

P05

PU05

6

PM06

P06

PU06

7

1

0

PM10

P10

PU10

PIM10

POM10

1

PM11

P11

PU11

POM11

2

PM12

P12

PU12

PMC12

3

PM13

P13

PU13

PIM13

POM13

PMC13

4

PM14

P14

PU14

PIM14

POM14

5

PM15

P15

PU15

PIM15

POM15

6

PM16

P16

PU16

PIM16

PMC16

7

PM17

P17

PU17

PIM17

POM17

PMC17

2

0

PM20

P20

 

 

1

PM21

P21

 

 

2

PM22

P22

 

 

3

PM23

P23

 

 

4

PM24

P24

 

 

5

PM25

P25

 

 

6

PM26

P26

 

 

7

PM27

P27

 

 

3

0

PM30

P30

PU30

PIM30

POM30

1

PM31

P31

PU31

PIM31

2

3

4

5

6

7

4

0

PM40

P40

PU40

1

PM41

P41

PU41

2

PM42

P42

PU42

3

PM43

P43

PU43

PIM43

POM43

4

PM44

P44

PU44

PIM44

POM44

5

PM45

P45

PU45

POM45

6

PM46

P46

PU46

7

PM47

P47

PU47

 

 

RL78/G14 탑재하고있다 PMxx, Pxx, PUxx, PIMxx, POMxx, PMCxx 레지스터와 비트 (4 / 5)

   

ビット

  

100 pin

80 pin

  

PMxx

Pxx

PUxx

PIMxx

POMxx

PMCxx

5

0

PM50

P50

PU50

PIM50

POM50

1

PM51

P51

PU51

POM51

2

PM52

P52

PU52

POM52

3

PM53

P53

PU53

PIM53

POM53

4

PM54

P54

PU54

PIM54

POM54

5

PM55

P55

PU55

PIM55

POM55

6

PM56

P56

PU56

7

PM57

P57

PU57

6

0

PM60

P60

 

 

1

PM61

P61

 

 

2

PM62

P62

 

 

3

PM63

P63

 

 

4

PM64

P64

PU64

5

PM65

P65

PU65

6

PM66

P66

PU66

7

PM67

P67

PU67

7

0

PM70

P70

PU70

1

PM71

P71

PU71

POM71

2

PM72

P72

PU72

3

PM73

P73

PU73

4

PM74

P74

PU74

POM74

5

PM75

P75

PU75

6

PM76

P76

PU76

7

PM77

P77

PU77

8

0

PM80

P80

PU80

PIM80

POM80

1

PM81

P81

PU81

PIM81

POM81

2

PM82

P82

PU82

POM82

3

PM83

P83

PU83

4

PM84

P84

PU84

5

PM85

P85

PU85

6

PM86

P86

PU86

7

PM87

P87

PU87

10

0

PM100

P100

PU100

PMC100

1

PM101

P101

PU101

2

PM102

P102

PU102

3

4

5

6

7

 

 

RL78/G14 탑재하고있다 PMxx, Pxx, PUxx, PIMxx, POMxx, PMCxx 레지스터와 비트 (5 / 5)

 

   

ビット

  

100 pin

80 pin

  

PMxx

Pxx

PUxx

PIMxx

POMxx

PMCxx

11

0

PM110

P110

PU110

1

PM111

P111

PU111

2

3

4

5

6

7

12

0

PM120

P120

PU120

PMC120

1

P121

2

P122

 

 

3

P123

 

 

4

P124

 

 

5

6

7

13

0

P130

 

 

1

2

3

4

5

6

7

P137

 

 

14

0

PM140

P140

PU140

1

PM141

P141

PU141

2

PM142

P142

PU142

PIM142

POM142

3

PM143

P143

PU143

PIM143

POM143

4

PM144

P144

PU144

POM144

5

PM145

P145

PU145

6

PM146

P146

PU146

7

PM147

P147

PU147

PMC147

15

0

PM150

P150

 

 

1

PM151

P151

 

 

2

PM152

P152

 

 

3

PM153

P153

 

 

4

PM154

P154

 

 

5

PM155

P155

 

 

6

PM156

P156

 

 

7

 

포트 샘플 프로그램

예제 4-1P12 (포트 1 비트 2 ) 연결된 SW ON (로우 레벨 입력) P16 (포트 1 비트 6) 연결된 LED 점등 (로우 레벨 출력)하는 프로그램을 작성하십시오. 또한 P12 내장 풀업 저항을 사용한다.

 

1: #pragma sfr // Enable Peripheral I/O Register Name

2:

3: void main(void)

4: {

5: // P1 = 0x40; // P16 is High, Others is Low Level Latch

6: // PM1 = 0xBF; // P16 is Output, Others is Input

7: P1.6 = 1; // P16 is High Level Latch

8: PM1.6 = 0; // P16 is Output

9: PU1.2 = 1; // P12 Uses On-Chip Pull-Up Resistor

10: while( 1 ) {

11: P1.6 = P1.2; // P12(SW) to P16(LED)

12: // if( P1.2 == 0 ) // P12(SW) is ON(Low Level)

13: // P1.6 = 0; // P16(LED) is ON(Low Level)

14: // else

15: // P1.6 = 1; // P16(LED) is OFF(High Level)

16: }

17: }

해설 1 : 주변 I / O 레지스터 이름을 사용하기 위해 # pragma sfr 지령을 선언 있습니다.

 

5 ~ 8 호선 : P16 단자를 출력 포트 (초기 출력 하이 레벨), P12 단자를 입력 포트로 사용하기 위해 P1 0x40, PM1 0xBF 설정합니다. 또한 초기 상태 P1 모든 래치 0x00 로우 레벨 PM1 모든 단자 입력 포트 0xFF이므로 P1 비트 6 "1" 상부를 래치하고 PM1 비트 6 "0" 설정하고 높은 수준의 출력 포트에 초기화해도 상관 없습니다.

 

9 호선 : P92 내장 풀업 저항을 이용하기 위해 PU1 비트 6 "1" 설정하고 내부 풀업 저항을 사용합니다.

 

11 : P12 SW 값을 입력하고 P16 LED 출력합니다. 제어 SW LED 모두 1 비트이므로 , P1 해당하는 비트를 1 비트끼리 할당합니다.

 

12 ~ 15 : SW LED 제어는 P12 연결 SW 상태를 if 문으로 검사하고 결과에 따라 P16 연결 LED 점등 / 소등해도 상관 없습니다.

       

4.3  인터벌 타이머  인터벌 타이머 구성 인터벌 구성되어

 

인터벌 타이머구성타이머는다음과 같은 하드웨어로  있습니다. 카운터 : 12 비트 카운터 제어 레지스터 : 주변 활성화 레지스터 0 (PER0) 동작 속도 모드 제어 레지스터 (OSMC) 인터벌 타이머 제어 레지스터 (ITMC) 카운터 제어 레지스터에 따라 미리 설정 임의의 시간 간격으로 인터럽트 (INTIT) 발생합니다.

 

 

주변 활성화 레지스터 0,1 (PER0, PER1)

주변 활성화 레지스터 0,1 (PER0, PER1)

주변 활성화 레지스터 0,1 (PER0, PER1) 주변 하드웨어에 대한 클록 공급 허가 / 금지를 설정 레지스터입니다. 사용하지 않는 하드웨어에 클럭 공급을 중지시키는 것으로 저소비 전력화와 노이즈 저감을 도모합니다.

인터벌 타이머를 사용할 때는 반드시 PER0 비트 7 (RTCEN) "1" 설정하십시오. PER0, PER1 레지스터는 1 비트 메모리 조작 명령 또는 8 비트 메모리 조작 명령으로 설정합니다. 리셋 신호를 발생하여, 00H됩니다.

 

동작 속도 모드 제어 레지스터 (OSMC)

동작 속도 모드 제어 레지스터 (OSMC) WUTMMCK0 비트 인터벌 타이머의 동작 클럭을 선택할 있습니다. OSMC 레지스터는 8 비트 메모리 조작 명령으로 설정합니다. 리셋 신호를 발생하여, 00H됩니다.

 

 

 

인터벌 타이머 제어 레지스터 (ITMC)

인터벌 타이머 제어 레지스터 (ITMC) 인터벌 타이머의 작동 중지 / 시작 설정과 비교 값을 설정하는 레지스터입니다. ITMC 레지스터는 16 비트 메모리 조작 명령으로 설정합니다. 리셋 신호를 발생하여,

0FFFH됩니다.주의사항

• RINTE 비트를 1 → 0으로 변경하려면 INTIT 인터럽트 마스크 플래그 레지스터 인터럽트 처리 금지하고 에서 작성. 또한 갱신 ITIF 플래그를 클리어하고 인터럽트 처리 허가합니다. • RINTE 비트 리드 값은 RINTE 비트 설정 카운트 클럭 클럭 후에 반영됩니다. • ITCMP11-ITCMP0 비트 설정을 변경하려면 반드시 RINTE = 0 때해야합니다. 그러나 RINTE = 0 →

1 또는 1 → 0으로 변경 함과 동시에 ITCMP11-ITCMP0 비트 설정을 변경할 있습니다.

     

 

인터벌 타이머 동작

인터벌 타이머 동작

ITCMP11-ITCMP0 비트에 설정 카운트 값을 간격으로 반복 인터럽트 요청 (INTIT)

발생하는인터벌 타이머로 작동합니다.

RINTE 비트를 1 설정하면 12 비트 카운터가 카운트를 시작합니다.

12 비트 카운터 값이 ITCMP11-ITCMP0 비트에 설정 값과 일치 , 12 비트 카운터를 0으로

클리어하여 계산을 계속하는 동시에 인터럽트 요청 신호 (INTIT) 발생합니다.

 

   

 

 

 

 

인터럽트 요구 플래그 레지스터 (IF1H)

인터럽트 요구 플래그 레지스터 (IF1H) 인터럽트 요구 플래그는 해당 인터럽트 요청 발생 또는 명령의 실행에 의해 세트 (1)되어 인터럽트 요청

접수시 리셋 신호 발생하거나 명령을 실행하여 클리어 (0)되는 플래그 입니다. 인터벌 타이머 INTIT 인터럽트 신호는 IF1H ITIF 플래그가 대응하고 있습니다. 인터럽트가 접수 경우, 먼저 인터럽트 요구 플래그가 자동으로 지워지지에서 인터럽트 루틴에

들어갑니다.

IF1L, IF1H 레지스터는 1 비트 메모리 조작 명령 또는 8 비트 메모리 조작 명령으로 설정합니다. 또한 IF1L 레지스터와 IF1H 레지스터를 맞춰 16 비트 레지스터, IF1 사용하는 경우, 16 비트 메모리 조작 명령으로 설정 합니다.

리셋 신호를 발생하여, 00H됩니다.

 

 

【주의 사항】

인터럽트 요구 플래그 레지스터의 플래그 조작에는 1 비트 메모리 조작 명령 (CLR1) 사용하십시오. C 언어에서의 기술의 경우 컴파일 어셈블러가 1 비트 메모리 조작 명령 (CLR1) 필요하기 때문에 "IF1H.2 = 0;" "ITIF = 0;"같은 비트 조작 명령을 사용하십시오.

또한 C 언어 에서 "IF1H & = 0xFB;"같이 8 비트 메모리 조작 명령으로 작성하면 컴파일하면 3

명령어어셈블러입니다. mov a, IF1H and a # 0FBH mov IF1H, a 경우 "mov a, IF1H"나중에 "mov IF1H, a"사이의 시간에 동일한 인터럽트 요청 플래그 레지스터

(IF1H) 다른 비트 요구 플래그가 (1) 되어도, "mov IF1H, a" 클리어 (0)됩니다. 따라서 C 언어 8 비트 메모리 조작 명령을 사용하는 경우는주의가 필요합니다.

 

인터벌 타이머 예제 프로그램

예제 4-2

인터벌 타이머를 사용하여 250ms 간격으로 P16 연결된 LED 점멸시키는 프로그램을 창조하십시오. 또한, 인터럽트는 사용하지 않고, 클럭은 15kHz 저속 온칩 오실레이터 클럭 (f IL)을사용한다.

 

1: #pragma sfr // Enable Peripheral I/O Register Name

2:

3: void main(void)

4: {

5: PM1.6 = 0; // P16 is Output

6:

7: OSMC |= 0x10; // Clock Uses fIL

8: RTCEN = 1; // Interval Timer Enable

9: ITMC = 0x8000 + 15000/4-1; // 250ms Count and Interval Timer Start

10: while( 1 ) { // Endless Loop

11: while( ! ITIF ) // Wait INTIT Interrupt Signal

12: ;

13: ITIF = 0; // Clear Interrupt Request Flag

14: P1.6 ^= 1; // Reverse P16(LED)

15: }

16: }

해설

1 : 주변 I / O 레지스터 이름을 사용하기 위해 # pragma sfr 지령을 선언합니다.

5 호선 : P16 출력 포트로 설정합니다.

7 호선 : OSMC WUTMMCK0 "1" 설정하고, 인터벌 타이머의 입력 클럭에 저속 온칩

오실레이터클럭 (f IL)사용합니다.

8 : PER0 RTCE "0" 설정하고, 인터벌 타이머 클럭을 공급합니다.

9 호선 : ITMC  fRINTE에는 ILITCMP11-ITCMP0에는카운트 클럭에서 250ms 얻은 값을 설정하고

"1" 설정하고, 인터벌 타이머를 시작합니다.

11 ~ 12 : IF1H ITIF (인터럽트 요구 플래그) "1"이되는 것을 알아, INTIT 신호가 발생할 때까지 기다립니다.

13 : IF1H ITIF 지우고 인터럽트 요청을 중지합니다.

14 : P16 1 사이에서 배타적 논리합을 , LED 반전시킵니다.

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

RL78 option byte  (0) 2014.08.28
RL78-Cubesuite+ 구조체와 공용체  (0) 2013.04.09
RL78 컴파일러 사용 9  (0) 2013.04.05
RL78 컴파일러 사용 8  (0) 2013.04.05
RL78 컴파일러 사용 7  (0) 2013.04.05

 

"static / 외부 변수를 saddr 영역에 할당"옵션

"static / 외부 변수를 saddr 영역에 할당"옵션 전항까지 소개 컴파일러 옵션의 saddr 영역 관계昀適 항목은 RL78 제품군의 경우 너무 효율이 향상되지 않습니다. 그것보다 saddr 공간 활용에 관하여는 1 장에서 소개 "static 변수를 saddr 영역에 할당"옵션과 "외부 변수를 saddr 영역에 할당"옵션을 사용하는 것을 권장합니다. 다음 페이지에 static 변수에 옵션을 설정 경우의 효과를 나타냅니다.

 

 

 

"static 변수를 saddr 영역에 할당"옵션의 효과 ( 설정시)

"static 변수를 saddr 영역 할당 "옵션의 효과 ( 설정시) static 기억 클래스의 정적 변수는 초기 값이 있다면"@ @ INIT "또는"@ @ INITL "섹션 초기 값없이하면 위의 예와 같이 "@ @ DATA"섹션에 할당됩니다. 위의 목록에서 모르겠지만, 변수에 대한 액세스 명령은 near 영역이면 주소가 16 비트, far 영역이면 ES 이용한 20 비트에서 표현됩니다.

 

 

 

"static 변수를 saddr 영역에 할당"옵션의 효과 (설정시)

소스 프로그램 컴파일 결과 (옵션 설정시)

"static 변수를 saddr 영역에 할당 "옵션의 효과

(설정시)"static변수를 saddr 영역에 할당 "옵션 (-rs) 설정하면 static 기억 클래스의 정적 변수는 초기 값이 있다면"@ @ INIS "섹션 초기 값없이하면 위의 예와 같이 "@ @ DATS"섹션에 할당됩니다. 위의 목록에서 모르겠지만, 변수에 대한 액세스 명령어는 메모리 모델에 관계없이 8 비트로 표현됩니다.

결과 비교가 나타내는대로, 코드 효율성을 향상시킬 수있게됩니다. 그러나 RL78 경우 실행 。 

속도는 비교 표대로 변화하지 않습니다. 코드 효율성을 향상시키기위한 옵션으로 간주합니다saddr 영역 확장

 

레지스터 변수 워크 세그먼트 정보 저장 런타임 라이브러리 인수

0FFEB4H에서 0FFED3H까지 32 바이트는 이용 제한 보호하여 사용자 측에서 제어 가능한 영역입니다.

 

 

saddr 영역 확장

컴파일러 관련 44 바이트의 영역 안에 레지스터 변수에 대한 16 바이트와 작업을위한 16 바이트, 32 바이트의 영역은 이용 제한을 보호함으로써 사용자 측에서 제어 가능 (사용 가능) 영역 입니다.

saddr 영역에 대해 sreg / __sreg 변수 bit 변수 boolean / __boolean 변수 static 기억 클래스 변수, 외부 변수를 할당하는 데에도 가능하면 다음의 이용 제한을 지켜주세요 .[이용 제한]

 

레지스터 변수 공간의 이용 제한

다음 표준 라이브러리 함수를 사용하지 setjmp, longjmp, sprintf, sscanf, printf, scanf, vprintf, vsprintf, ldiv

• "레지스터 변수를 saddr 영역에 할당"옵션 (-qr) 사용하지 않는

 

 

워크 공간 사용 제한

다음 표준 라이브러리 함수를 사용하지 sprintf, sscanf, printf, scanf, vprintf, vsprintf

• "레지스터 변수를 saddr 영역에 할당"옵션 (-qr) 사용하지

 

 

 

 

 

 

메모리 지시문

· WORK 영역을 FFEB4h에서 44 바이트 확보

· SADDR 영역을 FFE20h에서 180 바이트 확보

· STACK 영역을 FFC20h에서 512 바이트 확보

· RAM 영역을 FE900h에서 4896 바이트 확보

세그먼트 배치 지시문

· @ @ DATS @ @ INIS @ @ BITS SADDR 영역에 배치

· @ @ INIT @ @ DATA RAM 영역에 배치

 

WORK 영역 분석 :

범용 레지스터 영역 32 바이트

세그먼트 정보를 포함하고 4 바이트

런타임 라이브러리 인수 8 바이트

44 바이트

 

 

saddr 영역의 확장에 따른 링크 지시어 파일의 수정saddr 영역의 확장에 따른 링크 지시어 파일의 수정 왼쪽 페이지에서 소개 이용 제한을 지키고 saddr 영역을 확장하기 위해서는 링크 지시문 파일에서 컴파일러 관련 32 바이트가 saddr 영역으로 사용할 수있는 것을 링커에 알려야합니다. 위의 링크 지시문 파일이 예입니다. 2 2-18에서 소개 것보다 saddr 공간이 32 바이트 늘리고 범용 레지스터와 컴파일러 고유의 영역을 32 바이트 줄어 듭니다.

 

 

 

3.5昀適화 "昀適화하는"옵션

① 컴파일 옵션

② 최적화

③ 최적화 할 : 예 (속도 우선)

예 (표준) (기본값)

예 (모듈 크기 우선)

예 (고급)

아니오

 

 

"昀適화하는"옵션 RL78 패밀리 컴파일러는 "昀適화하는"옵션은 5 종류의昀適화할 수입니다 있습니다. 아래 표에 "昀適화하는"옵션의 설정에서 활성화 / 비활성화되는 세부 항목이 나열되어 있습니다.

 

昀適 옵션과 세부 항목의 관계


 

모듈 크기 우선

표준

실행 속도 우선

고급

아니오

참조 페이지

연산 식의 실행 순서 교체하는

○ ○

 

×

-

자동 변수를 레지스터 또는 saddr 영역에 자동으로 할당

○ ○

 

×

3-24

레지스터 변수를 레지스터 이외에 saddr 영역에 할당

× ××

×

 

 

3-27

char 연산을 부호 확장하지

○ ○

 

×

3-10

char 형을 unsigned char 간주

×

××

×


 

3-8

분기 명령을昀適화하는

○ ○

 

×

-

정형 코드를 라이브러리로 대체

××

 

3-37

상대 분기 switch 분기 테이블을 생성하는

× ××

×

 

 

3 - 40

디버깅에 적합한昀適화할

× ××

×

 

 

-

: 강력하게 실시, ○ : 실시, × : 실시하지, : 사용자 정의

 

 

 

컴파일 옵션

최적화

최적화 : (고급)

최적화 (고급)

상용구 코드를 라이브러리로 대체 : (라이브러리로 대체 않음) (기본)

(함수의 전후 처리 )

(함수의 전후 처리 저수준 라이브러리의 사용, 일반적인 코드의 서브 루틴 )

아니오

 

 

"상용구 코드를 라이브러리로 대체"옵션

"상용구 코드를 라이브러리 대체 "옵션"상용구 코드를 라이브러리로 대체 "옵션 (-ql1/-ql2/-ql3) 코드 크기를 우선 昀適화하여 상용구 코드 패턴을 라이브러리로 바꿉니다. 설정은 다음 4 종류가 지정할 있습니다.

(라이브러리로 대체 않는) 라이브러리를 대체하지 않습니다 (스피드 우선의昀適화도하지 않습니다).

(함수의 전후 처리 ) 함수의 전후 처리 라이브러리로 대체

(함수의 전후 처리, 저수준 라이브러리의 사용, 공통 코드 서브 루틴 ) 함수의 전후 처리 이외에 낮은 수준 라이브러리의 사용 공통 코드 서브 루틴 기능을 제공합니다.

아니오 라이브러리를 대체하지 않습니다 (스피드 우선의昀適기능을 제공합니다).

 

 

"정형 코드를 라이브러리로 대체"옵션의 효과 ( 설정시)

 

 

"상용구 코드를 라이브러리로 대체"옵션의 효과 ( 설정시)

"상용구 코드를 라이브러리로 대체"옵션 설정이 "아니오"또는 "昀適화하는"옵션이 "실행 속도 우선" 경우 설명대로 명령 라인에 배포됩니다.

 

 

 

 

 

 

 

"정형 코드를 라이브러리로 대체"옵션의 효과 (설정시)

소스 프로그램 컴파일 결과 (옵션 설정시)

 

 

"상용구 코드를 라이브러리로 대체"옵션의 효과 (설정시) "상용구 코드를 라이브러리로 대체"옵션 설정 " (함수의 전후 처리, 저수준 라이브러리의 사용, 공통 코드 서브 루틴 "또는"昀適화하는 "옵션이"모듈 크기 우선 " 경우, 정형 코드 공통 코드는 서브 루틴 있습니다. 위의 예에서는 컴파일 결과의 번째 줄에서 6 번째 컴파일러 생성 공통 코드 서브 루틴입니다.昀適화를 실시한다고 사용 메모리 양이 감소, 코드 효율성 향상되지만, 서브 루틴 때문에 실행 속도가 저하됩니다. 따라서 昀適화는 시스템 코드 크기에 문제가있을 적용을 검토하십시오.

 

 

 

컴파일 옵션

최적화

최적화 : (고급)

최적화 (고급)

상대 분기 switch 분기 테이블을 생성 :

아니오 (기본값)

 

"상대 분기 switch 분기 테이블 생성"옵션

"상대 분기 switch 분기 테이블 생성"옵션 (-qt) far 영역에 배치 함수의 switch

분기 테이블을 상대 분기에 생성할지 여부를 지정합니다.

 

 

near 영역에 배치 함수의 switch

 

near 영역에 배치 함수의 switch near 영역에 배치 함수의 switch 문의 경우, "상대 분기 switch 분기 테이블을 생성하는"옵션 (qt) 설정에 관계없이 연속적인 값의 case 레이블 가진 switch 문의 경우, case 레이블 수가 9 개까지 If-Then 방식으로 컴파일되어 case 레이블 10 개에서 위에 설명 Table 분기 방식을 이용한 컴파일 결과입니다.

 

"상대 분기 switch 분기 테이블을 생성하는"옵션의 효과 ( 설정시) "상대 분기 switch 분기 테이블 생성 "옵션 (-qt) 설정되어 있지 않은 경우, far 영역에 배치 함수의 switch 문은 항상 If-Then 방식으로

컴파일됩니다."

 

 

상대분기 switch 분기 테이블을 생성한다 " 옵션의 효과 (설정시)

"상대 분기 switch 분기 테이블을 생성하는"옵션의 효과 ( 설정시) "상대 분기 switch 분기 테이블을 생성하는"옵션 (-qt) 설정되어있는 경우, far 영역에 배치 함수의 switch 문은 연속 case 레이블이 18 개에서 상대적 형식 Table 분기 방식으로 컴파일됩니다. Far

영역에 배치 함수의 경우, near 공간 배치의 함수와는 달리, CS 레지스터의 설정 값이 0 아닌 배치 주소에 따라 다릅니다. 따라서 절대 주소 확장하기 위하여는 모든 case 레이블 1M 바이트 공간에서 관리해야하며, 분기 테이블의 크기가 증가하게됩니다. 문제를 해결하기 위해 상대적 분기 테이블을 관리하고 분기 상대가 64K 바이트의 경계를 넘는 여부를 컴파일 결과 31 행에서 33 행을 확인하고 Table 분기 방식을 제공합니다

 

 

。   

3.6 callt関数

callt 명령에 의한 함수 호출

 

callt 명령에 의한 함수 호출

 

RL78 제품군은 callt 명령을 가지고 있습니다. callt 명령은 callt 테이블이라는 공간 [80H ~ BFH] 호출 함수의 주소를 저장하고 직접 함수를 호출보다 짧은 코드 함수를 호출 있도록합니다. 그리고 callt 명령의 함수 호출을 실현하는 것이 __callt 키워드입니다. __callt 선언 (또는 callt 선언) 함수는 callt 명령에 의해 호출이 이루어집니다.

또한 불리는 함수 묘사는 일반 함수와 다르지 않지만, 메모리 모델에 관계없이 [C0H ~ 0FFFFH] 영역에 배치해야합니다. 또한 callt 테이블은 80H ~ BFH 영역이므로 시스템에서 사용 가능한 callt 함수昀大수는 32 개입니다.

 

 

【작성 방법】

호출 함수에 callt / __callt 속성을 추가합니다 ( 위에합니다).

callt extern 형명 함수 이름 / __ callt extern 형명 함수 이름 【제한 사항】

• callt / __callt 속성 지정은 함수 정의와 함수 선언을 모두 지정해야합니다.

• callt 함수는 메모리 모델에 관계없이, C0H ~ 0FFFFH] 영역에 배치합니다.

• callt 테이블은 80H ~ BFH 영역입니다.

• "ANSI-C 언어 사양 허용"옵션 (-za) 지정시는 __callt에만 유효합니다.

 

 

 

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

RL78-Cubesuite+ 구조체와 공용체  (0) 2013.04.09
RL78 컴파일러 사용 10  (0) 2013.04.05
RL78 컴파일러 사용 8  (0) 2013.04.05
RL78 컴파일러 사용 7  (0) 2013.04.05
RL78 컴파일러 사용 6  (0) 2013.04.05

 

3.1 정수의 활용

1 바이트 크기 / 2 바이트 크기

소스 프로그램 컴파일 결과

 

1 바이트 크기 / 2 바이트 크기 RL78 패밀리를 이용하기에 앞서 가능한 작은 변수를 사용하는 것이 좋습니다. 이유는 RL78 명령 체계와 범용 레지스터 구성이 1 바이트 크기 2 바이트 크기를 대상으로하기 때문입니다. 또한 국소 변수의 개수에도 좌우되지만, 위의 예처럼 불과 1 개의 국소 변수이면 기본昀適 옵션 설정 (-qx2) 경우 char 형과 int 형의 국소 변수 CPU 내부의 범용 레지스터에 할당 있습니다. 결과, 스택 영역은 사용하지 않고 범용 레지스터를 사용한 컴파일 결과가 1 바이트 크기도 2 바이트 크기에서도 거의 같은 성능 결과입니다.

4 바이트 크기

소스 프로그램 컴파일 결과


 

크기

스피드

char

13

110

int

14

111

long

40

209

 

4바이트 크기 4 바이트 크기의 국소 변수의 경우, CPU 내부의 범용 레지스터 자주 붙지 않고,

1 명령으로 작업을 없기 때문에 성능이 크게 저하됩니다. 전역 변수 · 지역 변수에 관계없이 가능한 1 바이트 크기 또는 2 바이트 크기의 변수를 사용하십시오

 

 

 

 

 

 

 

 

 

 

부호 정수와 부호없는 정수 (signed char / unsigned char)

같은 크기의 정수의 경우, 부호 (signed) 부호없는 (unsigned) 부호없는 (unsigned) 형이 효율적인 명령에 배포됩니다.

 

부호 정수 부호없는 정수 (signed int / unsigned int)

왼쪽의 내용은 short 형이나 int 형도 마찬가지입니다. 동일한 크기의 정수의 경우, 부호 (signed) 부호없는 (unsigned) 부호없는 (unsigned) 형이 효율적인 명령에 배포됩니다.

 

 

기본昀適 옵션 설정 (-qx2) 경우, 국소 변수 (자동 변수) CPU 내부 레지스터 범용 레지스터 HL 할당됩니다. 따라서 signed char / unsigned char 형의 1 바이트 크기의 국소 변수의 경우 스택 프레임을 사용하지 않으면 2 개까지는 범용 레지스터 HL 할당 있습니다.

 

       

국소 변수 할당을위한 레지스터 HL (2 바이트 크기) signed short / unsigned short / signed int / unsigned int 형의 2 바이트 크기의 국소 변수의 경우, 상단의 예에서 있듯이, 범용 레지스터 HL 할당 수있는 개수는 1 개입니다. 하단의 예와 같이 2 이상의 지역 변수를 선언하면 스택 영역에 할당 스택 프레임 작업을 위해 범용 레지스터 HL 사용됩니다.

 

 

 

 

 

 

 

 

 

3.2 char 형의 취급

"char 형을 unsigned char 간주"옵션

 

컴파일 옵션

최적화

최적화 : (고급)

최적화 (고급)

⑤ char 형식을 unsigned char 간주 :

아니오 (기본값)

 

"char 형을 unsigned char 간주"옵션

3.1 내용에서 있듯이, RL78 제품군에서는 변수 형식으로 unsigned char 형이 가장 효과 라고합니다. 그러나 C 언어의 언어 사양에 부호 지정이없는 단순한 char 형은 signed char 형과 unsigned char 형의 어디에서 취급하는지가 정해져 있지 않고, RL78 패밀리 컴파일러에서는 다른 정수와 같이 signed char 취급합니다. 따라서 단순한 char 형은 unsigned 부호 지정을 char 형보다 성능이 떨어지는 것입니다.

그래서 RL78 패밀리 컴파일러는 "char 형을 unsigned char 간주"옵션 (-qu) 부호 지정이없는 단순한 char 형을 unsigned char 형으로 취급 수있게되어 있습니다.

 

 

        


소스 프로그램 컴파일 결과 (아니, signed char )

 

 

"char 형을 unsigned char 간주"옵션의 효과

기본 옵션 설정의 경우, char 형은 signedchar 형식으로 처리됩니다. 따라서 상단의 컴파일 결과 5 번째, 6 번째 줄에서 있듯이, 부호가 비교를 수행합니다. 한편 'char 형을 unsigned char 간주 "옵션 (-qu) 설정 경우, char 형은 unsigned char 형으로 처리됩니다. 결과, 하단의 컴파일 결과 5 번째 줄에서 있듯이, 부호없이 비교를 수행합니다.

 

컴파일 옵션

최적화

최적화 : (고급)

최적화 (고급)

⑤ char 연산을 부호 확장한다 : (기본값)

아니오

 

 

"char 연산을 부호 확장하지 않는"옵션 RL78 제품군은 1 바이트 크기의 signed char 형과 unsigned char 형을 사용한 연산이 가장 성능을 발휘할 있지만, C 언어의 언어 사양에서는 char 크기로 연산을 수없이, 정수 연산은昀低에서도 int 형으로 것을 의무화하고 있습니다. 결과 C 언어 문법을 준수하는 RL78 제품군의 성능을 발휘하지 못하고, 효율을 저하시킬 있습니다. "char 연산을 부호 확장하지 않는"옵션 (-qc) 정수 연산昀低라인을 char 형으로 인하 연산을 char 크기함으로써 RL78 제품군의 성능을 발휘하기위한 옵션입니다 .

 

 

 

 

 

 

 

 

ANSI 규격 (int 16 비트 부호있는 표현이 2 보수시의 해석)

· 한편이 unsigned long 형이라면 다른도 unsigned long 형으로 변환하고 연산 결과도 unsigned long 형이다.

· 한편이 long 형이라면 다른도 long 형으로 변환하고 연산 결과가 long 형이된다.

· 한편이 unsigned int 형이라면 다른도 unsigned int 형으로 변환하고 연산 결과도 unsigned int 형이된다. · 상기 이외는 피연산자 수를 int 변환하여 연산 결과가 int형이된다.(signedchar , unsigned char int 확장 연산을 수행하고 결과는 int형이된다.)

· 10 진수 상수 값의 할당은 int → unsigned int → long → unsigned long형이다.

· 접미사 u, U   unsigned , l, L long , 양자를 사용하면 unsigned long 형이다.

 

"char 연산을 부호 확장하지 않는"옵션 (-qc) 설정시의 해석

· 한편이 unsigned long 형이라면 다른도 unsigned long 형으로 변환하고 연산 결과도 unsigned long 형이다.

· 한편이 long 형이라면 다른도 long 형으로 변환하고 연산 결과가 long 형이된다.

· 한편이 unsigned int 형이라면 다른도 unsigned int 형으로 변환하고 연산 결과도 unsigned int 형이된다. · 한편이 int 형이라면 다른도 int 변환하여 연산 결과가 int 형이된다.

· 한편이 unsigned char 형이라면 다른도 unsigned char 형으로 변환하고 연산 결과도 unsigned char형이된다.

· 상기 이외는 signed char 형으로 연산을 수행하고 결과는 signed char형이된다.

· 10 진수 상수 값의 할당은 char → unsigned char → int → unsigned int → long → unsigned long형이다.

· 접미사 u, U   unsigned , l, L long , 양자를 사용하면 unsigned long 형이다.

 

 

"char 연산을 부호 확장하지 않는"옵션 설정시 문법 해석

 

"char 연산을 부호 확장하지 않는"옵션 (-qc) 설정시는 char 형이 정수 연산의昀低라인입니다. 또한, signed char 형과 unsigned char 형에 관해서는 다른 정수처럼 부호없는 형식의 signed char 형보다 unsigned char 형의 분을 것으로 해석합니다. 이런 문법 해석을 적용하여 RL78 제품군의 성능을 끌어 내려고합니다. 그러나 한편으로 문법 해석의 변경에 의해 이식성이 손상됩니다. 옵션 사용시 이식을 검토 적용하십시오.

 

    
"char 연산을 부호 확장하지 않는"옵션의 효과 (가산) ANSI 표준 C 언어 문법은 정수 연산昀低라인은 int 형입니다. 따라서 범위 -128 ~ +127 char (signed char )끼리의 연산도, int 확장이 이루어지고 연산되므로 연산 결과 200 제대로 구할 있습니다. "char 연산을 부호 확장하지 않는"옵션 (-qc) 설정시 컴파일 결과에서도 3 번째 줄과 6 번째 줄에서 변수 a 변수 b int 확장 가산을 실시하고 있습니다. 이에 대해 "char 연산을 부호 확장하지 않는"옵션 (-qc) 설정하면 int 확장하지 않고 그대로 char (signed char )에서 연산을 수행하고 결과를 char 형으로 생성 있습니다. 따라서 연산 결과 200 표현할 없습니다. 하단의 컴파일 결과에서도 3 행과 4 행에 1 바이트 크기 가산 int 확장을하고 있습니다. 이상과 같이 "char 연산을 부호 확장하지 않는"옵션 (-qc) 설정시는 ANSI 규격의 문법과는 다른 변환 규칙 연산이 수행되기 때문에 이식성이 없습니다. 그러나 RL78 명령 체계가 효과적으로 사용할 있으므로 사용 메모리 실행 속도는 향상됩니다.

 

 

 


 

"char 연산을 부호 확장하지 않는 "옵션의 효과 (곱하기) ANSI 표준 C 언어 문법은 정수 연산昀低라인은 int 형입니다. 따라서 범위 0 ~ +255 unsignedchar 형끼리의 연산도, int 확장이 이루어지고 연산되므로 연산 결과 10000 제대로 구할 있습니다. "char 연산을 부호 확장하지 않는"옵션 (-qc) 설정시 컴파일 결과에서도 4 번째 줄에서 구한 2 바이트 크기의 곱셈 결과를 변수 c 저장합니다. 이에 대해 "char 연산을 부호 확장하지 않는"옵션 (-qc) 설정하면 int 확장하지 않고 그대로 unsigned char 형으로 연산을 수행하고 결과도 unsigned char 형으로 생성됩니다. 따라서 연산 결과 10000 표현할 없습니다. 하단의 컴파일 결과에서도 4 번째 줄에서 구한 2 바이트 크기의 연산 결과의 상위 1 바이트를 5 행으로 클리어 , 변수 c 저장을하고 있습니다. 이상과 같이 "char 연산을 부호 확장하지 않는"옵션 (-qc) 설정시는 ANSI 규격의 문법과는 다른 변환 규칙 연산이 수행되기 때문에 이식성이 없습니다. 그러나 RL78 명령 체계가 효과적으로 사용할 있으므로 사용 메모리 실행 속도는 향상됩니다.

 

컴파일 옵션

기능 확장

함수 int 확장을 비활성화 :

아니오 (기본값)

 

 

"함수 int 확장을 해제"옵션 RL78 패밀리 컴파일러는 함수의 signed char 형과 unsigned char 형의 인수와 반환 값을 int 확장 여부를 "함수 int 확장을 비활성화" 옵션 (-zb) 의해 전환 있도록되어 있습니다. 기본값은 int 확장이 유효하지만 3-10 페이지에서 소개 "char 연산을 부호 확장하지 않는"옵션 (-qc) ""설정하면, 옵션의 설정도 "" 전환하는 것이 좋습니다.

。  

 

"함수 int 확장을 해제"옵션의 효과 "함수 int 확장을 해제"옵션 (-zb) 설정되어 있지 않은 경우, 인수 반환 int 확장 사용을 위해 상단 컴파일 결과 6 번째 줄과 11 번째 줄에서 있듯이, char 형의 인수와 반환 값은 int 형식으로 확장됩니다. 한편, "함수의 int 확장을 해제"옵션 (-zb) 설정되어있는 경우, 인수 반환 int 확장이 무효가되기 때문에, 하단의 컴파일 결과에서 있듯이, char 형의 인수 반환 값은 그대로 전달됩니다.

 

 

 

3.3 제곱 나누기 사양

mulu 함수 (곱셈)

 

크기

스피드

아니오 옵션 설정시

10

5

, 옵션 설정시

11

6

mulu 함수 사용시

11

6

 

 

mulu 함수 (곱셈)

unsigned char 형끼리의 나눗셈 결과는 페이지의 "char 연산을 부호 확장하지 않는"옵션 (-qc) 설정에 따라 결과가 달라집니다. 만약 이식성을 유지하면서, "char 연산을 부호 확장하지 않는"옵션 설정에 좌우되지 않도록하는 경우 mulu 함수를 이용하십시오. mulu 함수는 # pragmamul 지령을 선언하는 것으로 이용 가능합니다.

【사양】

#pragma mul

 

unsigned int mulu(x, y); unsigned char x; unsigned char y; x y 부호없는 곱셈합니다.

 

크기

스피드

int * int → int

20

11

int 형끼리의 곱셈 결과 ANSI 표준 C 언어 문법은 int 형끼리의 곱셈 결과는 int 형입니다. 따라서 int 형이 16 비트 마이크로 컴퓨터에서 위의 식에 10,000 × 10,000 결과이다 100,000,000 (1 ) 요구할 없습니다.

 

long 형을 이용한 곱셈 결과

크기스피드int * int → int2011long * int → long8152 long 형을 이용한 곱셈 결과 만약 16 비트 int 형끼리의 곱셈 결과를 제대로 32 비트에서 구하기 위해서는, 곱셈을 32 비트에서해야합니다. ANSI 표준 C 언어 문법에서는 한이 long 형의 경우, 한편도 long 형으로 변환하고 연산을 수행하고 결과를 long 형에서 구할 수 규정되어 있습니다. 따라서 10,000 × 10,000의 결과이다 100,000,000 (1 억)을 제대로 찾으려면, 위의 예와 같이 한쪽을 long 형의 변수에 할당하고 다른과 곱셈하는 것입니다. 그러나 32 비트끼리의 곱셈을 할 수 있으므로 사용 메모리 및 실행 속도가 모두 감소하게됩니다. mulsw 함수 (곱셈) 크기스피드int * int → int2011long * int → long8152mulsw 함수 사용시168 muluw 함수 (곱셈) 전 페이지까지의 내용, 즉 int 형 끼리는 정확한 곱셈 결과가 요구되지 않는, long 형을 사용하면 성능이 저하한다고 말했다 양자의 문제점을 해결하기 위해 RL78 패밀리 용 컴파일러는 int 형끼리의 곱셈 결과를 long 형으로 요구 mulsw 함수 와 unsigned int 형끼리의 곱셈 결과를 unsigned long 형으로 요구 muluw 함수가 준비되어 있습니다. 이러한 함수 unsigned char 형끼리의 곱셈 결과를 unsigned int 형으로 요구 mulu 함수와 마찬가지로 # pragmamul 지령을 선언하는 것으로 이용 가능합니다.  

 

 

【사양】 #pragma mul

unsigned long muluw(x, y); unsigned int x; unsigned int y; x y 부호없는 곱셈합니다.

# pragma mul

signed long mulsw(x, y); signed int x; signed int y; x y 부호 곱합니다.

 

 

 

 

divuw 함수 (나누기)


 

크기

스피드

나누기 연산자 사용시

35

33

divuw 함수 사용시

36

34

 

divuw 함수 (나누기)

 

RL78 패밀리 컴파일러는 unsigned int 형과 unsigned char 형의 나누기 연산을 요구 divuw 함수가 준비되어 있습니다. divuw 함수는 # pragma div 지령을 선언하는 것으로 이용 가능합니다.

그러나 RL78 경우 divuw 함수를 사용하지 않고 그대로 "/" 나누기 연산자를 사용해도 "昀適 (표준)"옵션 (-qx2) 설정하면 성능 차이는 거의 없습니다. "/" 나누기 연산자를 사용하여 "昀適 (속도 우선)"옵션 (-qx1) 설정하면 성능이 향상됩니다. 기존 제품의 78K 경우 divuw 함수를 사용하여 성능을 향상시킬 있었지만, RL78 경우 변화가 없습니다. 따라서 나누기 관해서는 divuw 함수를 사용할 필요가 없다고 있습니다.

 

【사양】 #pragma div

unsigned int divuw(x, y); unsigned int x; unsigned char y; x y 부호없는 나누고 몫을 반환합니다.

 

 

 

moduw 함수 (나머지)

 

크기

스피드

나머지 연산자 사용시

39

37

moduw 함수 사용시

37

35

   

moduw 함수 (나머지)

 

RL78 패밀리 컴파일러 unsigned int 형과 unsigned char 형의 나머지 결과를 요구 moduw 함수가 준비되어 있습니다. moduw 함수 # pragma div 지령을 선언하는 것으로 이용 가능합니다.

그러나 RL78 경우 moduw 함수를 사용하지 않고 그대로 "%"나머지 연산자를 사용해도 "昀適 (표준)"옵션 (-qx2) 설정하면 성능 차이는 거의 없습니다. "%" 나누기 연산자를 사용하여 "昀適 (속도 우선) 옵션"(-qx1) 설정하면 성능이 향상됩니다. 기존 제품의 78K 경우 moduw 함수를 사용하여 성능을 향상시킬 있었지만, RL78 경우 변화가 없습니다. 따라서 나머지에 관해서는 moduw 함수를 사용할 필요가 없다고 있습니다.

 

【사양】 #pragma div

unsigned char moduw(x, y); unsigned int x; unsigned char y; x y 부호없는 나누어 나머지를 반환합니다.

     

 

 

"적화 연산기를 사용하는"옵션 아래의 곱셈과 나눗셈 일본 재래의 주산 명령은 확장 명령 때문에 78K, 78K0R, RL78 제품마다 탑재 / 탑재가 다릅니다.

• MULHU (부호없는 16 비트 멀티)  

• MULH (부호있는 16 비트 멀티)  

• DIVHU (부호없는 16 비트 나누기)  

• DIVWU (부호없는 32 비트 나누기)  

• MACHU (부호없는 일본 재래의 주산 (16 비트 × 16 비트) +32 비트)  

• MACH (부호 일본 재래의 주산 (16 비트 × 16 비트) +32 비트) RL78 경우, 제곱 나누기 명령은 이전 페이지까지 소개 # pragma mul / div 의해昀適 명령에 배포되지만, 적화 연산에 대해서는 연산기 / 명령에 의해 지원 방법이 다릅니다.

또한 명령이 아니라 적화 연산기를 탑재하는 경우, "적화 연산기를 사용하는"옵션은 연산기를 사용하거나 라이브러리를 사용하는 방법을 전환 있도록되어 있습니다. 명령어를 지원하는 경우, 위의 "적화 연산기를 사용하는"옵션은 존재하지 않습니다.

 

【사양】 #pragma mac

unsigned long macuw( x, y, z );

unsigned long x;

unsigned int y;

unsigned int z;

x + (y * z) 부호없는 적화 연산을 수행하고 연산 결과를 반환합니다

     

 

크기

스피드

연산 장치를 사용 (RL78/G13)

148

258

라이브러리를 사용 (RL78/G13)

221

4845

적화 명령을 사용 (RL78/G14)

132

108

 

적화 연산의 코딩

적화 연산은 # pragma mac 지령을 선언하고 부호없는 형식의 적화 연산이면 macuw 함수 부호 형이면 macsw 함수를 사용합니다. 적화 명령을 지원하고도 적화 연산기를 지원하지 않아도 macuw 함수 / macsw 함수의 컴파일 결과는 동일하며 런타임 라이브러리를 사용하는 것입니다. 그러나 호출 런타임 라이브러리의 본체가 적화 명령의 유무, "적화 연산기를 사용하는"옵션 설정에 따라 달라집니다. 역시 적화 연산 기나 적화 연산을 사용하는 것이 라이브러리를 사용하는 것보다 성능이 우수하다고 말할 있습니다.

 

【사양】 #pragma mac

signed long macsw(x, y, z); signed long x; signed int y; signed int z; x + (y * z) 부호 적화 연산을 수행하고 연산 결과를 반환합니다 .

 

 

3.4 saddr 공간 활용 "자동 변수를 레지스터 또는 saddr 영역에 할당"옵션

 

"자동 변수를 레지스터 또는 saddr 영역에 할당"옵션 RL78 패밀리 컴파일러는 기본적으로 "자동 변수를 레지스터 또는 saddr 영역에 할당 "옵션 (-qv) 설정되어 있습니다. 따라서 함수 내부의 국소 변수 (자동 변수) 자동으로 CPU 내부 레지스터에 할당됩니다. 물론이 옵션을 "아니오" 설정하면 함수 내부의 국소 변수 (자동 변수) 스택 영역에 할당됩니다.

 

컴파일 결과 (옵션 설정시)

컴파일 결과 (옵션 설정시)

 

크기

스피드

, 옵션 설정시

11

99

아니오 옵션 설정시

20

112

 

 

"자동 변수를 레지스터 또는 saddr 영역에 할당"옵션의 효과 (1 바이트) "자동 변수를 레지스터 또는 saddr 영역에 할당"옵션 (-qv) 설정되어있는 경우, 국소 변수

(자동 변수) CPU 내부 레지스터 범용 레지스터 HL 할당됩니다. 따라서 signedchar / unsigned char 형의 1 바이트 크기의 국소 변수의 경우 3-6 페이지에서 소개 한대로, 스택 프레임을 사용하지 않으면 2 개까지는 범용 레지스터 HL 할당 있습니다.

반대로 "자동 변수를 레지스터 또는 saddr 영역에 할당"옵션 (-qv) 구성되지 않은 경우, 국소 변수 (자동 변수) 모든 스택 영역에 할당됩니다. 또한 RL78 제품군의 경우 후속으로 소개하는 "레지스터 변수를 saddr 영역에 할당"옵션 (-qr) 설정하지 않으면, 국소 변수 (자동 변수) saddr 영역에 할당 수는 없습니다.

 

 

소스 프로그램

컴파일 결과 (옵션 설정시)

컴파일 결과 (옵션 설정시)


 

크기

스피드

, 옵션 설정시

12

100

아니, 옵션 설정시

19

112

 

"자동 변수를 레지스터 또는 saddr 영역에 할당"옵션의 효과 (2 바이트) "자동 변수를 레지스터 또는 saddr 영역에 할당 "옵션 (-qv) 설정되어있는 경우, 국소 변수

(자동 변수) CPU 내부 레지스터 범용 레지스터 HL 할당됩니다. 따라서 signedshort / unsigned short / signed int / unsigned int 형의 2 바이트 크기의 국소 변수의 경우 3-7 페이지에서 소개 한대로, 스택 프레임을 사용하지 않으면 1 개만 범용 레지스터 HL 할당 있습니다.

반대로 "자동 변수를 레지스터 또는 saddr 영역에 할당"옵션 (-qv) 구성되지 않은 경우, 국소 변수 (자동 변수) 모든 스택 영역에 할당됩니다. 또한 RL78 제품군의 경우 후속으로 소개하는 "레지스터 변수를 saddr 영역에 할당"옵션 (-qr) 설정하지 않으면, 국소 변수 (자동 변수) saddr 영역에 할당 수는 없습니다.

 

"레지스터 변수를 saddr 영역에 할당"옵션 RL78 패밀리 컴파일러는 "레지스터 변수를 saddr 영역에 할당"옵션 (-qr) 레지스터 변수를 saddr 영역에도 할당 가능 해지고 있습니다. 그러나 RL78 제품군의 경우, "레지스터 변수를 saddr 영역에 할당"옵션 (-qr) 설정하면 그만큼 성능이 향상되지 않습니다. 기존 제품의 78K 달리 버스 구성과 명령 체계를 강화하고 있기 때문에, saddr 영역도 스택 영역도 같은 성능입니다. 반대로 saddr 영역을 이용하기에 앞서 해당 지역의 대피 · 복귀가 필요합니다. 5 장과 6 장에서 소개하는 인터럽트 함수의 경우, 처리 성능 저하를 초래할 가능성도 있기 때문에이 옵션은 설정하지 않는 것이 좋습니다.

 

컴파일 결과 (옵션 설정시)

 


 

크기

스피드

아니오 옵션 설정시

36

240

 

"레지스터 변수를 saddr 영역에 할당"옵션의 효과 ( 설정시) " 레지스터 변수를 saddr 영역에 할당 "옵션 (-qr) 구성되지 않은 경우, unsigned int 형의 국소 변수는 1 밖에 레지스터에 할당 없습니다. 따라서 위와 같이 unsigned int 형의 국소 변수가 2 개있는 경우 모든 스택 영역에 할당됩니다.

 

컴파일 결과 (옵션 설정시)

 

 

"레지스터 변수를 saddr 영역에 할당"옵션의 효과 (설정시)

"레지스터 변수를 saddr 영역 할당 "옵션 (-qr) 설정되어있는 경우 범용 레지스터 HL 이외에 saddr 영역에 국소 변수 (자동 변수) 할당 있습니다. 컴파일 결과 11 번째, 12 번째, 16 번째 줄에서 사용되는 _ @ KREG14 레지스터 변수에 대한 saddr 영역입니다.

그러나 레지스터 변수의 saddr 영역은 사용하는데있어서 원하는 영역의 대피 · 복귀가 필요합니다. 컴파일 결과 3 번째, 4 번째 줄이 대피 처리, 21 번째, 22 번째 줄이 복귀 처리합니다. 또한 레지스터 변수 외에도 RL78 패밀리 컴파일러 saddr 영역을 44 바이트 차지합니다. 다음 페이지에 RL78 패밀리 컴파일러 예약 saddr 영역의 기호 이름을 보여줍니다.

 

 

 

 

레지스터 변수 워크 세그먼트 정보 저장 런타임 라이브러리 인수

0FFEB4H에서 0FFEDFH까지 44 바이트

 

 

saddr 영역 레이블 목록 RL78 패밀리 컴파일러는 위에 설명 레이블 이름으로 saddr 영역을 참조합니다. 예를 들어 3-17 페이지 3-18 페이지 3-19 페이지의 곱셈 처리에 소개 런타임 라이브러리를 호출하면 _ @ RTARGn saddr

영역이 사용됩니다. 또한 "레지스터 변수를 saddr 영역에 할당"옵션 (-qr) 설정하면, 레지스터 변수의 saddr 영역이다 _ @ KREGn 사용됩니다. 결과, 사용자가 위의 saddr 영역을 사용할 없습니다. 이것이 2-10 페이지에서 소개 RL78 패밀리 컴파일러가 특정 목적으로 사용하는 44 바이트의 영역의 정체입니다.

 

 

 

 

 

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

RL78 컴파일러 사용 10  (0) 2013.04.05
RL78 컴파일러 사용 9  (0) 2013.04.05
RL78 컴파일러 사용 7  (0) 2013.04.05
RL78 컴파일러 사용 6  (0) 2013.04.05
RL78 컴파일러 사용 5  (0) 2013.04.05

 

 

2.4 링크 목록 링크 목록 (1)

 

 

링크 목록

링크했을 때의 링크 목록은 링크 지시어 파일에서 지정한 영역 , 섹션, 입력 파일에 나누어 출력됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

링크 옵션

링크 목록

연결리스트 파일을 출력 : (기본값)

아니오

 

 

"링크 목록 파일을 출력하는"옵션 링크 목록 파일을 출력하기에 앞서, "링크 목록 파일을 출력하는"옵션

(p)의지정이 필요하지만, 옵션은 기본적으로 설정되어 있습니다. 또한 출력 링크 목록 파일은 프로젝트 트리 빌드 생성 파일의 확장자 "***. map"에서 참조 가능합니다. 원하는 파일을 더블 클릭하면, 편집기에서 링크 목록 파일의 내용을 참조 있습니다.

 

   

컴파일 옵션

시작

표준 라이브러리 고정 영역을 사용 : (기본값)

아니오

 

 

표준 라이브러리 고정 영역

2-2 페이지에서 소개 한대로 시작은 가능한 표준 시작 (라이브러리) 사용하십시오. 그러나 표준 시작은 기본적으로 표준 라이브러리 고정 영역으로 186 바이트를 사용합니다. 만약 생성 시스템에서 표준 라이브러리 brk, sbrk, malloc, calloc, realloc, free, exit, rand, srand, div, ldiv, strtok, atof, strtod, 수학 함수, 부동 소수점 런타임 라이브러리를 사용하지 않기 때문에있는 당신이 표준 라이브러리 고정 영역은 삭제할 있습니다. 컴파일 옵션에서 시작 카테고리에있는 "표준 라이브러리 고정 영역을 사용하는"옵션을 "아니오" 설정하십시오. 다음 페이지에이 옵션이 ""때와 "아니오"시의 링크 목록을 제공합니다.

 

표준 라이브러리 고정 영역의 링크 목록 파일

표준 라이브러리 고정 영역을 사용하는 경우

표준 라이브러리 고정 영역을 사용하지 않는 경우

 

표준 라이브러리 고정 영역의 링크 목록 파일 슬라이드 상단이 기본 설정의 표준 라이브러리 고정 영역을 사용하는 경우 링크 목록 파일입니다 .

시작 @ cstart RAM 000BAH (186 바이트) 고정 영역을 사용하는 것을 있다고 생각합니다. 슬라이드 하단 표준 라이브러리 고정 영역을 사용하지 않는 경우의 링크 목록 파일입니다.

시작 @ cstart RAM 사용하던 공간이 약간 00002H (2 바이트) 감소 것을 있다고 생각합니다.

이상과 같은 시스템에서 표준 라이브러리 brk, sbrk, malloc, calloc, realloc, free, exit, rand, srand, div, ldiv, strtok, atof, strtod, 수학 함수, 부동 소수점 런타임 라이브러리를 사용하지 않는다면, "표준 라이브러리 고정 영역을 사용하는"옵션을 "아니오" 설정하십시오.

 

 

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

RL78 컴파일러 사용 9  (0) 2013.04.05
RL78 컴파일러 사용 8  (0) 2013.04.05
RL78 컴파일러 사용 6  (0) 2013.04.05
RL78 컴파일러 사용 5  (0) 2013.04.05
RL78 컴파일러 사용 4  (0) 2013.04.05

 

2.1 시작 샘플 프로그램 시작 등록

 

 

 

시작 등록

프로젝트 생성시 시작은 기본 샘플 (표준 시작 라이브러리) 자동으로 연결되도록되어 있습니다. 따라서, 프로젝트 트리의 시작 폴더에 아무것도 등록되어 있지 않지만, 빌드는 문제없이 수행 있습니다.

그러나 사용자 시스템 쪽에서 시작을 수정해야 있다면, CubeSuite + 설치 폴더보다 시작 샘플 복사하고 원하는 프로젝트에 등록합니다. 필요한 시작 샘플 프로그램은 헤더 파일이 소스 파일이 하나 있습니다.

 

 

헤더 파일 : def.inc  

헤더 파일 : macro.inc  

소스 파일 : 표준 라이브러리를 사용하는 경우 cstart.asm 표준 라이브러리를 사용하지 않으면 cstartn.asm 3 개의 샘플 프로그램을 프로젝트 폴더에 복사하고 원본 파일 프로젝트에

등록하고,사용자 시스템 사정에 따라 내용을 수정합니다.

 

【주의 사항】 표준 시작 (라이브러리) 사용하지 않는 경우, 조립 옵션의 정의 매크로 항목에서 샘플 IF 제어 명령에서 참조하는 다양한 기호를 적절한 값으로 설정해야합니다. 따라서 시작에 관해서는 표준 시작 (라이브러리) 사용하는 것을 권장합니다.

 

 

표준 시작 사용 해제 만약 표준 시작이 아니라 사용자 시스템 고유의 시작을 사용하는 경우 컴파일 옵션설정이 필요합니다.

위의 설정은 표준 시작 사용을 해제합니다. 다음 페이지에서 위의 설정에서 사용 가능해진다

 

 

 

 

 

 

시작 샘플 프로그램입니다.

 

浮動小数点ライブラリの シンボル定義 (부동 소수점 라이브러리의 심볼 정의)

定義ドウェア初期化関数シンボル(사용자 정의 하드웨어 초기화 함수 기호)

スタックポインタやユ定義ドウェア初期化関数、スタック領域初期化関数C言語変数領域のスタトおよびエンドアドレスシンボルなどの外部参照指定 (스택 포인터와 사용자 정의 하드웨어 초기화 함수 스택 영역 초기화 함수 C 언어 변수 영역의 시작과 주소 기호 등의 외부 참조 지정)

スタック領域初期化関数シンボル (스택 영역 초기화 함수 기호)

スタック解決用シンボル (스택 해결 기호)

リセットベクタのスタトアッププログラムの先頭シンボル「_@cstart 」を設定 (리셋 벡터의 등록 시작 프로그램의 시작 기호 '_ @ cstart " 설정)

スタトアッププログラムの 先頭シンボル「_@cstart (시작 프로그램의 시작 기호 '_ @ cstart ")

 

レジスタバンクの設定(バンク0設定) (레지스터 뱅크의 설정 (뱅크 0으로 설정))

ミラー領域00000h0FFFFh/100001FFFFh)の設定 「ミラー領域指定」オプション(-mi)の反映

(미러 영역 (00000h ~ 0FFFFh/10000 ~ 1FFFFh) 설정 "미러 영역 지정"옵션 (-mi) 값을 반영)

スタックポインタの初期化(스택 포인터 초기화)

定義ドウェア初期化関数(사용자 정의 하드웨어 초기화 함수 호출)

スタック領域初期化 (스택 영역의 초기화)

saddr領域のゼロクリア (saddr 영역의 제로 클리어)

@@R_INITセクションから@@INITセクションへの初期値のコピ

(@ @ R_INIT 섹션에서 @ @ INIT 섹션에 초기 복사)

 

 

@@RLINITセクションから@@INITLセクションへの初期値のコピ

(@ @ RLINIT 섹션에서 @ @ INITL 섹션에 초기 값 복사)

@@DATAセクションのゼロクリア (@ @ DATA 섹션 제로 클리어)

@@DATALセクションのゼロクリア (@ @ DATAL 섹션 제로 클리어)

@@R_INISセクションから@@INISセクションへの初期値のコピ

(@ @ R_INIS 섹션에서 @ @ INIS 섹션에 초기 값 복사)

@@DATSセクションのゼロクリア (@ @ DATS 섹션 제로 클리어)

main関数 (main 함수 호출)

各種セクションの宣言 (각종 섹션 선언)

 

 

【주의 사항】 표준 시작 (라이브러리) 사용하지 않는 경우, 조립 옵션의 정의 매크로 항목에서 샘플 IF 제어 명령에서 참조하는 다양한 기호를 적절한 값으로 설정해야합니다. 따라서 시작에 관해서는 표준 시작 (라이브러리) 사용하는 것을 권장합니다.

 

 

1 : / *********************************************** ******************** /

2 : / * Sample for hdwinit.c * /

3 : / *************** ************************************************** ** /

4 : # pragma sfr / / Used Peripheral

5 :

6 : void hdwinit(void)

7 :

{8: / / 사용자 고유의 하드웨어 초기화 처리를 기술  

9 :}

 

hdwinit 함수는 주변 기능 (sfr) 초기 설정을하는 함수로 사용자가 필요에 따라 만들 있습니다.

hdwinit 함수를 작성하여 main 함수 실행 전에 초기 설정을 수있게됩니다.

사용자가 hdwinit 함수를 작성하지 않으면, 아무것도하지 않고 반환하는 함수가 연결됩니다.

 

 

 

사용자 정의 하드웨어 초기화 함수 (hdwinit 함수)

 

시작 샘플 프로그램은 main 함수 실행 전에 사용자 고유의 하드웨어 초기화 처리를위한 함수를 호출합니다.

함수는 "사용자 정의 하드웨어 초기화 함수"라고 함수 이름은 "hdwinit"인수와 반환 값은 모두 void 형입니다.

필요한 경우 원하는 함수를 정의하고 함수에 main 함수 실행 전에 하드웨어 초기화 처리를 기술하십시오.

예를 들어, 클럭 발생 회로 등의 설정을 기술하면 좋습니다.

또한, 사용자 정의 하드웨어 초기화 함수이다 hdwinit 함수를 반드시 작성해야한다 것은 없습니다.

만약 main 함수 실행 전에 하드웨어 초기화가없는 경우 작성도 문제 없습니다.

경우는 아무것도하지 않고 반환하는 컴파일러 제공 기능이 자동으로 연결되도록되어 있습니다.

다음 hdwinit 함수를 보여 둡니다.

 

: 고속 온칩 오실레이터를 CPU 클럭으로 사용하는

고속 시스템 클럭 (X1), 서브 시스템 클럭 (XT1) 발진시키는

 

# pragma sfr

void hdwinit(void)

{

CMC  = 0x51; / / X1 Clock Pin, SubClock Pin Enable

OSMC = 0x80; / / Used SubClock Only RTC & IntervalTimer

MSTOP = 0; / / X1 Clock is Ensable

XTSTOP = 0; / / Sub Clock is Ensble

HIOSTOP = 0; / / High Speed ​​OCO Enable

while(OSTC!  = 0xFF ) / / Wait X1 Stabilization Time (13.11ms (X1 =20MHz));

}


스택 해결 심볼 생성 시작 샘플 프로그램은 스택 포인터 설정에서 기호 이름 "_ @ STBEG" 참조하고 있습니다. 표준 시작을 사용하는 경우 원하는 기호는 자동으로 해결되기 때문에 옵션 설정은 필요하지 않지만 자신의 시작을 사용하는 경우 "스택 해결을위한 기호를 생성하는"옵션 (-s) 지정 필요합니다. 컴파일 옵션을 설정하여 스택 해결 심벌이다 "_ @ STBEG" "_ @ STEND" 생성됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.2 메모리 매핑 near 영역과 saddr 영역 배치 섹션 (내장 ROM64K / 내장 RAM5.5K 바이트 버전)

 

near 영역과 saddr 영역 배치 섹션 near 영역과 saddr 영역 배치 섹션은 연결시 번지 지정에 제약이 있습니다. 다음 섹션 종별마다 배치 장소의 제약 메모리 매핑을 보여줍니다.

 

(1) @ @ BITS @ @ INIS @ @ DATS

섹션은 saddr 영역 안에, sfr 영역과 범용 레지스터 영역을 제외한 RAM 배치합니다. RL78/G14 내장 RAM5.5K 바이트 버전이면 FFE20h ~ FFEB3h 배치 가능합니다.

 

(2) @ INIT @ @ DATA

섹션은 데이터 near 영역 안에, sfr 영역과 범용 레지스터 영역을 제외한 RAM 배치합니다. RL78/G14 내장 RAM5.5K 바이트 버전이면 FE900h ~ FFEB3h 배치 가능합니다. 그러나 셀프 프로그래밍기능 데이터 플래시 기능 사용시는 라이브러리가 작업 영역으로 사용할 FE900H-FED09H 영역이 금지됩니다.

 

(3) @ @ CNST 섹션은 00000h ~ 0FFFFh 또는 10000h ~ 1FFFFh ROM 배치합니다. RL78/G14 내장 ROM64K / 내장 RAM5.5K 바이트 버전이라면 02000h ~ 0E8FFh 배치 가능합니다.

 

(4) @ @ R_INIT @ @ R_INIS 섹션은 ROM이면 무엇 번지에서 (다른 영역과 중복해야) 배치 가능합니다. RL78/G14 내장 ROM64K 바이트 버전이라면 00000h ~ 0FFFFh 배치 가능합니다.

 

(5) @ LCODE @ @ CODE 이러한 섹션은 코드 near 영역 ROM 배치합니다. RL78/G14 내장 ROM64K 바이트 버전이라면 00000h ~ 0FFFFh 배치 가능합니다.

【주의 사항】

(4) (5) 관해서는 벡터 테이블 영역 CALLT 테이블 영역 옵션 바이트 영역 온칩 디버그 보안 ID 영역 온칩 디버거 모니터 영역에서 사용하는 영역 배치 없습니다.

 

far領域 (데이터 far 영역)

far領域 (코드 far 영역)

 

far 영역 섹션 far 영역 배치 섹션은 연결시 번지 지정에 제약이 없습니다. ROM / RAM 배치에 오류가 없으면 아무 번지라도 메모리 매핑이 가능합니다.

 

(1) @ @ INITL @ @ DATAL 섹션은 RAM 배치합니다.

(2) @ @ CNSTL @ @ RLINIT @ @ LCODEL @ @ CODEL 섹션은 ROM 배치합니다.

 

 

@ @ CNST 데이터 센터 near 공간 배치이다.

그러나 ROM 영역이어야한다.

그래서 미러 영역에 미러되는 ROM 배치한다.

MAA = 1 ROM 영역이 존재하는 경우 MAA = 0 ROM 영역을 모든 코드 부분 near 영역으로 사용할 있으며 코드 효율성을 향상시킬

 

 

 

미러 영역

 

@ @ CNST 섹션은 본래 데이터 near 영역의 ROM 저장해야합니다.

그러나 데이터 near 영역에는 ROM 존재하지 않기 때문에, 00000h ~ 0FFFFh 또는 10000h ~ 1FFFFh ROM 배치합니다.

이유는 near 영역 수있는 상위 주소 4 비트 명령어 인출하면 자동으로 0 **** h, 데이터 액세스하면 자동으로 F **** h입니다.

따라서 @ @ CNST 섹션을 00000h ~ 0FFFFh 또는 10000h ~ 1FFFFh ROM 배치해도 미러 영역으로 데이터 near 영역 F0000h ~ FFFFFh (하위 16 비트는 동일한 주소)에서 리드 가능하기 때문입니다.

또한 00000h ~ 0FFFFh 또는 10000h ~ 1FFFFh 중을 미러 영역에 반영 시킬지는 다음 페이지의 옵션에 의해 결정하고 표준 시작에서 자동으로 옵션 설정 영역이 미러 영역에 반영됩니다.

【주의 사항】 표준 시작 (라이브러리) 사용하지 않는 경우, 조립 옵션의 정의 매크로 항목에서 "MIRROR" 적절한 값으로 설정해야합니다.

 

 

 

컴파일 옵션

메모리 모델

미러 영역 지정 : MAA = 0 (기본값) , MAA-1

 

 

미러 영역 지정 옵션

00000h ~ 0FFFFh 또는 10000h ~ 1FFFFh 중을 미러 영역에 반영 시킬지는 위의 "미러 영역 지정"옵션 (-mi)에서 결정합니다. 덧붙여 "미러 영역 지정"옵션의 설정 값은 표준 시작하면 프로그램에서 자동으로 반영됩니다.

또한 RL78/G14 내장 ROM64K / 내장 RAM5.5K 바이트 버전의 경우, 내장 ROM 00000h ~ 0FFFFh 밖에없고 미러되지 않는 부트 클러스터 영역이나 내장 RAM 제외하면 MAA = 0 (-mi0) 선택 가능 이어 미러 가능한 영역 02000h ~ 0E8FFh입니다.

 

【주의 사항】 표준 시작 (라이브러리) 사용하지 않는 경우, 조립 옵션의 정의 매크로 항목에서 "MIRROR" 적절한 값으로 설정해야합니다.

 

2.3 링크 지시어 링크 지시어는

링크 지시어는 링커에 사용 가능한 메모리 영역 세그먼트의 배치 , 링크시의 각종 지시하기위한 명령어이며, 파일로 작성합니다 .

링크 지시문에는 종류가 있습니다.  

메모리 지시어 · 구현 메모리 주소를 선언합니다. · 메모리를 여러 영역으로 분할하여 메모리 영역을 지정합니다.  

세그먼트 배치 지시어 세그먼트에 주소 또는 메모리 영역을 지정합니다.

 

메모리 지시어의 형식 MEMORY 메모리 영역 이름 : (시작 주소 크기)/ 메모리 공간 이름

세그먼트 배치 지시어의 형식

MERGE 세그먼트 이름 : AT (시작 주소)] [= 메모리 영역 이름] [/ 메모리 공간 이름

MERGE 세그먼트 이름 : 조인 속성][= 메모리 영역 이름] [/ 메모리 공간 이름

메모리 공간 이름, 결합 특성은 선택적이며, C 언어의 개발 단일 작동하면 지정할 필요가 없습니다.

 

(1) 메모리 지시어

 

구현 메모리 주소를 선언합니다.

메모리를 여러 영역으로 분할하여 메모리 영역을 지정합니다.

 

세그먼트 배치 지시어

세그먼트 (섹션) 주소 또는 메모리 영역을 지정합니다.

 

  1. 메모리 지시어의 형식 MEMORY 메모리 영역 이름 : (시작 주소 크기) / 메모리 공간 이름
  2. 세그먼트 배치 지시어의 형식 MERGE 세그먼트 이름 : AT (시작 주소)] [= 메모리 영역 이름] [/

     

    메모리 공간 이름 MERGE 세그먼트 이름 : 조인 속성] [= 메모리 영역 이름] [/ 메모리 공간 이름

    또한 C 언어로 개발하면 결합 특성을 지정할 필요가 없습니다. 외부 메모리를 연결할 때로드 모듈을 분리 사용합니다. 단일 동작에서 사용할 때는 설정해야합니다.

    메모리 지시문

    · ROM1 영역을 02000h에서 1000h 바이트 확보

    · ROM2 영역을 03000h에서 2000h 바이트 확보

    세그먼트 배치 지시문

    섹션 "@ @ CODE" 02500h에서 배포

    섹션 "@ @ LCODE" ROM2 영역 04500h에서 배포

    섹션 "@ @ R_INIS ''@ @ R_INIT" ROM2 영역에 배치

     

     

     

    링크 지시어 설명 링크 지시문을 포함하는 파일 확장자 dr 또는 dir 만듭니다.

    메모리 지시어는 영역을 정의합니다. 또한 영역 이름은 다음 규칙이 적용됩니다.

    메모리 영역 이름에 사용할 수있는 문자는 A ~ Z, a ~ z, 0 ~ 9, _,? @입니다.  

    그러나 0-9 메모리 영역 이름 앞에는 사용할 없습니다.

    대소 문자를 다른 문자로 구분합니다.  

    대소 문자를 혼합 있습니다.  

    메모리 영역 이름의 길이는昀大256 자입니다.  

    메모리 영역 이름은 전체 메모리 공간을 통해 하나 않으면 안됩니다.  

    숫자 상수를 작성하려면 10 진수 또는 16 진수를 작성할 있습니다.

    • 16 진수의 경우昀後 "H" 지정합니다. 또한, 선두가 A ~ F 경우는 앞에 "0" 지정합니다.

     

    세그먼트 배치 지시문에서는 세그먼트 (섹션) 지정한 메모리 영역에 또는 특정 번지에 배치합니다. 또한 C 언어로 개발을 경우, 세그먼트 이름에는 다음 규칙이 적용됩니다.

    세그먼트 이름 컴파일러가 생성 섹션 이름을 설명합니다.

    지정된 섹션이없는 경우 오류가 발생합니다.  

    동일한 섹션의 세그먼트 배치 지시문을 여러 지정하면 오류가 발생합니다.  

    숫자 상수를 작성하려면 10 진수 또는 16 진수를 작성할 있습니다.  

    • 16 진수의 경우昀後 "H" 지정합니다. 또한, 선두가 A ~ F 경우는 앞에 "0" 지정합니다.

     

     

    링크 지시문은 대상 장치에 따라 자동으로 사용된다 (기본)

    필요한 경우 링크 지시어 파일을 만들어 프로젝트에 등록

     

     

    링크 지시어 파일의 등록 만든 링크 지시어 파일은 프로젝트 트리에 등록합니다. 이렇게 만든 링크 지시어 파일의 내용에 따라 연결이 이루어집니다. 덧붙여 만든 링크 지시어 파일에 기술되지 않은 부분은 기본적으로 링크가 이루어집니다. 따라서 링크 지시어 파일에 만든 시스템의 모든 섹션의 배치 정보를 작성할 필요가 없습니다. 어떤 이유로 특정 섹션을 특정 메모리 영역과 특정 번지에 배치 때만 링크 지시어 파일에 설명을 실시하면 좋은 것입니다.

     

     

    링크 옵션

    입력 파일

    사용하는 링크 지시문 파일 : 없음 (기본)

    파일 이름

     

     

    링크 지시어 파일의 설정 링크 지시어 파일을 만들고 프로젝트 트리에 등록하면 자동으로 링크 옵션에서 입력 파일의 "사용하는 링크 지시어 파일"옵션이 설정됩니다.

     

    메모리 지시문

    · WORK 영역을 FFEB4h에서 76 바이트 확보

    · SADDR 영역을 FFE20h에서 148 바이트 확보

    · STACK 영역을 FFC20h에서 512 바이트 확보

    · RAM 영역을 FE900h에서 4896 바이트 확보

    세그먼트 배치 지시문

    · @ @ DATS @ @ INIS @ @ BITS SADDR 영역에 배치

    · @ @ INIT @ @ DATA RAM 영역에 배치

     

    スタック解決用シンボル (스택 해결 용 기호 )

    기본 설정에있어서, 스택 영역는 링커가 RAM 영역의 Gap (여유 공간) 찾아 , 동적으로 확보합니다

     

     

    스택 크기 변경 기본 설정에서 스택 영역은 링커가 RAM 영역의 가장 Gap (공간) 찾아 자동으로 확보합니다. 따라서 시스템의 스택 영역이 동작에 문제 없다 크기 확보되어 있는지 여부는 애매합니다. 만약 스택 공간을 정확하게 확보하는 경우, 스택 영역을 확보 링크 지시어 파일을 작성하고 등록해야합니다. 위의 예는 스택 영역을 영역 이름 "STACK"에서 FFC20h에서 512 바이트 확보 것입니다.

     

     

    스택 영역 이름 지정

    스택 영역 이름을 링크 지시어 파일에서 확보 경우, 이미 소개 "스택 해결을위한 기호를 생성하는"옵션 (-s) 해당 영역에서 스택 해결 심볼이 생성 되도록 스택 영역 이름을 지정합니다.

    위와 같이 "영역 이름"으로 링크 지시어 파일에서 생성 영역 이름 "STACK" 지정하여 해당 영역에서 스택 해결 심벌 "_ @ STBEG" "_ @ STEND" 생성 있습니다.

     

     

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

RL78 컴파일러 사용 8  (0) 2013.04.05
RL78 컴파일러 사용 7  (0) 2013.04.05
RL78 컴파일러 사용 5  (0) 2013.04.05
RL78 컴파일러 사용 4  (0) 2013.04.05
RL78 컴파일러 사용 3  (0) 2013.04.05

 

  1. 확장 언어 사양
  2. 키워드

     

    키워드 목록

     

    【주】 * ANSI-C 언어 사양 허용-za 옵션 지정시에는 무효가 됩니다

     

    키워드 목록 RL78 패밀리 컴파일러는 위에 설명 키워드를 지원하고 있습니다.

    또한 자세한 내용은 2 이상 차례로 소개합니다.

    그러나이 텍스트는

    • ASM

    절대 번지 배치 지정은 소개하지 않습니다.

    이러한 키워드에 대해서는 설명서를 참조하십시오.

    다음 페이지에 2 상수를 설명하는 키워드의사용을 보여줍니다.

     

     

     

     

     

     

    소스 프로그램 컴파일 결과

     

     

    정수가 기술 가능한 위치에 2 상수를 작성할 있습니다. ·

    이진 상수는 접두사 0b 또는 0B 작성하고 0 또는 1 숫자로 표시합니다

     

    이진 상수 RL78 패밀리 컴파일러는 소스 프로그램 중에 2 진수 상수가 설명 가능합니다.

    이진 상수는 접두사 "0b"또는 "0B" 작성하고 다음 0 또는 1 열에서 숫자를 표현합니다.

     

     

     

     

     

     

     

    ANSI 규정 외의 기능을 무효로하고, ANSI 규정의 일부 기능을 사용합니다.

    구체적으로는 다음 작업을 수행합니다.

     

     

    다음은 예약어는 없습니다. callt / sreg / bit / boolean/ # asm / # endasm

    트라이 ​​그래프 시퀀스 (3 문자 표기) 적용됩니다.

    컴파일러 정의 매크로 __STDC__ 1이됩니다.

    □ far 포인터의 관계 연산을 3 바이트로 실시하는 것으로, 데이터를 64K 바이트의昀後 1 바이트에 배치 가능합니다.  

    int 이외의 비트 필드에 다음 경고를 출력합니다.(CC78K0R warning W0787 : Bit field type is not int)

    □ -qc-zp-zc 옵션에 대해-w2 지정시 다음 경고를 출력합니다.

    (CC78K0R warning W0029 : '-qc'option is not portable)

    (CC78K0R warning W0031 : '-zp'option is not portable)

    (CC78K0R warning W0032 : '-zc'option is not portable)

     □ 각종 # pragma 문에,-w2 지정시 다음 경고를 출력합니다.

    (CC78K0R warning W0849 : # pragma statement is not portable)

     □ __asm ​​문장에 대해,-w2 지정시 다음 경고를 출력하고 어셈블 출력됩니다.

    (CC78K0R warning W0850 : Asm statement is not portable)

    □ # asm ~ # endasm 블록에-w2 지정시 다음의 오류 등을 출력합니다.

    (CC78K0R error E0801 : Undefined control )

     

     

    ANSI-C 언어 사양 허용 옵션

    "ANSI 표준을 준수하는"옵션 (-za) '' 설정 경우, 위의 항목이 변경됩니다. 안에 1-26 페이지에서 소개 키워드의 일부가 무효화와 비트 필드의 형태 지정자로서, int 이외의 것을 사용하면 경고가 출력되는 것이 중요합니다.

    또한, 위의 슬라이드에있는 옵션의 내용은 다음과 같습니다. •-qc : "char 형을 unsigned char 간주"옵션 (3-8 참조)  •-zp : "C + + 형식의 주석 허용"옵션 (컴파일 옵션 확장 카테고리) •-zc : "댓글 중첩 허용"옵션 (컴파일 옵션 확장 카테고리) •-w2 : " 경고 수준 "옵션에 대한 자세한 출력 (컴파일 옵션 메시지 범주)

     

    1.5.2 섹션 구성 near 공간 배치의 C 프로그램이 사용하는 메모리 영역

    배치되는

    섹션 이름

    세그먼트 유형

    재배치 특성

    배치

    1

    함수

    @ @ CODE

    CSEG

    BASE

    000CEh ~ 0FFFFh

    2

    라이브러리 함수

    @ @ LCODE

    CSEG

    BASE

    000CEh ~ 0FFFFh

    3

    값을 변경하지 정적 변수

    @ @ CNST

    CSEG

    MIRRORP

    미러 영역에 미러되는 ROM

    4

    초기 값이없는 정적 변수

    @ @ DATA

    DSEG

    BASEP

    saddr 영역을 제외한 내장 RAM

    5

    초기 값의 정적 변수

    @ @ INIT

    DSEG

    BASEP

    saddr 영역을 제외한 내장 RAM

    6

    초기 값의 정적 변수의 초기

    @ @ R_INIT

    CSEG

    UNIT64KP

    64K 경계를が않는 ROM

     

     

    far 영역 배치 C 프로그램이 사용하는 메모리 영역

    배치되는

    섹션 이름

    세그먼트 유형

    재배치 특성

    배치

    1

    함수

    @ @ CODEL

    CSEG

    -

    2

    라이브러리

    함수

    @ @ LCODEL

    CSEG

    -

    3

    값을

    변경하지 정적 변수

    @ @ CNSTL

    CSEG

    PAGE64KP

    64K 경계를が않는 ROM

    4

    초기 값이없는 정적 변수

    @ @ DATAL

    DSEG

    UNIT64KP

    64K 경계를が않는 RAM

    5

    초기 값의 정적 변수

    @ @ INITL

    DSEG

    UNIT64KP

    64K 경계를が않는 RAM

    6

    초기 값있는 정적 변수의 초기

    @ @ RLINIT

    CSEG

    UNIT64KP

    64K 경계를が않는 ROM

     

     

    saddr 공간 배치의 C 프로그램이 사용하는 메모리 영역

    배치되는

    섹션 이름

    세그먼트 유형

    재배치 특성

    배치

    1

    초기 값없이 sreg 변수

    @ @ DATS

    DSEG

    SADDRP

    saddr 영역

    2

    초기 값이 sreg 변수

    @ @ INIS

    DSEG

    SADDRP

    saddr 영역

    3

    초기 값이 sreg 변수의 초기

    @ @ R_INIS

    CSEG

    UNIT64KP

    64K 경계를が않는 ROM

    4

    bit 변수

    @ @ BITS

    BSEG

    -

    saddr 영역

     

     

    다른 C 프로그램이 사용하는 메모리 영역

    배치되는

    섹션 이름

    세그먼트 유형

    재배치 특성

    배치

    1

    callt 함수 테이블

    @ @ CALT

    CSEG

    CALLT0

    callt 테이블 영역

    2

    인터럽트 함수 c allt 함수

    @ @ BASE

    CSEG

    BASE

    000CEh ~ 0FFFFh

    3

    벡터 테이블

    @ @ VECTnn

    CSEG

    AT 00mmH

    고정 영역

     

     

    섹션 구성 RL78 패밀리 컴파일러가 사용하는 섹션 구성 (기본) 목록을 보여줍니다. 링크의 링크 지시어는 섹션 단위로 번지 지정을 실시하기 때문에, C 언어 소스 프로그램과 섹션의 관계는 이해해야합니다.

     

     

    소스 프로그램 컴파일 결과

     

     

    함수 섹션 이름

    near 공간 배치의 함수는 섹션 이름 "@ @ CODE" 할당합니다. 섹션 "@ @ CODE"세그먼트 유형은 "CSEG"재배치 속성은 "BASE"입니다. far 공간 배치의 함수는 섹션 이름 "@ @ CODEL" 할당합니다. 섹션 "@ @ CODEL"세그먼트 유형은 "CSEG"입니다.

     

    라이브러리 함수 섹션 이름

    near 공간 배치의 라이브러리 함수는 섹션 이름 "@ @ LCODE" 할당합니다. far 공간 배치의 라이브러리 함수는 섹션 이름 "@ @ LCODEL" 할당합니다.

     

    * : 정렬 조건을 조정하기 위해 사용하지 않는 영역

     

     

    값을 변경하지 정적 변수 섹션 이름

    near 영역 배치의 값을 변경하지 정적 변수는 섹션 이름 "@ @ CNST" 할당합니다. 섹션 "@ @ CNST"세그먼트 유형은 "CSEG"재배치 속성은 "MIRRORP"입니다. far 공간 배치의 값을 변경하지 정적 변수는 섹션 이름 "@ @ CNSTL" 할당합니다. 섹션 "@ @ CNSTL"세그먼트 유형은 "CSEG"재배치 속성은 "PAGE64KP"입니다.

     

    초기 값없이 정적 변수 섹션 이름

    near 공간 배치의 초기 값없이 정적 변수는 섹션 이름 "@ @ DATA" 할당합니다. 섹션 "@ @ DATA"세그먼트 유형은 "DSEG"재배치 속성은 "BASEP"입니다. far 공간 배치의 초기 값없이 정적 변수는 섹션 이름 "@ @ DATAL" 할당합니다. 섹션 "@ @ DATAL"세그먼트 유형은 "DSEG"재배치 속성은 "UNIT64KP"입니다.

     

     

     

     

     

     

     

     

    소스 프로그램 컴파일 결과

     

    * : 정렬 조건을 조정하기 위해 사용하지 않는 영역

     

    초기 값이 정적 변수 섹션 이름

    near 영역 배치 값을 초기 값이 정적 변수는 섹션 이름 "@ @ INIT" 할당합니다. 섹션 "@ @ INIT"세그먼트 유형은 "DSEG"재배치 속성은 "BASEP"입니다. far 공간 배치의 초기 값이 정적 변수는 섹션 이름 "@ @ INITL" 할당합니다. 섹션 "@ @ INITL"세그먼트 유형은 "DSEG"재배치 속성은 "UNIT64KP"입니다.

    초기 값이 정적 변수의 초기 값의 섹션 이름

    near 공간 배치의 초기 값이 정적 변수의 초기 값은 섹션 이름 "@ @ R_INIT" 할당합니다. 섹션 "@ @ R_INIT"세그먼트 유형은 "CSEG"재배치 속성은 "UNIT64KP"입니다. far 공간 배치의 초기 값이 정적 변수의 초기 값은 섹션 이름 "@ @ RLINIT" 할당합니다. 섹션 "@ @ RLINIT"세그먼트 유형은 "CSEG"재배치 속성은 "UNIT64KP"입니다.

     

     

     

     

     

    소스 프로그램 컴파일 결과

    ·  sreg / __sreg 선언 정적 변수는 saddr 영역에 자주 나타납니다.

    ·  saddr 영역에 대한 명령은 일반적으로 메모리에 대한 명령보다 짧은 코드 효율이 향상됩니다.

    ·  saddr 영역 FFE20H ~ FFEB3H (148 바이트) 배치 가능합니다.

     

     

    sreg / __sreg 선언

    sreg 선언 또는 __sreg 선언 외부 변수 함수에 static 변수 (이하 sreg 변수라고 부른다) saddr 영역에 할당합니다. saddr 영역에 대한 명령은 일반적으로 메모리에 대한 명령보다 짧은 코드 효율성을 향상시킬 있습니다.

    또한 saddr 영역 FFE20H ~ FFEB3H까지 148 바이트입니다. 이러한 영역을 초과하는 경우 컴파일 오류가 발생합니다.

    【작성 방법】 sreg 형명 변수 이름 / sreg static 형명 변수 이름 __sreg 형명 변수 이름 / __ sreg static 형명 변수 이름 extern sreg 형명 변수 이름 / extern __ sreg 형명 변수

     

     

    【제한 사항】

    • const , 또는 함수에 sreg / __sreg 지정한 경우 경고 메시지를 출력하고 sreg 선언을 무시합니다. • "ANSI-C 언어 사양 허용"옵션 (-za) 지정시는 __sreg에만 유효합니다.  • 2 바이트 크기의 변수의 경우 1로드 모듈 74 개까지 사용할 있습니다. 그러나 bit, boolean

    변수를 사용하는 경우 사용할 수있는 개수는 줄어 듭니다.

     

     

     

     

     

     

     

     

     

     

     

    소스 프로그램 컴파일 결과

     

    * :정렬 조건을 조정하기 위해 사용하지 않는 영역

     

     

    초기 값없이 sreg 변수 섹션 이름

    초기 값없이 sreg 변수는 섹션 이름 "@ @ DATS" 할당합니다. 섹션 "@ @ DATS"세그먼트 유형은 "DSEG"재배치 속성은 "SADDRP"입니다.

     

    초기 값이 sreg 변수 섹션 이름

    초기 값이 sreg 변수는 섹션 이름 "@ @ INIS" 할당합니다. 섹션 "@ @ INIS"세그먼트 유형은 "DSEG"재배치 속성은 "SADDRP"입니다.

     

    초기 값이 sreg 변수의 초기 값의 섹션 이름

    초기 값이 sreg 변수의 초기 값은 섹션 이름 "@ @ R_INIS" 할당합니다. 섹션 "@ @ R_INIS"세그먼트 유형은 "CSEG"재배치 속성은 "UNIT64KP"입니다.


    saddr 영역의 자동 할당 옵션 전항에서 소개 sreg 변수는 함수 static 변수이면 "static 변수를 saddr 영역에 할당"옵션 (-rs) 외부 변수 함수 외부 static 변수 경우 "외부 변수 saddr 영역에 할당 "옵션 (-rd) 의해 자동으로 saddr 영역에 할당 있습니다.

     

    소스 프로그램 컴파일 결과

     

    ·  bit / boolean 변수는 1 비트의 데이터로 간주, saddr 영역에 배치됩니다.

    ·  bit / boolean 변수는 초기 값없이 외부 변수처럼 취급합니다.

    · 비트 변수에 컴파일러는 비트 조작 명령을 출력합니다. · 정수 sreg 변수 (배열 요소, 구조체 제외) 자동으로 bit 변수로 사용할 있습니다.

     

     

    bit 변수 (bit), boolean 변수 (boolean / __boolean)

    bit / boolean / __boolean 변수는 1 비트의 데이터 (이하, bit 변수라고 부른다) 다루어 saddr 영역에 배치됩니다. 이러한 bit 변수는 초기 값없이 외부 변수처럼 취급 원하는 bit 변수에 컴파일러는 비트 조작 명령을 출력합니다. 또한 페이지까지 소개 sreg 변수 (배열의 요소 구조는 제외) 자동으로 bit 변수로 사용할 있습니다.

     

    【작성 방법】

    bit 변수 이름 / boolean 변수 이름 / __ boolean 변수 이름 extern bit 변수 이름 / extern boolean 변수 이름 / extern __ boolean 변수 이름 변수 이름. n (n 0 ~ 31, n 값은 형태에 따라 달라집니다)

     

    【제한 사항】

    배열 요소, 구조체 / 공용체의 멤버 함수의 인수, 자동 변수의 형식으로 사용할 없습니다.  

    초기 값이하고 선언 없습니다. 또한 주소 참조, sizeof 연산을 수행 없습니다.

    • "ANSI-C 언어 사양 허용"옵션 (-za) 지정시는 __boolean에만 유효합니다.  

    • bit 변수 1로드 모듈 昀大1184 개까지 사용할 있습니다. 그러나 sreg 변수를 사용했을 경우와 "saddr 공간 할당"옵션 (-rs-rd) 지정하면 사용 가능한 개수가 줄어 듭니다.

     

    bit 변수 섹션 이름 bit 변수는 섹션 이름 "@ @ BITS" 할당합니다. 섹션 "@ @ BITS"세그먼트 유형은 "BSEG"입니다.

     

    # pragma section 컴파일러 출력 섹션 이름 변경 섹션 이름 [AT 시작 주소]

    컴파일러 출력 섹션 이름 변경 시작 주소를 지정합니다.

    시작 주소를 생략하면 기본 배치됩니다.

    컴파일러 출력 섹션 이름과 기본 배치는 1.5.2 항을 참조하십시오.

    시작 주소는 생략하고 링크 지정할 있습니다.

     

    1 # pragma section @ @ CODE? CODE / / @ @ CODE 섹션을? CODE 변경

    __near void sub​​(void){}

     

    2 # pragma section @ @ DATA? DATA AT 0xFED00 / / @ @ DATA 섹션 ? DATA 변경

    __near int na; // 0xFED00 번지에 위치

    # pragma section @ @ DATA @ @ DATA/ / 이후는 기본 설정으로 복원

    __near int nb; // @ @ DATA 섹션에 배치

     

     

    3 # pragma section @ @ INIT ABC / / @ @ INIT 섹션을 ABC 변경

    __near int nc = 1;/ / 그러나 @ @ R_INIT 그대로

    # pragma section @ @ INIT XYZ/ / @ @ INIT 섹션을 XYZ 변경

    # pragma section @ @ R_INIT VW/ / @ @ R_INIT 섹션도 VW 변경

    __near int nd = 2;

     

     

    # pragma section으로 섹션 이름 변경

    컴파일러가 기본적으로 사용하는 섹션 이름은 # pragmasection 따라 변경 가능합니다.

    단순히 "변경하려는 컴파일러 출력 섹션 이름" "수정 부분 이름" 지정합니다.

    또한, 시작 주소 지정은 선택적이며 생략했을 때는 2 장의 링크 지시어 결정합니다. 다음 # pragma section 사용할 때의주의 사항을 언급한다.

     

    • # pragma 지시자는 C 언어 소스 위에합니다.  

    그러나 다음은 # pragma 지령 전에 설명 있습니다.

    - 댓글 - 전처리 지침 변수의 정의 / 참조 함수의 정의 / 참조를 생성하지 않습니다  

    • # pragma 지시문이 작성된 이후에 데이터를 작성하는 경우, 데이터를 변경 섹션에 배치합니다.  

    다시 변경 지령도 가능하며, 변경 지령 이후에 데이터를 작성하는 경우, 데이터를 다시 변경 섹션에 배치합니다.

     • 이전에 정의 데이터를 변경 다시 정의하면 다시 변경된 섹션에 배치합니다.

     • # pragma 이후 설명하는 키워드 컴파일러 출력 섹션 이름은 반드시 대문자로하십시오.

     • section, AT 대문자 소문자도 대소 문자 혼합으로 작성할 있습니다.  

    변경 섹션 이름의 형식은 어셈블러의 사양을 준수합니다 (세그먼트 이름은 8 자까지 가능).  

    시작 주소는 C 언어의 16 진수 어셈블러의 16 진수에만 적용 있습니다.  

     

    () 시작 샘플 프로그램과의 관계 초기 값의 정적 변수 섹션 이름을 변경하기 때문에 있으면

    변수 / 기본값 함께 섹션 이름을 변경하는 것을 권장합니다. 이유는 2 장의 샘플에서는 초기 값을 복사와 대상 섹션 이름을 1 1 결정되기 때문입니다.

     

     

     

    # pragma section 예제

     

    __near 공간 배치의 함수 섹션 이름

    # pragmasection __near 공간 배치의 함수 섹션 이름을 변경 것입니다. 컴파일 결과의 번째 행이 나타내는대로, sub 함수는 섹션 이름 "? CODE" 할당됩니다.

     

    __near 공간 배치의 초기 값이없는 변수 섹션 이름

    4 번째 줄의 # pragmasection __near 공간 배치의 초기 값이없는 변수 섹션 이름을 변경 묘비 주소 지정도 것입니다. 컴파일 결과 4 번째 줄에서 있듯이 변수 na 시작 주소 "0FED00h"섹션 이름 "? DATA" 할당됩니다.

    그러나 6 번째 줄의 # pragma section으로 __near 공간 배치의 초기 값이없는 변수는 기본 섹션에 다시 있기 때문에 변수 nb 기본 할당됩니다.

     

    __near 공간 배치의 초기 값이있는 변수 섹션 이름

    초기 값의 정적 변수는 섹션에 할당됩니다. 9 번째 줄의 # pragma section __near 공간 배치의 변수 섹션 이름을 변경 것입니다. 따라서 컴파일 결과 10 번째 줄에서 있듯이 변수 nc 할당 섹션 이름은 "ABC" 변경이됩니다 , 초기 값을 할당 섹션 이름은 컴파일 결과 13 행에서 있듯이, 기본값 "@ @ R_INIT"입니다.

    한편, 11 번째 줄에서 12 번째 줄의 # pragmasection에서 변수 할당 섹션 이름과 함께 초기 섹션 이름도 수정하고 있습니다. 따라서 컴파일 결과 16 번째 줄과 19 번째 줄에서 있듯이 변수 섹션 이름은 "XYZ"초기 섹션 이름은 "VW"입니다.

     

    1.5.3 매크로 이름

    매크로 이름 목록

    매크로 이름

    정의

    __LINE__

    시점에서 소스 번호 (10 진수)

    __ FILE__

    지정된 소스 파일의 이름 (문자열 상수)

    __ DATE__

    소스 파일의 번역 날짜 ( "M mm dd yyyy "형식을 가진 문자열 상수 여기서 이름은 ANSI 규격에서 규정 a sctime 함수로 생성되는 (영문자 3 줄로昀初 1 문자 대문자) 동일 . dd昀初문자 값이 10보다 작은 경우 공백합니다)

    __ TIME__

    소스 파일의 번역 시간 (as ctime 함수로 생성되는 시간과 같은 "hh : mm : ss" 형식을 가지는 문자 상수)

    __ STDC__

    10 진수 정수 1 (ANSI 정확한 처리를 지정할 정의)*

    __ K0R__

    10 진수 정수 1

    __ K0R_SMALL__

    10 진수 정수 1 (소형 모델 지정시)

    __ K0R_MEDIUM__

    10 진수 정수 1 (미디엄 모델 지정시)

    __ K0R_LARGE__

    10 진수 정수 1 (대형 모델 지정시)

    __ CHAR_UNSIGNED__

    10 진수 정수 1 (-qu 옵션을 지정한 경우 정의)

    __ RL78__

    10 진수 정수 1 (RL78 패밀리 장치 유형 지정시)

    __ RL78_1__

    10 진수 정수 1 (곱셈과 나눗셈 적화확장 명령어 탑재의 RL78 패밀리 장치 유형 지정시)

    __ RL78_2__

    10 진수 정수 1 (곱셈과 나눗셈 일본 재래의 주산 확장 명령 탑재의 R L78 제품군의 디바이스 유형 지정시)

    __ CA78K0R__

    10 진수 정수 1

    CPU 매크로

    타겟 CP U 나타내는 매크로 에서 10 진수 정수 1 장치 파일의 "품종 지정 이름"으로 표시되는 문자열의 앞에 "__" 끝에 "_" 붙인 것이 정의됩니다 (영문자는 대문자로하십시오)

    【주】 * ANSI-C 언어 사양 허용-za 옵션 지정시에 정의합니다

    매크로 이름 목록 RL78 패밀리 컴파일러는 ANSI 규격에 규정되어있는 매크로 이름 이외에 옵션 지정에 따라 매크로 이름이 ​​정의됩니다. 프로그램 속에서 옵션 설정을 판단 사용합니다.

     

     

     

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

RL78 컴파일러 사용 7  (0) 2013.04.05
RL78 컴파일러 사용 6  (0) 2013.04.05
RL78 컴파일러 사용 4  (0) 2013.04.05
RL78 컴파일러 사용 3  (0) 2013.04.05
RL78 컴파일러 사용 2  (0) 2013.04.05

 

1.4 메모리 모델 메모리 모델 개요

 

 

메모리 모델 RL78 컴파일러에는 3 종류의 메모리 모델이 있습니다. 메모리 모델은 대상 장치의 메모리 스페이스는 사용자가 결정해야합니다.

소형 모델 코드 昀大64K 바이트 데이터 昀大64K 바이트의 128K 바이트 코드 / 데이터 모두 near 영역으로 컴파일합니다.

미디엄 모델 (기본) 코드 昀大1M 바이트 데이터 昀大64K 바이트의 1M 바이트 코드 부는 far 영역 데이터 부는 near 영역으로 컴파일합니다.

대형 모델 코드 昀大1M 바이트 데이터 昀大1M 바이트의 1M 바이트 코드 / 데이터 모두 far 영역으로 컴파일합니다.

 

코드 코드 near 영역昀大64K 바이트이며 00000h ~ 0FFFFh 배치됩니다. 그렇지 코드 부는 far 영역입니다,

昀大1M 바이트이며, 00000h ~ FFFFFh 배치됩니다.

데이터 데이터 부의 near 영역昀大64K 바이트이며 F0000h ~ FFFFFh 배치됩니다. 다른 데이터 부는 far 영역입니다,

昀大1M 바이트이며, 00000h ~ FFFFFh 배치됩니다.

 

 

메모리 모델의 옵션 설정 메모리 모델은 "메모리 모델의 종류" 컴파일 옵션 (-ms/-mm/-ml) 지정합니다. 기본값은 미디엄 모델이되고 있습니다.

 

소스 프로그램 소형 모델에서의 컴파일 결과

미디엄 모델의 컴파일 결과

대형 모델의 컴파일 결과

 

 

메모리 모델 코드 효율 메모리 모델 코드 효율은 위의 설명과 같습니다.

코드 / 데이터 모두昀大64K 바이트의 메모리 모델이 코드 효율 우수합니다.

예를 들어, 소형 모델과 미디엄 모델을 비교하면 데이터 부분은 함께昀大64K 바이트이기 때문에 변수 액세스 코드 효율은 동일합니다.

그러나 코드 부가昀大64K 바이트昀大1M 바이트의 차이가 있기 때문에 함수 호출 코드 효율 미디엄 모델이 나빠집니다.

또한 미디엄 모델 대형 모델을 비교하면 코드 부분은 함께昀大1M 바이트이기 때문에 함수 호출 코드 효율은 동일합니다.

그러나 데이터 부가昀大64K 바이트昀大1M 바이트의 차이가 있기 때문에 변수 액세스 코드 효율성 대형 모델이 나빠집니다.

 

또한, 메모리 모델의 near / far 영역은 프로그래머가 __near / __far 키워드를 지정하여 메모리 모델의 기본 설정에서 변경할 있습니다.

, 소형 모델로 생각하면 시스템 전체 코드 / 데이터 부분을 64K 바이트 이내에 넣을 필요는 없고,

다음 페이지에 표시된 __far 키워드를 지정하여 64K 바이트를 넘는 프로그램 만들기가 가능합니다.

 

 

정적 변수에 대한 near / far 형식 한정자 __near / __far 키워드는 const volatile 형식 변경자와 동일 취급입니다.

기본 변수이면 지정은 어렵지 않지만, 포인터 변수에 양자를 지정하는 경우 형식 한정자 설명 위치에 주의가 필요합니다.

 

함수에 대한 near / far 형식 한정자 함수에 대한 __near / __far 형식 한정자도 취급 변수와 동일합니다.

함수 자체에 대한 지정하면 어렵지 않지만 함수를 포인터 변수에 양자를 지정하는 경우 형식 한정자 설명 위치에 주의가 필요합니다.

 

 

 

 

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

RL78 컴파일러 사용 6  (0) 2013.04.05
RL78 컴파일러 사용 5  (0) 2013.04.05
RL78 컴파일러 사용 3  (0) 2013.04.05
RL78 컴파일러 사용 2  (0) 2013.04.05
RL78 컴파일러 사용 1  (0) 2013.04.05

+ Recent posts