TDA4VH Log Writer

本文详细介绍了LogWriter在多核系统中实现共享日志的方法,涉及LogSharedMemory、LogCpuSharedMemory结构,以及如何通过LogCpuSyncState进行同步。文章还提供了测试路径和输出示例。
摘要由CSDN通过智能技术生成

Log Writer

Log Writer的作用,是多核之间共享log的一种方式,最终输出在A核的控制台,需要执行A核vision_apps_init.sh才能输出,整体原理就是共享内存循环Buffer。

Log Shared Memory

Log Shared Memory全局变量起始地址0xAF000000,按照4096字节对齐。

app_log_shared_mem_t g_app_log_shared_mem __attribute__ ((section(".bss:app_log_mem"))) __attribute__ ((aligned(4096)));

各个核共享内存的起始地址如下,每个核起始地址偏移0x4000。

在这里插入图片描述

整个log模块只是需要各个核的起始地址,这个全局变量起到定位起始地址的情况,在优化代码的时候可以直接替换为各个核交互的实际地址。

Log Cpu Shared Memory

每个核的输出buffer定义在下面的结构,上面我们说到,优化代码的时候,可以直接删除上面的全局变量,如果各个核定义上面全局变量需要16161024 = 256K代码空间。

优化的时候可以直接将取地址的方式,直接替换为对应各个核起始地址。

在这里插入图片描述

app log cpu数据结构如下:

typedef struct {

    volatile uint32_t log_rd_idx; /**< Init by reader to 0 */

    volatile uint32_t log_wr_idx; /**< Init by writer to 0 */

    volatile uint32_t log_area_is_valid; /**<  Init by writer to APP_LOG_AREA_VALID_FLAG.
                                      reader will ignore this CPU shared mem log
                                      until the writer sets this
                                      to APP_LOG_AREA_VALID_FLAG */

    volatile  uint32_t log_cpu_sync_state;    /**< CPU sync state */

    volatile  uint8_t  log_cpu_name[APP_LOG_MAX_CPU_NAME]; /**< Init by writer to CPU name, used by reader to add a prefix when writing to console device */

    volatile  uint8_t  log_mem[APP_LOG_PER_CPU_MEM_SIZE]; /**< memory into which logs are written by this CPU */
} app_log_cpu_shared_mem_t;

测试截图如下:

在这里插入图片描述

Log Area Is Valid

#define APP_LOG_AREA_VALID_FLAG (0x1357231u)

每个核LOG区域有效标志位。

Log Rd Wr Idx

当前读写的index标志位,循环到16*1024-32,从0重新循环,32字节就是上面结构体大小。

在这里插入图片描述

Log Cpu Sync State

#define APP_LOG_CPU_SYNC_STATE_INVALID            (0u)
#define APP_LOG_CPU_SYNC_STATE_INIT_DONE          (1u)
#define APP_LOG_CPU_SYNC_STATE_TEST_INIT_DONE     (2u)
#define APP_LOG_CPU_SYNC_STATE_CONFIRM_INIT_DONE  (3u)
#define APP_LOG_CPU_SYNC_STATE_RUN                (4u)

设置每个核同步完成标志位,APP_LOG_CPU_SYNC_STATE_CONFIRM_INIT_DONE。

Master核设置INIT_DONE flag,Slave核作为同步等待状态。

void appLogCpuSyncWithMaster(uint32_t self_cpu_id)
{
/* TODO: Infinite wait for synchronization causing issues with QNX implementation */

    volatile uint32_t state;

    appLogSetCpuSyncState(self_cpu_id, APP_LOG_CPU_SYNC_STATE_INIT_DONE);

    do {
        appLogGetCpuSyncState(self_cpu_id, &state);
    } while(state != APP_LOG_CPU_SYNC_STATE_TEST_INIT_DONE);

    appLogSetCpuSyncState(self_cpu_id, APP_LOG_CPU_SYNC_STATE_CONFIRM_INIT_DONE);

    do {
        appLogGetCpuSyncState(self_cpu_id, &state);
    } while(state != APP_LOG_CPU_SYNC_STATE_RUN);
}

Log Cpu Name

当前共享内存的核ASCII码。

Log Mem

整个16K共享内存缓存区域。

Log Test

A核测试路径:

在这里插入图片描述

输出测试结果:

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值