[XC]다중 리턴 함수 XC

1. 다중 리턴 함수

다중 리턴 함수는 XC에서 제공하는 함수 형태입니다. 이름에서 알 수 있듯이 하나 이상의 리턴값을 넘겨줄 수 있습니다.

2. 다중 리턴 함수 선언 및 정의

(1) 함수 선언

다중 리턴 함수의 선언은 다음과 같이 합니다.

{리턴형, 리턴형} 함수명();

이처럼 리턴형을 소괄호로 나열을 하면 하나 이상의 리턴값을 넘길 수 있는 함수를 선언할 수 있습니다.

(2) 함수 리턴

함수 값 리턴은 함수 선언과 유사하게 다음과 같이 소괄호로 리턴값을 나열합니다.

return {리턴값1, 리턴값2}

(3) 함수 리턴 값 받기

다중 리턴 함수를 호출한 후 리턴값을 받는 경우에도 다음과 같이 값을 받을 변수를 소괄호로 나열합니다.

{변수1, 변수2} = 함수();

[예제]
다음은 다중 리턴 함수를 사용해 두 개의 값을 나눈 몫과 나머지를 리턴하는 예제입니다.

#include <stdio.h>
#include <platform.h>

{int, int}    Division        (    int        a,
                                            int        b
                                       )
{
    int        nQuotient            =    a / b;
    int        nRemainder        =    a % b;

    return    {nQuotient,nRemainder};
}

int main(void)
{

    int        nQuotient;
    int        nRemainder;

    {nQuotient,nRemainder}    =    Division(13,4);

    printf("Quotient = %d, Remainder = %d", nQuotient,nRemainder);

    return 0;
}


[XC]XMOS Timer XC

1.XMOS Timer 소개

Timer는 XMOS에서 제공하는 자원으로 여타 CPU에서 제공하는 Timer 또는 Tick과 같이 일정 시간 마다 1씩 증가하는 일종의 카운터 입니다. 여타 CPU의 Timer와 마찬가지고 이것을 사용하여 프로그램 동작 지연, 일정 시간 간격으로 동작 등과 같은 일을 할 수 있습니다.

2. XMOS Timer 특징

(1) 10ns 단위의 구분이 가능합니다.
(2) XC에서 Timer에 접근하는 문법을 제공합니다.
(3) XMOS 한 Core 당 10개의 Timer를 제공합니다.

3. XMOS Timer 사용

(1) Timer 선언

XC에서는 Timer를 사용하기 위해 선언을 해야 합니다. 선언을 하는 방법은 변수 선언과 유사하며 선언 방법은 다음과 같습니다.

timer    t;
①        ②

① 식별자 t가 Timer를 사용하기 위한 것임을 알려줍니다.
② Timer에 접근할 때는 식별자 t를 사용할 것임을 알려줍니다.

(2) Timer 값 읽어 오기

Timer의 동작은 Timer 값을 얻어오는 것 하나 뿐입니다.

- Timer 값 읽기
(Timer 식별자)    :>    변수

[예제]
다음은 Timer로부터 값을 읽어오는 예제입니다. 실행하면 현재 Timer의 값을 읽어 화면에 출력합니다.

#include <print.h>
#include <platform.h>

int main(void) {
    timer        tTimer;
    unsigned    iTimeVal;

    tTimer    :>    iTimeVal;
    printstr("Timer Value =");
    printint(iTimeVal);

    return 0;
}

(3) 시간 대기

XC는 Timer를 이용해 일정 시간 동안 프로그램 대기를 할 수 있는 문법을 제공합니다. 우선 이해를 위한 예제는 다음과 같습니다.

[예제]
다음은 프로그램 동작 중 잠시 1초간 동작을 멈추는 예제이다.

#include <print.h>
#include <platform.h>

int main(void) {
    timer        tTimer;
    unsigned    iTimeVal;

    printstrln("Program Start.\n");

    printstrln("1 sec delay\n");
    tTimer    :>    iTimeVal;
    tTimer    when timerafter(iTimeVal+100000000)    :>   
iTimeVal;
    printstrln("Done.\n");

    return 0;
}

위 예제에서 1초간 대기를 하는 부분은 다음과 같습니다.

tTimer    when timerafter(iTimeVal+100000000)    :>    iTimeVal;

이 문법은 Timer로부터 값을 가져오는 부분에 조건을 붙힌 경우로 코드 의미 그대로 tTimer 값이 (iTimeVal+100000000)이상일 때 iTimeVal에 tTimer 값을 넣는다는 의미입니다. 그리고 이 조건이 맞지 않을 경우에는 프로그램은 계속 대기하게 됩니다.

위 예제의 동작을 정리하면 다음과 같습니다.


① iTimeVal에 tTimer의 타이머 값을 가져옵니다.
② iTimeVal의 값을 기준으로 즉 n 시점을 시작으로 100000000 만큼의 시간이 지날 때까지 프로그램을 대기한 후 iTimeVal에 tTimer의 타이머 값을 가져오도록 합니다.
③ 결과적으로 ①시점에서 100000000 만큼의 시간이 지난 ③ 시점에서 다시 프로그램이 동작합니다. (이 때 Timer 값은 10ns에 1씩 증가하므로 100000000은 1000000 us, 1000ms, 1s이므로 즉 1초가 된다.)

[XC]XC 소개 XC

1. XC 소개

XC는 XMOS 칩을 동작시키는 프로그램을 개발할 때 사용하는 프로그래밍 언어입니다. XC는 XMOS 칩에서 사용하는 Thread, Channel 등의 자원을 효율적으로 사용하기 위한 문법을 포함하고 있습니다.
하지만 XC만의 독특한 문법을 제외하면 나머지는 C와 유사해 기존 C 프로그래머들은 쉽게 이해할 수 있습니다.

2. XC 특징

XC의 특징은 다음과 같습니다.

(1) C 언어와 유사하다.
(2) C, C++ 코드와 같이 빌드가 가능하다.
(3) XMOS의 자원에 접근 할 수 있는 문법을 제공한다. (Thread, Channel, Port 등)
(4) 포인터를 제공하지 않는다.

[MFC]CMFC_Timer MFC

MFC에서 Timer를 사용하는데 좀 더 관리하기 편하게 하기 위해 작성해봤습니다.
Timer를 사용하기 원하는 윈도우에 CMFC_Timer를 상속한 클래스의 객체를 생성해서 사용하면 됩니다.

소스는 다음과 같으며, 마음대로 수정 및 사용 가능합니다.

/**
    @file        MFC_Timer.h
    @brief        CMFC_Timer 클래스 정의
    @author        Jae-Gu Kim.
    @date        2010.01.21
    @version    1.0
**/

#ifndef    _MFC_TIMER_H_
#define    _MFC_TIMER_H_

/**
    @class        Window MFC Timer Wrapper Class
    @brief        MFC Timer를 좀 더 쉽게 관리 하기 위해 작성됨
**/
class CMFC_Timer
{
private:
    CWnd*        m_cParent;        ///< Timer를 생성할 Window 객체
public:
    CMFC_Timer    (    CWnd*    cParent        ///< 설정할 Window 객체
                )
        :m_cParent(cParent){}
    virtual
    ~CMFC_Timer    (    void            ){}
public:
    void    StartTimer                (    int        nInterval    ///< 타이머의 시간 간격
                                    )
    {
        OnStart();
        m_cParent->SetTimer    (    (UINT_PTR)this,
                                nInterval,
                                CMFC_Timer::TimerCallBack
                            );
    }
    void    StopTimer                (    void    )
    {
        m_cParent->KillTimer( (UINT_PTR)this );
        OnStop();
    }
public:
    CWnd*    GetParent                (    void    )    {    return    m_cParent;    }
private:
    static
    void    WINAPI TimerCallBack    (    HWND        hWnd,        ///< Timer Handle
                                        UINT        iDummyA,    ///< 사용되지 않음
                                        UINT_PTR    pThis,        ///< Timer ID
                                        DWORD        iDummyB        ///< 사용되지 않음
                                    )
    {   
        CMFC_Timer*        cMFC_Timer    =    (CMFC_Timer*)pThis;
        cMFC_Timer->Run();
    }
protected:
    virtual
    void    Run            (    void    ){}
    virtual
    void    OnStart        (    void    ){}
    virtual
    void    OnStop        (    void    ){}
};

#endif    /*_MFC_TIMER_H_*/

사용 방법
=========
1. 설정
    (a) CMFC_Timer 클래스를 상속한 다른 하나의 클래스를 작성합니다.
    (b) 타이머가 동작 중일 때 해야 할 처리를 Run() 함수에 정의합니다.
    (c) 타이머가 시작 할 때 해야 할 처리를 OnStart() 함수에 정의합니다.
    (d) 타이머가 중지 할 때 해야 할 처리를 OnStop() 함수에 정의합니다.
2. 생성
    (a) 부모가 CWnd인 Window 객체에서 this 포인터를 인자로 CMFC_Timer 상속 객체를 생성합니다.
3. 타이머 시작/중지
    (a) StartTimer()를 타이머의 간격과 함께 호출하면 타이머를 시작합니다.
    (b) StopTimer()를 호출하면 타이머가 중지합니다.

[MFC]CFont 사용 MFC

1.   CFont

CFont 클래스는 MFC에서제공하는 GDI 오브젝트 중 하나로 화면에 그리는 텍스트의 글꼴을 설정할 때 사용합니다.

 

2.   사용

CFont를 사용해 화면에 그릴 텍스트의 폰트를 지정하는 것은 다음과같은 과정을 가집니다.

 

1.    DC 얻기

2.    CFont 선언

3.    폰트 생성

4.    DCCFontObject 설정

5.    텍스트 그리기

6.    CFont Object 제거

 

위의 과정을 예로 나타내면 다음과 같습니다.

        // 1. DC 얻기

        CClientDC      cClientDC(this);

        // 2. CFont 선언

        CFont          cFont;

        CString        strTitle       =       _T("CFont 예제");

        // 3. 폰트생성

        cFont.CreateFont       (       20,                     // 글자높이

                                      10,                     // 글자너비

                                      0,                      // 출력각도

                                      0,                      // 기준 선에서의각도

                                      FW_HEAVY,              // 글자굵기

                                      FALSE,                  // Italic 적용여부

                                      FALSE,                  // 밑줄적용여부

                                      FALSE,                  // 취소선적용여부

                                      DEFAULT_CHARSET,       // 문자셋종류

                                      OUT_DEFAULT_PRECIS,    // 출력정밀도

                                      CLIP_DEFAULT_PRECIS,   // 클리핑정밀도

                                      DEFAULT_QUALITY,       // 출력문자품질

                                      DEFAULT_PITCH,         // 글꼴Pitch

                                      _T("굴림체")           // 글꼴

                              );

 

        // 4. DCCFont Object 설정

        cClientDC.SelectObject(cFont);

        // 5. 텍스트그리기

        cClientDC.DrawText(strTitle, CRect(100,100,320,240), NULL);

        // 6. CFont Object 제거

        cFont.DeleteObject();

 


3.   설정

cFont.CreateFont       (       20,                     // 글자높이

                               10,                     // 글자너비

                               0,                      // 출력각도

                               0,                      // 기준 선에서의각도

                               FW_HEAVY,              // 글자굵기

                               FALSE,                  // Italic 적용여부

                               FALSE,                  // 밑줄적용여부

                               FALSE,                  // 취소선적용여부

                               DEFAULT_CHARSET,       // 문자셋종류

                               OUT_DEFAULT_PRECIS,    // 출력정밀도

                               CLIP_DEFAULT_PRECIS,   // 클리핑정밀도

                               DEFAULT_QUALITY,       // 출력문자품질

                               DEFAULT_PITCH,         // 글꼴Pitch

                               _T("굴림체")           // 글꼴

                       );

 

CreateFont에서 사용되는 미리 정의된 속성 값은 다음과 같습니다.

 

글자 굵기

FW_DONTCARE         상관 안함

FW_THIN             얇은

FW_EXTRALIGHT      

FW_LIGHT            

FW_NORMAL           보통

FW_MEDIUM          

FW_SEMIBOLD         조금 굵기

FW_BOLD             굵게

FW_EXTRABOLD        매우 굵게

FW_HEAVY           

 

문자 셋 종류

ANSI_CHARSET            ANSI

DEFAULT_CHARSET         기본 값

SYMBOL_CHARSET         

SHIFTJIS_CHARSET       

HANGEUL_CHARSET         한글 완성

HANGUL_CHARSET          한글 완성

GB2312_CHARSET          GB2312

CHINESEBIG5_CHARSET     중국어

OEM_CHARSET            

JOHAB_CHARSET           한글 조합

HEBREW_CHARSET          히브리어

ARABIC_CHARSET          아라비아어

GREEK_CHARSET           그리스어

TURKISH_CHARSET         터키어

VIETNAMESE_CHARSET      베트남어

THAI_CHARSET           

EASTEUROPE_CHARSET     

RUSSIAN_CHARSET         러시아어

MAC_CHARSET             MAC 문자셋

BALTIC_CHARSET          발트어

 

 


1 2 3