DSP

Amba A7 串口打印功能实现简析

2019-07-13 10:44发布

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]   本节主要描述RTOSDSP调试信息的打印实现与相关测试命令。   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基本原理相同。