Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

有些代码并不是可跨平台移植的 #136

Open
xiongyu0523 opened this issue Apr 24, 2023 · 1 comment
Open

有些代码并不是可跨平台移植的 #136

xiongyu0523 opened this issue Apr 24, 2023 · 1 comment

Comments

@xiongyu0523
Copy link

Easylogger 一些代码并不是可跨平台移植的,导致可移植的代码和port之间界限不是很清晰

比如elog_file.c使用了libc fopen/fwrite这些函数,虽然libc是标准的,但实际情况是很多嵌入式平台上没有,而使用的如fatfs, littefs等FS接口。进而要求用户手动改elog_file.c文件,其中关于file rotation的部分比较容易出错。最近在一个平台上使用easylogger的时候做了一些修改,在elog_file.c中使用一组自定义的简单文件接口,而在elog_file_port.c中只需要实现这些接口即可

elog_file_port.h

#define ELOG_FILE_INVALID_HANDLE    -1

typedef int ElogFileHandle;

/* file port */
ElogErrCode elog_file_port_init(void);
#ifdef ELOG_FILE_LOCK_ENABLE
void elog_file_port_lock(void);
void elog_file_port_unlock(void);
#define ELOG_FILE_LOCK()        elog_file_port_lock()
#define ELOG_FILE_UNLOCK()      elog_file_port_unlock()
#else
#define ELOG_FILE_LOCK()
#define ELOG_FILE_UNLOCK()
#endif
void elog_file_port_deinit(void);
ElogFileHandle elog_file_port_open_file_append_mode(const char *file_name);
bool elog_file_port_is_file_exist(const char *file_name);
size_t elog_file_port_get_file_size(ElogFileHandle handle);
size_t elog_file_port_write_file(ElogFileHandle handle, const uint8_t *buffer, size_t size);
void elog_file_port_remove_file(const char *file_name);
void elog_file_port_rename_file(const char* old_file_name, const char* new_file_name);
void elog_file_port_close_file(ElogFileHandle handle);

具体这些接口的命名和实现可以讨论, 如果认可这种方式,可以进一步讨论接口机命名,我可以进一步提供PR,包含几个常见文件系统port.

类似的情况还有elog_async.c中包含pthread的代码,如果不支持pthread,用户要修改elog_async.c,并理解async是怎么实现的。如果能有port层,无需理解实现只要按照接口要求实现线程、信号的操作即可。(这个我目前没有实现吗,只是拿出来举例)

@armink
Copy link
Owner

armink commented Apr 30, 2023

  • elog_file.c 使用的是标准的 libc 文件系统接口,其本身是跨平台的。应该说是 fatfs, littefs 没有按照标准来实现,这块你可以参考 RT-Thread 的 DFS 框架,底层兼容了各种文件系统,上层统一出来 libc/posix 的文件系统接口,而 elog 依赖的是这层接口
  • elog_async.c 其实只是用 pthread 实现了一种异步日志形式的参考,在 https://github.com/armink/EasyLogger/blob/master/demo/os/rt-thread/stm32f10x/components/easylogger/port/elog_port.c 还有 RT-Thread 异步日志的实现示例,不同操作系统,参考这个实现一下就好了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants