DSP

RDK中的Vps_printf()与Vps_rprintf()

2019-07-13 17:01发布

======================================================================================================= 转载请注明原文地址: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         /* Printf should be called only from Task context as it does pend. 23          * Calling from other context will cause exception 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