"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

+ Recent posts