Beispiel #1
0
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");
    }
}
Beispiel #2
0
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);
}
Beispiel #3
0
/**
 * 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();
}