static void elog_flash(uint8_t argc, char **argv) { if (argc >= 2) { if (!strcmp(argv[1], "read")) { if (argc >= 3) { elog_flash_outout_recent(atol(argv[2])); }else { elog_flash_outout_all(); } } else if (!strcmp(argv[1], "clean")) { elog_flash_clean(); } else if (!strcmp(argv[1], "flush")) { #ifdef ELOG_FLASH_USING_BUF_MODE elog_flash_flush(); #else rt_kprintf("EasyLogger flash log buffer mode is not open.\n"); #endif } else { rt_kprintf("Please input elog_flash {<read>, <clean>, <flush>}.\n"); } } else { rt_kprintf("Please input elog_flash {<read>, <clean>, <flush>}.\n"); } }
static void elog_user_assert_hook(const char* ex, const char* func, size_t line) { rt_enter_critical(); /* disable logger output lock */ elog_output_lock_enabled(false); /* disable flash plugin lock */ elog_flash_lock_enabled(false); /* output assert information */ elog_a("elog", "(%s) has assert failed at %s:%ld.\n", ex, func, line); /* write all buffered log to flash */ elog_flash_flush(); while(1); }
/** * Write log to flash. The flash write use buffer mode. * * @param log log * @param size log size */ void elog_flash_write(const char *log, size_t size) { #ifdef ELOG_FLASH_USING_BUF_MODE size_t write_size = 0, write_index = 0; #else size_t write_size_temp = 0; EfErrCode result = EF_NO_ERR; /* write some '\r' for word alignment */ char write_overage_c[4] = { '\r', '\r', '\r', '\r' }; #endif /* must be call this function after initialize OK */ ELOG_ASSERT(init_ok); /* lock flash log buffer */ log_buf_lock(); #ifdef ELOG_FLASH_USING_BUF_MODE while (true) { if (cur_buf_size + size > ELOG_FLASH_BUF_SIZE) { write_size = ELOG_FLASH_BUF_SIZE - cur_buf_size; memcpy(log_buf + cur_buf_size, log + write_index, write_size); write_index += write_size; size -= write_size; cur_buf_size += write_size; /* unlock flash log buffer */ log_buf_unlock(); /* write all buffered log to flash, cur_buf_size will reset */ elog_flash_flush(); /* lock flash log buffer */ log_buf_lock(); } else { memcpy(log_buf + cur_buf_size, log + write_index, size); cur_buf_size += size; break; } } #else /* calculate the word alignment write size */ write_size_temp = size / 4 * 4; /* write log to flash */ result = ef_log_write((uint32_t *) log, write_size_temp); /* write last word alignment data */ if ((result == EF_NO_ERR) && (write_size_temp != size)) { memcpy(write_overage_c, log + write_size_temp, size - write_size_temp); ef_log_write((uint32_t *) write_overage_c, 4); } #endif /* unlock flash log buffer */ log_buf_unlock(); }