更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_printf.h 文件参考

浏览源代码.

类型定义

typedef VOID(* pf_OUTPUT) (const CHAR *fmt,...)
 

枚举

enum  OutputType { NO_OUTPUT = 0 , UART_OUTPUT = 1 , CONSOLE_OUTPUT = 2 , EXC_OUTPUT = 3 }
 

函数

VOID LOS_LkPrint (INT32 level, const CHAR *func, INT32 line, const CHAR *fmt,...)
 打印 更多...
 
void dprintf (const char *fmt,...)
 Format and print data. 更多...
 
VOID OsVprintf (const CHAR *fmt, va_list ap, OutputType type)
 printf由 print 和 format 两个单词构成,格式化输出函数, 一般用于向标准输出设备按规定格式输出信息 更多...
 
VOID UartPuts (const CHAR *s, UINT32 len, BOOL isLock)
 

类型定义说明

◆ pf_OUTPUT

typedef VOID(* pf_OUTPUT) (const CHAR *fmt,...)

在文件 los_printf.h70 行定义.

枚举类型说明

◆ OutputType

enum OutputType
枚举值
NO_OUTPUT 
UART_OUTPUT 
CONSOLE_OUTPUT 
EXC_OUTPUT 

在文件 los_printf.h104 行定义.

104 { //输出类型
105 NO_OUTPUT = 0,
106 UART_OUTPUT = 1, //串口输出
107 CONSOLE_OUTPUT = 2, //控制台输出
108 EXC_OUTPUT = 3 //出现异常时的输出
109} OutputType;
OutputType
Definition: los_printf.h:104
@ EXC_OUTPUT
Definition: los_printf.h:108
@ NO_OUTPUT
Definition: los_printf.h:105
@ UART_OUTPUT
Definition: los_printf.h:106
@ CONSOLE_OUTPUT
Definition: los_printf.h:107

函数说明

◆ LOS_LkPrint()

VOID LOS_LkPrint ( INT32  level,
const CHAR func,
INT32  line,
const CHAR fmt,
  ... 
)

打印

在文件 los_printf.c276 行定义.

277{
278 va_list ap;
279
280 if (level > PRINT_LEVEL) {
281 return;
282 }
283
284 if ((level != LOS_COMMON_LEVEL) && ((level > LOS_EMG_LEVEL) && (level <= LOS_TRACE_LEVEL))) {
285 PRINTK("[%s][%s:%s]", g_logString[level],
286 ((OsCurrProcessGet() == NULL) ? "NULL" : OsCurrProcessGet()->processName),
287 ((OsCurrTaskGet() == NULL) ? "NULL" : OsCurrTaskGet()->taskName));
288 }
289
290 va_start(ap, fmt);
291 OsVprintf(fmt, ap, CONSOLE_OUTPUT);//控制台打印
292#ifdef LOSCFG_SAVE_EXCINFO
293 if (OsGetSystemStatus() == OS_SYSTEM_EXC_CURR_CPU) {
294 WriteExcBufVa(fmt, ap);
295 }
296#endif
297 va_end(ap);
298}
UINT32 OsGetSystemStatus(VOID)
获取系统状态
Definition: los_exc.c:181
VOID WriteExcBufVa(const CHAR *format, va_list arglist)
vsnprintf 为C标准库可变参数的实现函数 见于 ..\third_party\musl\kernel\src\stdio\vsnprintf.c
Definition: los_excinfo.c:99
VOID OsVprintf(const CHAR *fmt, va_list ap, OutputType type)
printf由 print 和 format 两个单词构成,格式化输出函数, 一般用于向标准输出设备按规定格式输出信息
Definition: los_printf.c:138
const CHAR * g_logString[]
Definition: los_printf.c:54
STATIC INLINE LosProcessCB * OsCurrProcessGet(VOID)
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)

◆ OsVprintf()

VOID OsVprintf ( const CHAR fmt,
va_list  ap,
OutputType  type 
)

printf由 print 和 format 两个单词构成,格式化输出函数, 一般用于向标准输出设备按规定格式输出信息

在文件 los_printf.c138 行定义.

139{
140 INT32 len;
141 const CHAR *errMsgMalloc = "OsVprintf, malloc failed!\n";//内存分配失败的错误日志,注意这是在打印函数里分配内存失败的情况
142 const CHAR *errMsgLen = "OsVprintf, length overflow!\n";//所以要直接向串口发送字符串,不能再调用 printK(...)打印日志了.
143 CHAR aBuf[SIZEBUF] = {0};
144 CHAR *bBuf = NULL;
145 UINT32 bufLen = SIZEBUF;
146 UINT32 systemStatus;
147
148 bBuf = aBuf;
149 len = vsnprintf_s(bBuf, bufLen, bufLen - 1, fmt, ap);//C语言库函数之一,属于可变参数。用于向字符串中打印数据、数据格式用户自定义。
150 if ((len == -1) && (*bBuf == '\0')) {//直接碰到字符串结束符或长度异常
151 /* parameter is illegal or some features in fmt dont support */ //参数非法或fmt中的某些功能不支持
152 ErrorMsg();
153 return;
154 }
155
156 while (len == -1) {//处理((len == -1) && (*bBuf != '\0'))的情况
157 /* bBuf is not enough */
158 OsVprintfFree(bBuf, bufLen);
159
160 bufLen = bufLen << 1;
161 if ((INT32)bufLen <= 0) {//异常情况下 向串口发送
162 UartPuts(errMsgLen, (UINT32)strlen(errMsgLen), UART_WITH_LOCK);
163 return;
164 }
165 bBuf = (CHAR *)LOS_MemAlloc(m_aucSysMem0, bufLen);
166 if (bBuf == NULL) {//分配内存失败,直接向串口发送错误信息
167 UartPuts(errMsgMalloc, (UINT32)strlen(errMsgMalloc), UART_WITH_LOCK);
168 return;
169 }
170 len = vsnprintf_s(bBuf, bufLen, bufLen - 1, fmt, ap);//将ap按格式输出到buf中
171 if (*bBuf == '\0') {//字符串结束符
172 /* parameter is illegal or some features in fmt dont support */
173 (VOID)LOS_MemFree(m_aucSysMem0, bBuf);
174 ErrorMsg();
175 return;
176 }
177 }
178 *(bBuf + len) = '\0';
179
180 systemStatus = OsGetSystemStatus();//获取系统的状态
181 if ((systemStatus == OS_SYSTEM_NORMAL) || (systemStatus == OS_SYSTEM_EXC_OTHER_CPU)) {//当前CPU正常或其他CPU出现异常时
182 OutputControl(bBuf, len, type);//输出到终端
183 } else if (systemStatus == OS_SYSTEM_EXC_CURR_CPU) {//当前CPU出现异常
184 OutputControl(bBuf, len, EXC_OUTPUT);//串口以无锁的方式输出
185 }
186 OsVprintfFree(bBuf, bufLen);
187}
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
Definition: los_memory.c:1123
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
Definition: los_memory.c:1369
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
Definition: los_memory.c:107
STATIC VOID ErrorMsg(VOID)
Definition: los_printf.c:69
STATIC VOID OsVprintfFree(CHAR *buf, UINT32 bufLen)
Definition: los_printf.c:130
VOID OutputControl(const CHAR *str, UINT32 len, OutputType type)
Definition: los_printf.c:107
signed int INT32
Definition: los_typedef.h:60
unsigned int UINT32
Definition: los_typedef.h:57
char CHAR
Definition: los_typedef.h:63
VOID UartPuts(const CHAR *s, UINT32 len, BOOL isLock)
函数调用图:
这是这个函数的调用关系图:

◆ UartPuts()

VOID UartPuts ( const CHAR s,
UINT32  len,
BOOL  isLock 
)