这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 【EasyLogger】适配 FreeRTOS 环境

共1条 1/1 1 跳转至

【EasyLogger】适配 FreeRTOS 环境

高工
2026-02-24 15:51:20     打赏

【简介】

          在之前的贴子中介绍过(【Freertos】队列管理)FreeRTOS 的队列管理,FreeRTOS 中用到的 互斥锁/信号量  的底层实现都是队列来实现的,我们在上一篇中介绍了 EasyLogger 的同步log输出机制,我们再此基础上基于FreeRTOS环境适配EasyLogger异步log输出机制。

在之前裸机适配EasyLogger 的帖子(【EasyLogger】软件移植适配)中对于临界区的保护是使用关闭/开启中断的方式进行保护的,在 FreeRtos 环境下可以使用信号量互斥锁来进行保护临界区。我们只需要在裸机环境下将对应的临界区保护替换为FreeRTOS 的信号量的接口即可完成FreeRTOS环境的适配。

修改log buffer 临界区保护代码使用FreeRTOS 的互斥锁来实现。

/********************************************************************************************************
 *                                  Private Variable Definitions                                        *
 *******************************************************************************************************/
static SemaphoreHandle_t output_lock;

/**
 * EasyLogger port initialize
 *
 * @return result
 */
ElogErrCode elog_port_init(void) {
    ElogErrCode result = ELOG_NO_ERR;
    output_lock = xSemaphoreCreateMutex();
    return result;
}

/**
 * EasyLogger port deinitialize
 *
 */
void elog_port_deinit(void) {

    /* add your code here */

}

/**
 * output log port interface
 *
 * @param log output of log
 * @param size log size
 */
void elog_port_output(const char *log, size_t size) {
#if defined (CFG_EASY_LOGGER_TERMINAL_UART)
    for(unsigned int i = 0; i < size; i++)
    {
        while((CFG_EASY_LOGGER_TERMINAL_UART->STAT & LPUART_STAT_TC_MASK)>>LPUART_STAT_TC_SHIFT==0);
        CFG_EASY_LOGGER_TERMINAL_UART->DATA = log[i];
    }
#else
    /* output to terminal */
    printf("%.*s", size, log);
#endif
    //TODO output to flash
}

/**
 * output lock
 */
void elog_port_output_lock(void) {
    //__disable_irq();
    xSemaphoreTake(output_lock, portMAX_DELAY);
}

/**
 * output unlock
 */
void elog_port_output_unlock(void) {
    //__enable_irq();
    xSemaphoreGive(output_lock);
}

 适配获取系统时间接口

/**
 * get current time interface
 *
 * @return current time
 */
const char *elog_port_get_time(void) {
    static char cur_system_time[16] = "";
    snprintf(cur_system_time, 16, "%lu", xTaskGetTickCount());
    return cur_system_time;
}

运行测试程序验证发现FreeRTOS 环境下EasyLoger 已经按照预期的运行输出。

image.png



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]