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

浏览源代码.

函数

const CHAROsLogLvGet (INT32 level)
 
STATIC VOID ErrorMsg (VOID)
 
STATIC VOID UartOutput (const CHAR *str, UINT32 len, BOOL isLock)
 串口输出,打印消息的本质就是向串口输出buf 更多...
 
STATIC VOID ConsoleOutput (const CHAR *str, UINT32 len)
 控制台输出 更多...
 
VOID OutputControl (const CHAR *str, UINT32 len, OutputType type)
 
STATIC VOID OsVprintfFree (CHAR *buf, UINT32 bufLen)
 
VOID OsVprintf (const CHAR *fmt, va_list ap, OutputType type)
 printf由 print 和 format 两个单词构成,格式化输出函数, 一般用于向标准输出设备按规定格式输出信息 更多...
 
VOID UartVprintf (const CHAR *fmt, va_list ap)
 串口方式输入printf内容 更多...
 
 __attribute__ ((noinline))
 attribute((noinline)) 意思是告诉编译器 这是非内联函数 更多...
 
VOID LkDprintf (const CHAR *fmt, va_list ap)
 LK 注者的理解是 log kernel(内核日志) 更多...
 
VOID DmesgPrintf (const CHAR *fmt, va_list ap)
 
VOID PrintExcInfo (const CHAR *fmt,...)
 打印异常信息 更多...
 
VOID LOS_LkPrint (INT32 level, const CHAR *func, INT32 line, const CHAR *fmt,...)
 print log. 更多...
 

变量

const CHARg_logString []
 

函数说明

◆ __attribute__()

__attribute__ ( (noinline)  )

attribute((noinline)) 意思是告诉编译器 这是非内联函数

异常信息的输出

可变参数,输出到控制台

在文件 los_printf.c194 行定义.

195{
196 va_list ap;
197 va_start(ap, fmt);
198 OsVprintf(fmt, ap, UART_OUTPUT);
199 va_end(ap);
200}
VOID OsVprintf(const CHAR *fmt, va_list ap, OutputType type)
printf由 print 和 format 两个单词构成,格式化输出函数, 一般用于向标准输出设备按规定格式输出信息
Definition: los_printf.c:138
@ UART_OUTPUT
Definition: los_printf.h:106
函数调用图:

◆ ConsoleOutput()

STATIC VOID ConsoleOutput ( const CHAR str,
UINT32  len 
)

控制台输出

在文件 los_printf.c90 行定义.

91{
92 ssize_t written = 0;
93 ssize_t cnt;
94 ssize_t toWrite = len;//每次写入的数量
95
96 for (;;) {
97 cnt = write(STDOUT_FILENO, str + written, (size_t)toWrite);//向控制台写入数据,STDOUT_FILENO = 1
98 if ((cnt < 0) || ((cnt == 0) && ((!OsPreemptable()) || (OS_INT_ACTIVE))) || (toWrite == cnt)) {
99 break;
100 }
101 written += cnt; //已写入数量增加
102 toWrite -= cnt; //要写入数量减少
103 }
104}
STATIC INLINE BOOL OsPreemptable(VOID)
INT64 ssize_t
Definition: los_typedef.h:79
函数调用图:
这是这个函数的调用关系图:

◆ DmesgPrintf()

VOID DmesgPrintf ( const CHAR fmt,
va_list  ap 
)

在文件 los_printf.c228 行定义.

229{
230 OsVprintf(fmt, ap, CONSOLE_OUTPUT);
231}
@ CONSOLE_OUTPUT
Definition: los_printf.h:107
函数调用图:
这是这个函数的调用关系图:

◆ ErrorMsg()

STATIC VOID ErrorMsg ( VOID  )

在文件 los_printf.c69 行定义.

70{
71 const CHAR *p = "Output illegal string! vsnprintf_s failed!\n";
72 UartPuts(p, (UINT32)strlen(p), UART_WITH_LOCK);
73}
unsigned int UINT32
Definition: los_typedef.h:57
char CHAR
Definition: los_typedef.h:63
VOID UartPuts(const CHAR *s, UINT32 len, BOOL isLock)
函数调用图:
这是这个函数的调用关系图:

◆ LkDprintf()

VOID LkDprintf ( const CHAR fmt,
va_list  ap 
)

LK 注者的理解是 log kernel(内核日志)

在文件 los_printf.c217 行定义.

218{
219 OsVprintf(fmt, ap, CONSOLE_OUTPUT);
220#ifdef LOSCFG_SAVE_EXCINFO
221 if (OsGetSystemStatus() == OS_SYSTEM_EXC_CURR_CPU) {
222 WriteExcBufVa(fmt, ap);
223 }
224#endif
225}
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
函数调用图:
这是这个函数的调用关系图:

◆ OsLogLvGet()

const CHAR * OsLogLvGet ( INT32  level)

在文件 los_printf.c64 行定义.

65{
66 return g_logString[level];
67}
const CHAR * g_logString[]
Definition: los_printf.c:54
这是这个函数的调用关系图:

◆ 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
@ EXC_OUTPUT
Definition: los_printf.h:108
signed int INT32
Definition: los_typedef.h:60
函数调用图:
这是这个函数的调用关系图:

◆ OsVprintfFree()

STATIC VOID OsVprintfFree ( CHAR buf,
UINT32  bufLen 
)

在文件 los_printf.c130 行定义.

131{
132 if (bufLen != SIZEBUF) {
133 (VOID)LOS_MemFree(m_aucSysMem0, buf);
134 }
135}
函数调用图:
这是这个函数的调用关系图:

◆ OutputControl()

VOID OutputControl ( const CHAR str,
UINT32  len,
OutputType  type 
)

在文件 los_printf.c107 行定义.

108{
109 switch (type) {//输出类型
110 case CONSOLE_OUTPUT://控制台输出
111#ifdef LOSCFG_PLATFORM_CONSOLE
112 if (ConsoleEnable() == TRUE) {//POSIX 定义了 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 来代替 0、1、2
113 ConsoleOutput(str, len);//输出到控制台
114 break;
115 }
116#endif
117 /* fall-through */ //落空的情况下,会接着向串口打印数据
118 case UART_OUTPUT: //串口输出
119 UartOutput(str, len, UART_WITH_LOCK);//向串口发送数据
120 break;
121 case EXC_OUTPUT: //异常输出
122 UartPuts(str, len, UART_WITH_LOCK);
123 break;
124 default:
125 break;
126 }
127 return;
128}
BOOL ConsoleEnable(VOID)
控制台使能
Definition: console.c:1415
STATIC VOID ConsoleOutput(const CHAR *str, UINT32 len)
控制台输出
Definition: los_printf.c:90
STATIC VOID UartOutput(const CHAR *str, UINT32 len, BOOL isLock)
串口输出,打印消息的本质就是向串口输出buf
Definition: los_printf.c:75
函数调用图:
这是这个函数的调用关系图:

◆ PrintExcInfo()

VOID PrintExcInfo ( const CHAR fmt,
  ... 
)

打印异常信息

在文件 los_printf.c263 行定义.

264{
265 va_list ap;
266 va_start(ap, fmt);
267 /* uart output without print-spinlock */
268 OsVprintf(fmt, ap, EXC_OUTPUT);//异常信息打印主体函数
269#ifdef LOSCFG_SAVE_EXCINFO
270 WriteExcBufVa(fmt, ap);
271#endif
272 va_end(ap);
273}
函数调用图:
这是这个函数的调用关系图:

◆ UartOutput()

STATIC VOID UartOutput ( const CHAR str,
UINT32  len,
BOOL  isLock 
)

串口输出,打印消息的本质就是向串口输出buf

在文件 los_printf.c75 行定义.

76{
77#ifdef LOSCFG_SHELL_DMESG //是否打开了 dmesg开关,打开了会写到文件中 var/log/dmesg 文件中
78 if (!OsCheckUartLock()) {//是否被锁
79 UartPuts(str, len, isLock);//直接写串口
80 }
81 if (isLock != UART_WITHOUT_LOCK) {
82 (VOID)OsLogMemcpyRecord(str, len);//写入dmesg缓存区
83 }
84#else
85 UartPuts(str, len, isLock);//没有打开dmesg开关时,直接写串口
86#endif
87}
UINT32 OsCheckUartLock(VOID)
Definition: dmesg.c:328
INT32 OsLogMemcpyRecord(const CHAR *buf, UINT32 logLen)
内存拷贝日志
Definition: dmesg.c:508
函数调用图:
这是这个函数的调用关系图:

◆ UartVprintf()

VOID UartVprintf ( const CHAR fmt,
va_list  ap 
)

串口方式输入printf内容

在文件 los_printf.c189 行定义.

190{
191 OsVprintf(fmt, ap, UART_OUTPUT);
192}
函数调用图:

变量说明

◆ g_logString

const CHAR* g_logString[]
初始值:
= {
"EMG",
"COMMON",
"ERR",
"WARN",
"INFO",
"DEBUG",
"TRACE"
}

在文件 los_printf.c54 行定义.