MDSTECH
TRACE32
TRACE32 Solution
TRACE32 Trace Solution
TRACE32 More Product
TRACE32 Software Solution
Why TRACE32?
교육신청
정규교육
교육과정 안내
교육장 안내
교육설문
자료실
TRACE32 소프트웨어
TRACE32 매뉴얼
iTSP
TRACE32 영상
인증서
고객지원
뉴스레터
Q&A
FAQ
원격지원
검색창
검색버튼
회원가입
로그인
TRACE32
TRACE32 Solution
TRACE32 Trace Solution
TRACE32 More Product
TRACE32 Software Solution
Why TRACE32?
교육신청
정규교육
교육과정 안내
교육장 안내
교육설문
자료실
TRACE32 소프트웨어
TRACE32 매뉴얼
iTSP
TRACE32 영상
인증서
고객 지원
뉴스레터
Q&A
FAQ
원격지원
사이트맵 보기
TASKING 사용자 가이드 문서 원본 보기
←
TASKING 사용자 가이드
이동:
둘러보기
,
검색
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게만 가능합니다:
사용자
문서의 원본을 보거나 복사할 수 있습니다:
<h2>Overview</h2> <p>이 문서는 TASKING 컴파일러 사용자를 위한 매뉴얼로 TASKING Tricore VX-toolset 기반으로 작성되었습니다.</p> <p>Tricore에서 정의하는 데이터 타입 및 타겟 메모리 관리를 위한 LSL 파일을 작성방법과 활용 예를 소개합니다.</p> <p>버전에 따라, 사용법 및 적용 가능 옵션등에 차이가 있을 수 있으므로, 각 버전별 매뉴얼을 추가로 참고하시기 바랍니다.</p> <p>(설치폴더/ctc/doc/ctc_user_guide.pdf)</p> <p><span lang="EN-US"><br /></span></p> <h2>Tricore의 C Language</h2> <h3>데이터 타입</h3> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="256" valign="top"> <p><strong>C Type</strong></p> </td> <td width="119" valign="top"> <p><strong>Size (bit)</strong></p> </td> <td width="119" valign="top"> <p><strong>Align</strong></p> </td> <td width="235" valign="top"> <p><strong>Limit Range </strong></p> </td> </tr> <tr> <td width="256" valign="top"> <p>_Bool</p> </td> <td width="119" valign="top"> <p>1</p> </td> <td width="119" valign="top"> <p>8</p> </td> <td width="235" valign="top"> <p>[0 or 1]</p> </td> </tr> <tr> <td width="256" valign="top"> <p>signed char</p> </td> <td width="119" valign="top"> <p>8</p> </td> <td width="119" valign="top"> <p>8</p> </td> <td width="235" valign="top"> <p>[-2<sup>7</sup>, 2<sup>7</sup>-1]</p> </td> </tr> <tr> <td width="256" valign="top"> <p>unsigned char</p> </td> <td width="119" valign="top"> <p>8</p> </td> <td width="119" valign="top"> <p>8</p> </td> <td width="235" valign="top"> <p>[0, 2<sup>8</sup>-1]</p> </td> </tr> <tr> <td width="256" valign="top"> <p>short</p> </td> <td width="119" valign="top"> <p>16</p> </td> <td width="119" valign="top"> <p>16</p> </td> <td width="235" valign="top"> <p>[-2<sup>15</sup>, 2<sup>15</sup>-1]</p> </td> </tr> <tr> <td width="256" valign="top"> <p>unsigned short</p> </td> <td width="119" valign="top"> <p>16</p> </td> <td width="119" valign="top"> <p>16</p> </td> <td width="235" valign="top"> <p>[0, 2<sup>16</sup>-1]</p> </td> </tr> <tr> <td width="256" valign="top"> <p>int</p> </td> <td width="119" valign="top"> <p>32</p> </td> <td width="119" valign="top"> <p>16</p> </td> <td width="235" valign="top"> <p>[-2<sup>31</sup>, 2<sup>31</sup>-1]</p> </td> </tr> <tr> <td width="256" valign="top"> <p>unsigned int</p> </td> <td width="119" valign="top"> <p>32</p> </td> <td width="119" valign="top"> <p>16</p> </td> <td width="235" valign="top"> <p>[0, 2<sup>32</sup>-1]</p> </td> </tr> <tr> <td width="256"> <p>enum</p> </td> <td width="119" valign="top"> <p>8</p> <p>16</p> <p>32</p> </td> <td width="119" valign="top"> <p>8</p> <p>16</p> </td> <td width="235" valign="top"> <p>[-2<sup>7</sup>, 2<sup>7</sup>-1] or [0, 2<sup>8</sup>-1]</p> <p>[-2<sup>15</sup>, 2<sup>15</sup>-1] or [0, 2<sup>16</sup>-1]</p> <p>[-2<sup>31</sup>, 2<sup>31</sup>-1]</p> </td> </tr> <tr> <td width="256" valign="top"> <p>long</p> </td> <td width="119" valign="top"> <p>32</p> </td> <td width="119" valign="top"> <p>16</p> </td> <td width="235" valign="top"> <p>[-2<sup>31</sup>, 2<sup>31</sup>-1]</p> </td> </tr> <tr> <td width="256" valign="top"> <p>unsigned long</p> </td> <td width="119" valign="top"> <p>32</p> </td> <td width="119" valign="top"> <p>16</p> </td> <td width="235" valign="top"> <p>[0, 2<sup>32</sup>-1]</p> </td> </tr> <tr> <td width="256" valign="top"> <p>long long</p> </td> <td width="119" valign="top"> <p>64</p> </td> <td width="119" valign="top"> <p>32</p> </td> <td width="235" valign="top"> <p>[-2<sup>63</sup>, 2<sup>63</sup>-1]</p> </td> </tr> <tr> <td width="256" valign="top"> <p>unsigned long long</p> </td> <td width="119" valign="top"> <p>64</p> </td> <td width="119" valign="top"> <p>32</p> </td> <td width="235" valign="top"> <p>[0, 2<sup>64</sup>-1]</p> </td> </tr> <tr> <td width="256"> <p>_Float16 (10-bit mantissa)</p> </td> <td width="119"> <p>16</p> </td> <td width="119"> <p>16</p> </td> <td width="235" valign="top"> <p>[-65504.0F,-6.103515625E-05]</p> <p>[+6.103515625E-05,+65504.0F]</p> </td> </tr> <tr> <td width="256"> <p>float (23-bit mantissa)</p> </td> <td width="119"> <p>32</p> </td> <td width="119"> <p>16</p> </td> <td width="235" valign="top"> <p>[–3.402E+38, –1.175E-38]</p> <p>[+1.175E-38, +3.402E+38]</p> </td> </tr> <tr> <td width="256" valign="top"> <p>double</p> <p>long double (52-bit mantissa)</p> </td> <td width="119"> <p>64</p> </td> <td width="119"> <p>32</p> </td> <td width="235" valign="top"> <p>[-1.797E+308, -2.225E-308]</p> <p>[+2.225E-308, +1.797E+308]</p> </td> </tr> <tr> <td width="256" valign="top"> <p>_Imaginary float</p> </td> <td width="119"> <p>32</p> </td> <td width="119"> <p>16</p> </td> <td width="235" valign="top"> <p>[–3.402E+38i, –1.175E-38i]</p> <p>[+1.175E-38i, +3.402E+38i]</p> </td> </tr> <tr> <td width="256" valign="top"> <p>_Imaginary double</p> <p>_Imaginary long double</p> </td> <td width="119"> <p>64</p> </td> <td width="119"> <p>32</p> </td> <td width="235" valign="top"> <p>[-1.797E+308i, -2.225E-308i]</p> <p>[+2.225E-308i, +1.797E+308i]</p> </td> </tr> <tr> <td width="256" valign="top"> <p>_Complex float</p> </td> <td width="119" valign="top"> <p>64</p> </td> <td width="119" valign="top"> <p>32</p> </td> <td width="235"> <p>real part + imaginary part</p> </td> </tr> <tr> <td width="256" valign="top"> <p>_Complex double</p> <p>_Complex long double</p> </td> <td width="119"> <p>128</p> </td> <td width="119"> <p>32</p> </td> <td width="235"> <p>real part + imaginary part</p> </td> </tr> <tr> <td width="256" valign="top"> <p>__sfract</p> </td> <td width="119" valign="top"> <p>16</p> </td> <td width="119" valign="top"> <p>16</p> </td> <td width="235" valign="top"> <p>[-1, 1></p> </td> </tr> <tr> <td width="256" valign="top"> <p>__fract</p> </td> <td width="119" valign="top"> <p>32</p> </td> <td width="119" valign="top"> <p>32</p> </td> <td width="235" valign="top"> <p>[-1, 1></p> </td> </tr> <tr> <td width="256" valign="top"> <p>__laccum</p> </td> <td width="119" valign="top"> <p>64</p> </td> <td width="119" valign="top"> <p>64</p> </td> <td width="235" valign="top"> <p>[-131072, 131072></p> </td> </tr> </tbody> </table> <p> </p> <p>※ 열거형 상수 (enum) : 컴파일러는 정수형 자료형 (char, unsigned char, short, unsigned short or int) 중 가장 작고 적절한 자료형을 선택하여 사용한다. (예외 – C Compiler option중 --integer-enumeration<strong> </strong>을 사용하면 항상 32-bit 정수 자료형을 사용한다.)</p> <p> </p> <p>※ 복소수 ( _Complex [float, double, long double] )</p> <ol> <li>#include <complex.h> 로 complex.h 헤더파일 포함</li> <li>Imiginary 허수 표현 방법</li> </ol> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="167" valign="top"> <p>자료형</p> </td> <td width="170" valign="top"> <p>double</p> </td> <td width="170" valign="top"> <p>float</p> </td> <td width="170" valign="top"> <p>long double</p> </td> </tr> <tr> <td width="167" valign="top"> <p>허수 변환 함수</p> </td> <td width="170" valign="top"> <p>cimag</p> </td> <td width="170" valign="top"> <p>cimagf</p> </td> <td width="170" valign="top"> <p>cimagl</p> </td> </tr> </tbody> </table> <p> </p> <p>(예) 3.5 + 2.1i 복소수 표현 방법</p> <p><strong>_Complex float tmp = 3.5 + cimagf(2.1); </strong></p> <p> </p> <p>※ 고정 소수점 연산 ( __sfract, __fract, __laccum )</p> <p>1. __sfract 는 16비트 사이즈로 범위는 -1이상 1미만 표현 가능</p> <p>2. __fract 는 32비트 사이즈로 범위는 -1이상 1미만 표현 가능</p> <p>3. __laccum은 64비트 사이즈(18bit는 정수부, 46bit는 소수부) 로 -2^17이상 2^17미만 표현 가능</p> <p> </p> <h3>메모리 ACCESS 방식</h3> <div> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="59"> <p>한정자</p> </td> <td width="158"> <p>설명</p> </td> <td width="114"> <p>Location</p> </td> <td width="73"> <p>최대</p> <p>사이즈</p> </td> <td width="99"> <p>포인터</p> <p>사이즈</p> </td> <td width="139"> <p>섹션 타입(prefix)</p> </td> </tr> <tr> <td width="59"> <p>__near</p> </td> <td width="158"> <p>Near data,</p> <p>직접 주소 지정</p> </td> <td width="114"> <p>256MB블락 中 첫번째 16kB</p> </td> <td width="73"> <p>16KB</p> </td> <td width="99"> <p>32-bit</p> </td> <td width="139"> <p>neardata(.zdata)</p> <p>nearrom(.zrodata)</p> <p>nearbss(.zbss)</p> <p>nearnoclear(.zbss)</p> </td> </tr> <tr> <td width="59"> <p>__far</p> </td> <td width="158"> <p>Far data,</p> <p>간접 주소 지정</p> </td> <td width="114"> <p>Anywhere</p> </td> <td width="73"> <p>제한없음</p> </td> <td width="99"> <p>32-bit</p> </td> <td width="139"> <p>fardata(.data)</p> <p>farrom(.rodata)</p> <p>farbss(.bss)</p> <p>farnoclear(.bss)</p> </td> </tr> <tr> <td width="59"> <p>__a0</p> </td> <td width="158"> <p>초기화 / 비초기화,</p> <p>상수 data</p> </td> <td width="114"> <p>Sign-Extended</p> <p>16-bit offset,</p> <p>A0 Addr 기준</p> </td> <td width="73"> <p>64KB</p> </td> <td width="99"> <p>32-bit</p> </td> <td width="139"> <p>a0data(.data_a0)</p> <p>a0bss(.bss_a0)</p> <p>a0rom(.rodata_a0)</p> </td> </tr> <tr> <td width="59"> <p>__a1</p> </td> <td width="158"> <p>초기화 / 비초기화,</p> <p>상수 data</p> </td> <td width="114"> <p>Sign-Extended</p> <p>16-bit offset,</p> <p>A1 Addr 기준</p> </td> <td width="73"> <p>64KB</p> </td> <td width="99"> <p>32-bit</p> </td> <td width="139"> <p>a1rom(.rodata_a1)</p> <p>a1data(.data_a1)</p> <p>a1bss(.bss_a1)</p> </td> </tr> <tr> <td width="59"> <p>__a8</p> </td> <td width="158"> <p>초기화 / 비초기화,</p> <p>상수 data</p> </td> <td width="114"> <p>Sign-Extended</p> <p>16-bit offset,</p> <p>A8 Addr 기준</p> </td> <td width="73"> <p>64KB</p> </td> <td width="99"> <p>32-bit</p> </td> <td width="139"> <p>a8data(.data_a8)</p> <p>a8rom(.rodata_a8)</p> <p>a8bss(.bss_a8)</p> </td> </tr> <tr> <td width="59"> <p>__a9</p> </td> <td width="158"> <p>초기화 / 비초기화,</p> <p>상수 data</p> </td> <td width="114"> <p>Sign-Extended</p> <p>16-bit offset,</p> <p>A9 Addr 기준</p> </td> <td width="73"> <p>64KB</p> </td> <td width="99"> <p>32-bit</p> </td> <td width="139"> <p>a9data(.data_a9)</p> <p>a9rom(.rodata_a9)</p> <p>a9bss(.bss_a9)</p> </td> </tr> </tbody> </table> </div> <p>※ TASKING 5.x 버전에서는 RAM은 a0만 사용 가능하고, ROM은 a1만 사용 가능하도록 분리되어 있음)</p> <p>※ TASKING 6.x 버전부터는 a0, a1, a8, a9 모두 ROM과 RAM 영역으로 사용 가능하지만,</p> <p>RAM과 ROM을 동시에 배치할 수는 없음 (Offset 크기가 제한되어 있기 때문)</p> <p> </p> <p>※ 6.x에서 변경된 Prefix : (.sdata(5.x) →.data_a0(6.x) .ldata(5.x) → .rodata_a1(6.x))</p> <p> </p> <h4 class="3">Absolute Addressing (abs18)</h4> <p>Translation 규칙에 의해 18-bit Address를 32-bit Address로 변환 가능하기 때문에 직접 주소 접근 방식으로 <strong>1개의 Instruction만을 사용하여 메모리 접근이 가능</strong></p> <p><img src="/data/wiki/2017-06-28/1498641324.jpg" alt="" /><img src="/data/wiki/2017-06-28/1498641324.png" alt="" /></p> <p> </p> <p><strong> </strong>※ Translation 규칙 (Infineon Tricore Architecture 문서 참조)</p> <p><strong>① </strong> 처음 4bit : Segment 페이지(256MB)의 시작 번호 (Segment: 0~15 (4bit))</p> <p><strong>② </strong> 중간 14bit : 모두 0 으로 가정. 이 규칙을 통해 32-bit Full Address로 변환 가능</p> <p><strong>③ </strong> 끝 14bit : Near Data로 사용 가능한 주소의 크기 (14Bit = 16KB)</p> <p>→ Near Data는 각 0~15의 Segement(256MB)별로 16KB 사용 가능</p> <p> </p> <h4 class="3"> A0/ A1/ A8/ A9 Memory Access (Base + Offset(16bit) Addressing )</h4> <p>- Base + Offset(2Byte) Addressing : A0/A1/A8/A9 레지스터를 Base Address로 고정하고,</p> <p>16-bit-Sign-Extended (64KB)의 오프셋으로 <span style="text-decoration: underline;">2개의 Instruction</span>을 사용하여 접근할 수 있는 방식</p> <p><img src="/data/wiki/2017-06-28/1498641570.png" alt="" /></p> <p><img src="/data/wiki/2017-06-28/1498641374.png" alt="" /></p> <p> </p> <p>예) A0의 Base Addr을 0x70010000로 맵핑하는 방법</p> <p>: 링커 옵션에 <strong>-DA0_START_ADDRESS=0x70010000</strong> 을 설정</p> <p>: A0 어드레스에 들어가는 값은 0x70018000이 된다.</p> <p>(오프셋 (Signed-16bit) : ±0x8000 ( 64KB))</p> <p><strong> </strong></p> <h4 class="3">한정자를 이용한 메모리 접근 방식 정의</h4> <p>- 위 테이블의 <strong>Qualifier</strong> 참조</p> <p>예) <strong>__near</strong> int var1 = 3; 으로 전역 변수를 선언 (test_project.c)</p> <p><strong>→ .zdata</strong>.test_project.var1 의 섹션 이름으로 생성되고, 직접 주소 접근 방식으로 메모리 Access</p> <p><strong> </strong></p> <h4 class="3">컴파일 옵션을 이용한 메모리 접근 방식 정의 (전역적으로)</h4> <p>* 전역적용: -<strong>default-near(a0/a1)-size</strong>=[value(Threshold)]</p> <p>- 컴파일 옵션에 –default-near-size=[value] 적용하면 컴파일러가 자동으로 value와 같거나</p> <p>작은 변수들을 Near 영역에 배치하게됨</p> <p>- 이 옵션은 a0/ a1옵션보다 near옵션이 우선적으로 적용됨</p> <p>예) <strong>-default-near-size</strong>=4, <strong>–default-a0-size</strong>=8 라면,</p> <p> 4바이트보다 작은 변수는 Near Data 방식으로</p> <p> 4바이트보다 크고 8바이트보다 작은 변수는 A0 방식의 메모리 접근방식을 사용하게됨</p> <p> </p> <p>* 부분적용: <strong>#pragma </strong>default_near(a0/a1)_size<strong> </strong> [value(Threshold) | restore | default]</p> <p><strong> -사이즈 상관없이 모두 A0로 배치하는 방법</strong></p> <p><strong> #pragma</strong> default_a0_size</p> <p> [[사용자:Admin|Admin]] ([[사용자토론:Admin|토론]])</p> <p><strong> #pragma</strong> default_a0_size restore</p> <p> -#pragma 안의 모든 변수가 A0방식의 .sdata*와 .sbss*로 사용됨 (Test in TASKING 5.x)<strong> </strong></p> <p><img src="/data/wiki/2017-06-28/1498641736.jpg" alt="" /><img src="/data/wiki/2017-06-28/1498641742.jpg" alt="" /></p> <p> </p> <p>- <strong>지정한 사이즈보다 작거나 같을 경우에만 A0로 배치하는 방법</strong></p> <p><strong>#pragma</strong> default_a0_size <strong><value></strong></p> <p>[[사용자:Admin|Admin]] ([[사용자토론:Admin|토론]])</p> <p><strong>#pragma</strong> default_a0_size restore</p> <p><img src="/data/wiki/2017-06-28/1498641762.jpg" alt="" /><img src="/data/wiki/2017-06-28/1498641767.jpg" alt="" /></p> <p>- 지정한 값인 2보다 작은 test_char1만 A0방식인 .sbss* 섹션명으로 생성됨</p> <p> </p> <h4 class="3">메모리 접근 방식 성능 비교 (Instruction Level)</h4> <p><strong> </strong>* <strong>FAR </strong>(일반적) 방식의 메모리 접근 방법 -> <strong>간접 주소로의 메모리 접근 방식</strong></p> <p><img src="/data/wiki/2017-06-28/1498641911.png" alt="" /></p> <p> </p> <p> </p> <p>* <strong>A0 </strong>방식의 메모리 접근 방법 -> <strong>A0</strong><strong>기준 옵셋 주소로의 메모리 접근 방식</strong></p> <p><img src="/data/wiki/2017-06-28/1498641916.png" alt="" /><img src="/data/wiki/2017-06-28/1498641933.png" alt="" /></p> <p> </p> <p>* <strong>NEAR </strong>방식의 메모리 접근 방법 -> <strong>직접 주소로의 메모리 접근 방식</strong></p> <p><img src="/data/wiki/2017-06-28/1498641938.png" alt="" /></p> <p><strong>※ 메모리 접근 수행 속도 (d15로의 데이터 로딩에 필요한 인스트럭션 수)</strong></p> <p>- FAR(3개) < A0(2개) < NEAR(1개)</p> <p>- <strong>NEAR</strong><strong>가 가장 접근속도 빠름</strong> (Near Data는 직접 주소 접근 방식이 가능하기 때문)</p> <p>- A0/1/8/9 방식은 [a0/1/8/9 어드레스 레지스터]에 저장된 값을 기준으로 sign-extended 16bit 오프셋으로 <strong>64kB</strong>(-32kB~+32kB)만큼 접근 가능하다.</p> <p><strong> </strong></p> <h3>데이터 타입의 한정자</h3> <h4 class="3">Circular Buffers</h4> <p><strong>- </strong>Circular Addressing을 이용한 원형 버퍼 접근시 사용<strong> </strong></p> <p>- 한정자 : <strong>__circ</strong></p> <p>- 사용방법 :</p> <p>// Circular 버퍼 및 포인터 생성</p> <p> </p> <p><strong>int</strong> <strong>__circ</strong> circbuf[10]={0,1,2,3,4,5,6,7,8,9};</p> <p><strong>int</strong> <strong>__circ</strong> * ptr_circbuf = circbuf;</p> <p>// Circular pointer를 이용하여 Circular Addressing 방식으로 원형 버퍼의 값을 접근 가능</p> <p><strong>while</strong>(1)</p> <p>{</p> <p><strong>int</strong> tmp = *ptr_circbuf++;</p> <p><strong>printf</strong>(“tmp= %d ”, tmp);</p> <p>}</p> <p>※ <strong>출력값</strong> : 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 . . .</p> <p> </p> <h4 class="3"> Special Function Registers Defining</h4> <p><strong>-</strong><strong> </strong>Special Function Register를 bitfild 타입으로 선언시 사용</p> <p>- 한정자 : <strong>__sfrbit16, __sfrbit32</strong></p> <p>- 사용방법 :</p> <p><strong>typedef</strong> volatile union</p> <p>{</p> <p><strong>struct</strong></p> <p>{</p> <p><strong>unsigned __sfrbit32 </strong>SRPN : 8; /* Service Priority Number */</p> <p><strong>unsigned __sfrbit32 </strong>: 2;</p> <p><strong>unsigned __sfrbit32 </strong>TOS : 2; /* Type-of-Service Control */</p> <p><strong>unsigned __sfrbit32 </strong>SRE : 1; /* Service Request Enable Control */</p> <p><strong>unsigned __sfrbit32 </strong>SRR : 1; /* Service Request Flag */</p> <p><strong>unsigned __sfrbit32 </strong>CLRR : 1; /* Request Flag Clear Bit */</p> <p><strong>unsigned __sfrbit32 </strong>SETR : 1; /* Request Flag Set Bit */</p> <p><strong>unsigned __sfrbit32 </strong>: 16;</p> <p>}B;</p> <p><strong>int</strong> I;</p> <p><strong>unsigned int</strong> U;</p> <p>} <strong>LBCU_SRC_type;</strong></p> <p><strong>→</strong><strong> Special Function Register</strong><strong>를</strong><strong> bitfild</strong><strong>로</strong><strong> </strong><strong>선언할</strong><strong> </strong><strong>경우</strong><strong> </strong><strong>사용됨</strong><strong> </strong></p> <p><strong>void</strong> <strong>set_sfr</strong>(void)</p> <p>{</p> <p>SBCU_SRC.I |= 0xb32a; /* access SBCU Service Request</p> <p>Control register as a whole */</p> <p>SBCU_SRC.B.SRE = 0x1; /* access SRE bit-field of SBCU</p> <p>Service Request Control register */</p> <p>}</p> <h4 class="3"> Saturation</h4> <p><strong>- </strong><strong>자료형 Overflow </strong><strong>제한 </strong><strong>기능 (int </strong><strong>자료형만 </strong><strong>사용가능)</strong></p> <p>- 한정자 : <strong>__sat</strong></p> <p>- 사용 방법 :</p> <p><strong>__sat</strong> <strong>int</strong> si = 0x7FFFFFFF;</p> <p><strong>int</strong> i = 0x12345;</p> <p><strong>unsigned</strong> <strong>int</strong> ui = 0xFFFFFFFF;</p> <p><strong>int</strong> tmp1 = 0;</p> <p><strong>int</strong> tmp2 = 0;</p> <p><strong>int</strong> tmp3 = 0;</p> <p> </p> <p><strong>int</strong> <strong>main</strong>(<strong>void</strong>)</p> <p>{</p> <p> tmp1 = si + i;</p> <p> tmp2 = ui + si;</p> <p> tmp3 = i + ui;</p> <p> <strong>printf</strong>( "tmp1 : %d \n tmp2 : %d \n tmp3 : %d \n ", tmp1, tmp2, tmp3);</p> <p>}</p> <p><strong>※출력값</strong>: tmp1 : 0x7FFFFFFF <strong>//int </strong><strong>타입에</strong><strong> </strong><strong>포화되어</strong><strong> </strong><strong>연산</strong></p> <p>tmp2 : 0xFFFFFFFF <strong>//unsigned int </strong><strong>타입에</strong><strong> </strong><strong>포화되어</strong><strong> </strong><strong>연산</strong></p> <p>tmp3 : 0x12344 <strong>//</strong><strong>일반적인</strong><strong> Overflow </strong><strong>연산</strong></p> <p> </p> <h3>C소스에서의 Assembly 사용법</h3> <p>- Instrinct Function : <strong>__asm()</strong></p> <p>- Syntax :</p> <p>__asm( "<em>instruction_template</em>"</p> <p>[ : <em>output_param_list</em></p> <p>[ : <em>input_param_list</em></p> <p>[ : <em>register_reserve_list</em>]]] );</p>
TASKING 사용자 가이드
문서로 돌아갑니다.
둘러보기 메뉴
개인 도구
로그인
이름공간
문서
토론
변수
보기
읽기
원본 보기
역사 보기
행위
검색
TRACE32 Dummy
TRACE32
iTSP User's Guide
aTSP User's Guide
Linux Debugging
Debugging Tips
Trace Analysis
Virtual Target
TRACE32로 바라본 ARM
TRACE32 FAQ
TRACE32 Trouble Shooting
TRACE32 Software Update
Software Revision History
DT10 / DT-Win
다운로드
DT10 Evaluation
DT-Win Evaluation
TestPoint 삽입 Error
Build Error
DT10 FAQ
도구
여기를 가리키는 문서
가리키는 글의 바뀜
특수 문서 목록
문서 정보