RDK 의 Vpsprintf () 와 Vpsrprintf()

=======================================================================================================
전송 할 때 원본 주 소 를 밝 혀 주 십시오:http://blog.csdn.net/crushonme/article/details/16105261
=======================================================================================================
       최근 TI 의 e2e 및 관련 QQ 군중 들 이 토론 할 때 많은 학생 들 이 DSP 알고리즘 을 만 들 거나 사용 중단 시 SYS / BIOS 가 이상 하 게 걸 렸 다. 최종 적 으로 분석 한 이 유 는 중단 컨 텍스트 에 Vps 를 사 용 했 기 때문이다.printf () 또는 인 터 럽 트 금지 후 인 터 럽 트 재 개 전 까지 Vps 사용printf (), 즉 hwidisable () 과 hwirestore () 의 상하 문 에서 사용 합 니 다.
       TI 에서 제공 하 는 RDK (DVRRDK 와 IPNCRDK 포함) 에서 Ducati - M3 와 DSP 에서 실행 되 는 실시 간 운영 체 제 는 SYS / BIOS, SYS / BIOS 에서 직렬 로 출력 되 는 인쇄 API 는 Systemprintf()。Liux 직렬 포트 에 출력 할 수 있 는 API 를 제공 하 는 것 은 Vps 입 니 다.printf () 와 Vpsrprintf()。
       다음은 Vps 를 분석 해 보 겠 습 니 다.printf () 와 Vpsrprintf 의 소스 코드 와 관련 된 제한.
       우선 다음 두 API 의 실현 코드 를 살 펴 보 겠 습 니 다.
int Vps_printf(char *format, ...)
{
    int retVal;
    va_list vaArgPtr;
    char *buf = NULL;
    UInt32 cookie;

    cookie = Hwi_disable();

    buf = &gRemoteDebug_serverObj.printBuf[0];

    va_start(vaArgPtr, format);
    vsnprintf(buf, REMOTE_DEBUG_SERVER_PRINT_BUF_LEN, format, vaArgPtr);
    va_end(vaArgPtr);

    retVal = RemoteDebug_serverPutString(gRemoteDebug_serverObj.coreId, buf);

    Hwi_restore(cookie);

    if (BIOS_getThreadType() == BIOS_ThreadType_Task)
    {
        /* Printf should be called only from Task context as it does pend.
         * Calling from other context will cause exception
         */
        System_printf(buf);
    }

    return (retVal);
}
int Vps_rprintf(char *format, ...)
{
    int retVal;
    va_list vaArgPtr;
    char *buf = NULL;
    UInt32 cookie;

    cookie = Hwi_disable();

    buf = &gRemoteDebug_serverObj.printBuf[0];

    va_start(vaArgPtr, format);
    vsnprintf(buf, REMOTE_DEBUG_SERVER_PRINT_BUF_LEN, format, vaArgPtr);
    va_end(vaArgPtr);

    retVal = RemoteDebug_serverPutString(gRemoteDebug_serverObj.coreId, buf);

    Hwi_restore(cookie);

    return (retVal);
}
       위의 양 끝 코드 에서 Vps 를 뚜렷하게 볼 수 있 습 니 다.printf () 와 Vpsrprintf () 의 앞부분 은 공유 메모리 에 출력 되 어 A8 사 이 드 인쇄 스 레 드 출력 을 제공 하 는 것 입 니 다. 유일한 차이 점 은 Vps 입 니 다.printf () 는 현 재 를 판단 합 니 다.
thread 형식 이 Task 인지, Task 라면 SYS / BIOS 의 System 을 호출 합 니 다.printf () 는 프로세서 의 직렬 포트 나 Circular Buffer 에 데 이 터 를 출력 합 니 다.
       Vps 에서printf () 에 다음 설명 이 있 습 니 다.
        /* Printf should be called only from Task context as it does pend.
         * Calling from other context will cause exception
         */
즉 Vpsprintf () 는 Task 작업 형식 에 만 사용 할 수 있 습 니 다.
thread, 다른 유형의 thread 에서 이상 이 발생 할 수 있 습 니 다.(
thread 는 스 레 드 로 번역 되 지 않 았 습 니 다. 여기 thread 는 우리 가 일반적으로 이해 하 는 스 레 드 와 차이 가 있 기 때 문 입 니 다)
      그리고 주의해 야 할 것 은 Vpsprintf () 와 Vpsrprintf () 의 실현 에 있어 하드웨어 인 터 럽 트 를 차단 해 야 하기 때문에 하드웨어 인 터 럽 트 형식의 thread 에 사용 할 수 없습니다.다음 에 어린이 신발 을 잘못 사용 한 예 가 있 습 니 다.

주:
1. SYS / BIOS 에서 스 레 드 는 다음 과 같은 몇 가지 로 나 눌 수 있 습 니 다. 아래 그림 과 같 습 니 다.
RDK中的Vps_printf()与Vps_rprintf()_第1张图片
2. SYS / BIOS 의 Systemprintf () 는 두 가지 모드 로 만 들 수 있 습 니 다. 하 나 는 직렬 로 출력 하 는 것 이 고, 다른 하 나 는 SYS / BIOS 에 내용 을 출력 하 는 정적 circular 입 니 다. buffer 중.System_printf () 의 정적 circular buffer 설정 및 출력 방식 설정 은 다음 그림 과 같 습 니 다.
RDK中的Vps_printf()与Vps_rprintf()_第2张图片
관련 문서:
1、SYS/BIOS wiki:http://processors.wiki.ti.com/index.php?title=Category:SYSBIOS
2、SYS/BIOS API: http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/sysbios/6_21_01_16/exports/docs/docs/cdoc/ti/sysbios/BIOS.html#.Thread.Type
3. e2e 문답:http://e2e.ti.com/support/development_tools/code_composer_studio/f/81/t/43747.aspx
http://e2e.ti.com/support/embedded/bios/f/355/t/224754.aspx

좋은 웹페이지 즐겨찾기