touch key 계산법

 

Slider , Wheel 관련

 

 

Methods of the use for capacitive touch keys.pdf

 

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

RL78G13 회로도  (0) 2015.06.16
RENESAS RL78 세미나 주요 정리 내용  (0) 2015.03.10
RL78 option byte  (0) 2014.08.28
RL78-Cubesuite+ 구조체와 공용체  (0) 2013.04.09
RL78 컴파일러 사용 10  (0) 2013.04.05
RL78G13

 

 

r20ut0458eg0101_rl78g13.pdf

 

r20ut0459eg0100_rskrl78g13_usermanual.pdf

 

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

touch key 계산법  (0) 2015.06.16
RENESAS RL78 세미나 주요 정리 내용  (0) 2015.03.10
RL78 option byte  (0) 2014.08.28
RL78-Cubesuite+ 구조체와 공용체  (0) 2013.04.09
RL78 컴파일러 사용 10  (0) 2013.04.05

RENESAS RL78 세미나 주요 정리 내용

  1. 디버거를 위해 Break 시에 timer 까지 정지 하려면 Stop emulation of timer group when stopping 을 Yes 로 선언하면 된다. (타이머가 정확하게 동작하는지 시간을 측정할 때 사용하면 좋을 것 같다. )

 

  1. RL78 디버깅 가능하게 설정 하려면 Use on-chip debug 를 Yes 로 선언하면 된다. 단 여러가지 옵션 때문에 해당항목 이후에 내용을 아래 그림과 같이 선언하는 것이 좋다.

 

  1. E1에서 전원 공급 가능하도록 설정 하려면 Power target form the emulator 를 Yes 로 두고 사용한 전원을 선택 하면 된다.

 

  1. 디버깅중에 실시간 메모리 확인을 하려면 Access by stopping execution 을 Yes 로 선언하고 값 Update 시간을 결정한다. (최소 시간은 100ms 까지 가능) 단 디버거 통신 시간으로 인해 실시간 변수 확인하기 위해서는 가능하면 그수를 100개 이내로 하는 것이 좋다.

 

  1. 한글 깨짐 방지를 위해서는 kanji character code of source 를 Unspecified 를 선언 한다. 그래도 한글 주석은 깨지며 이경우 컴파일이 안되거나 이상하게 되므로 한글 주석인 있는 경우 그 끝에 . 을 꼭 붇이는 것이 좋다.

    예 -> //주석.

 

  1. 전용 ic 양산 tool 인 Flash programmer 에서 특정 메모리 부분만 처리 하고자 할 경우 Set Project 를 보면 Operation mode 에서 사용하고자 하는 메모리 영역을 선택 할수 있다.

 

 

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

touch key 계산법  (0) 2015.06.16
RL78G13 회로도  (0) 2015.06.16
RL78 option byte  (0) 2014.08.28
RL78-Cubesuite+ 구조체와 공용체  (0) 2013.04.09
RL78 컴파일러 사용 10  (0) 2013.04.05

RL78은 내부에 option byte 가 존재 하는데

이 option byte 를 이용해서 어떤전압에서 reset 을 할지 watchdog는 사용할지 안할지 등을 선택 할수 있게 한다.

 

이 option byte 는 CubeSuite 에서 Code Generator 를 하면 자동으로 변경되는데 원하지 않는 내용으로 변경될수 있다.

그래서 이부분에 대한 내용을 알고 있어야 한다.

 

 

r01an1083eg0100_rl78g13.pdf

 

 

설정 부분은 아래 이미지와 같다.

 

 

 

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

RL78G13 회로도  (0) 2015.06.16
RENESAS RL78 세미나 주요 정리 내용  (0) 2015.03.10
RL78-Cubesuite+ 구조체와 공용체  (0) 2013.04.09
RL78 컴파일러 사용 10  (0) 2013.04.05
RL78 컴파일러 사용 9  (0) 2013.04.05

 

이 자료는 일본사이트의 내용을 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

+ Recent posts