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核测试路径:
输出测试结果: