=======================================================================================================
转载请注明原文地址:http://blog.csdn.net/crushonme/article/details/14517109
=======================================================================================================
最近在TI的e2e以及相关QQ群众讨论时很多同学在做DSP算法或者在使用中断时SYS/BIOS被异常挂起,最终分析下来的原因是因为在中断上下文中使用了Vps_printf()或者是在禁止中断后恢复中断前的期间内使用了Vps_printf(),即hwi_disable()和hwi_restore()的上下文中使用。
在TI提供的RDK(包括DVRRDK和IPNCRDK)中Ducati-M3和DSP中运行的实时操作系统为SYS/BIOS,在SYS/BIOS中输出到串口的打印API为System_printf()。提供的能输出到linux串口的API即为Vps_printf()和Vps_rprintf()。
下面我们来分析下Vps_printf()和Vps_rprintf的源代码和相关限制。
首先我们来看下两个API的实现代码:
01
int
Vps_printf(
char
*format,
...)
02
{
03
int
retVal;
04
va_list
vaArgPtr;
05
char
*buf
= NULL;
06
UInt32
cookie;
07
08
cookie
= Hwi_disable();
09
10
buf
= &gRemoteDebug_serverObj.printBuf[0];
11
12
va_start
(vaArgPtr,
format);
13
vsnprintf(buf,
REMOTE_DEBUG_SERVER_PRINT_BUF_LEN, format, vaArgPtr);
14
va_end
(vaArgPtr);
15
16
retVal
= RemoteDebug_serverPutString(gRemoteDebug_serverObj.coreId, buf);
17
18
Hwi_restore(cookie);
19
20
if
(BIOS_getThreadType()
== BIOS_ThreadType_Task)
21
{
22
23
24
25
System_printf(buf);
26
}
27
28
return
(retVal);
29
}
01
int
Vps_rprintf(
char
*format,
...)
02
{
03
int
retVal;
04
va_list
vaArgPtr;
05
char
*buf
= NULL;
06
UInt32
cookie;
07
08
cookie
= Hwi_disable();
09
10