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

来源:互联网 发布:淘宝企业店铺怎么转让 编辑:程序博客网 时间:2024/06/11 05:00

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两种情况,示意图如下:

假设某时刻缓冲区如下,绿色为已有数据的区域,红色为空闲区域:

若新输入缓冲区的数据并未超过缓存区最大长度pd->msg_len,则直接拷入数据(黄色部分),移动结束位置下标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基本原理相同。

0 0