【简介】
在之前的贴子中介绍过(【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 已经按照预期的运行输出。

我要赚赏金
