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 에서 스 레 드 는 다음 과 같은 몇 가지 로 나 눌 수 있 습 니 다. 아래 그림 과 같 습 니 다.
2. SYS / BIOS 의 Systemprintf () 는 두 가지 모드 로 만 들 수 있 습 니 다. 하 나 는 직렬 로 출력 하 는 것 이 고, 다른 하 나 는 SYS / BIOS 에 내용 을 출력 하 는 정적 circular 입 니 다. buffer 중.System_printf () 의 정적 circular buffer 설정 및 출력 방식 설정 은 다음 그림 과 같 습 니 다.
관련 문서:
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
스레드 동기화---귀속 자물쇠Mutex는 귀속 자물쇠(recursive mutex)와 비귀속 자물쇠(non-recursive mutex)로 나눌 수 있다.귀속 가능한 자물쇠는 다시 들어갈 수 있는 자물쇠(reentrantmutex)라고도 할 수...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.