0:概述
Amba平台print函数/任务是软件调试中的重要工具,本文将分析RTOS/DSP调试信息输出的实现
1:RTOS/DSP调试信息输出的实现
1.0 RTOS/DSP调试信息概述
AmbaA7方案软件分为数个功能模块,包括有例如:RTOS,DSP,BOSS(linux)等,它们在运行时位于内存的不同位置:
[00000009]fios/dma:
0xc0000000 - 0xc007ffff [0x00080000]
[00000009] rtos + app:
0xc0100000- 0xc0e1b5ff [0x00d1b600]
[00000009]cached heap:
0xc0e1c000 - 0xc5c13fff [0x04df8000]
[00000009]non-cached heap:
0xc5c14000 - 0xc5c73fff [0x00060000]
[00000009]audio:
0xc5c74000- 0xc5dbffff [0x0014c000]
[00000009]osd:
0xc5dc0000 - 0xc64cffff [0x00710000]
[00000009]ucode:
0xc64d0000 - 0xc69cffff [0x00500000]
[00000009] dsp:
0xc69d0000 - 0xcd5fffff [0x06c30000]
[00000009]linux:
0xcd600000- 0xcfffffff [0x02a00000]
本节主要描述
RTOS与DSP调试信息的打印实现与相关测试命令。
1.1 RTOS调试信息输出的实现
1.1.1: RTOS/DSP调试信息输出原理
系统会通过printk_init创建打印信息守护任务print_daemon_task,print_daemon_task会一直等待打印事件标志位(PrintEventFlag)。
用户调用相关打印函数时,系统首先将需要打印的数据传入RTOS/DSP的调试信息缓存区,并且置位PrintEventFlag。
当OS任务调度到print_daemon_task运行时,首先判断PrintEventFlag,若标志位未置位代表打印缓存内无数据需要输出;若已置位则将RTOS/DSP的调试信息缓存区内的数据传输给串口0输出。
输出数据完成后清除PrintEventFlag,继续等待PrintEventFlag下次被用户调用printk后置位。
1.1.2: RTOS调试信息的实时打印
与RTOS调试信息相关的数据,参见类型print_daemon_s,主要有以下几个:
数组msg[MEMLOG_CORE_SIZE]就是RTOS调试信息的缓冲区,并且是
循环缓冲的;对应的变量head,tail用来记录某时刻缓冲区内数据的起始下标与结束下标,很显然它们用于控制
调试信息在缓冲区输入输出的。
函数printk最终调用的vprintk_nn中实现了对RTOS调试信息缓冲区的输入操作:
缓冲区的输入有No Wrap与Wrap Around两种情况,示意图如下:
假设某时刻缓冲区如下,绿 {MOD}为已有数据的区域,红 {MOD}为空闲区域:
若新输入缓冲区的数据并未超过缓存区最大长度pd->msg_len,则直接拷入数据(黄 {MOD}部分),移动结束位置下标tail即可(No Wrap):
若新输入缓冲区的数据超过了缓存区最大长度,则循环拷入(Wrap Around)
新输入的缓冲区的数据,由l = vsprintf(buf, fmt,args)的l(
不大于buf长度)确定,由于
buf被定义为1024字节的全局数组(换言之,若单次printk的信息超过1024字节,可能出现异常),而RTOS调试信息的缓冲区总大小为#define
MEMLOG_CORE_SIZE (1024 * 128)字节,
因此一般不会出现数据冲突或者丢失。
打印任务print_daemon_task中对RTOS调试信息缓冲区的输出操作,对应vprintk_nn中的输入操作,输出就是输入对缓存区操作的逆向过程,并且最后通过uart_write写入到
UART_STDIO:
1.1.3: RTOS调试信息的文件保存
查看打印守护任务print_daemon_task,事实上对于RTOS(以及DSP)是具有文件保存调试信息功能的,print_daemon_s的成员变量rtos_file提供文件保存功能的回调接口,并在print_daemon_task中调用:
源码文件system/src/comsvc/printk2file.c下有函数:
int log_open_file(int mode, char *filename)/ intlog_close_file(int mode)
调用log_open_file(0x01,"D:\rtos_log.txt"),即可存储RTOS调试信息到文件rtos_log.txt。
但是由于打开该功能会频繁读写文件,因此具体影响未知,并且不建议打开。
1.1.4: RTOS调试信息回溯与串口命令"dmesg"
事实上系统还提供了回溯查看RTOS/DSP调试信息的功能,并且提供命令dmesg用于查看。实现此功能的重要数据是:
vprintk_nn每次有新的打印信息加入到调试信息缓存区后,会调用
保存本次信息的起始存储位置。
dmesg会调用函数printk_get_rtos_lmsg检索到倒数第lines条消息的起始地址:
最终根据第lines条消息的起始地址,输出自第lines条消息后的所有log:
1.2 DSP 调试信息输出的实现
DSP调试信息的实现与RTOS基本原理相同。