本帖最后由 vsfopen 于 2022-7-10 12:35 编辑
【目标读者】
已经按照帖子 https://bbs.21ic.com/icview-3231822-1-1.html 可以正常编译运行vsf.linux的用户。
【文档目标】
说明在vsf.linux中添加用户自定义应用的方式以及一些注意事项。文档内容会不定期更新。
【注意事项】
1. vsf.linux中的API是按需开发的,并不是一次性把所有的linux API都实现。在使用过程中,如果有哪些API缺失,或者功能不符合要求,请在QQ群里给我们留言,我们会修复。
2. 有一些API无法实现,比如fork、vfork、clone等等
3. 有一些功能并非完全符合linux的实现
1) signal使用unwaitable thread来实现的。
2) terminal只支持raw模式,不做数据处理
4. linux的API只能在linux的上下文里调用(比如,linux的ptrhead里、进程的主入口、spawn建立的进程里等等),不能再非linux上下文中调用(比如,非linux的系统回调、中断等等)
【应用结构】
1. 应用入口,vsf_main.c文件中的VSF_APP_ENTRY
// TODO: SDL require that main need argc and argv
int VSF_APP_ENTRY(int argc, char *argv[])
{
VSF_STREAM_INIT(&VSF_DEBUG_STREAM_RX);
VSF_STREAM_INIT(&VSF_DEBUG_STREAM_TX);
#if VSF_USE_TRACE == ENABLED
vsf_start_trace();
vsf_stdio_init();
#endif
vsf_trace_info("start linux..." VSF_TRACE_CFG_LINEEND);
vsf_linux_stdio_stream_t stream = {
.in = (vsf_stream_t *)&VSF_DEBUG_STREAM_RX,
.out = (vsf_stream_t *)&VSF_DEBUG_STREAM_TX,
.err = (vsf_stream_t *)&VSF_DEBUG_STREAM_TX,
};
vsf_linux_init(&stream);
return 0;
}
这里是初始化了调试数据流(一般是调试串口、或者是windows/linux下的命令行终端),并且使用调试数据流来启动linux子系统。
这部分代码不需要修改。
2. linux建议FHS(Filesystem Hierarchy Standard)
int vsf_linux_create_fhs(void)
{
// 0. devfs, busybox, etc
vsf_linux_vfs_init();
busybox_install();
// 1. hardware driver related demo
#ifdef __AIC8800__
extern void aic8800_demo_init(void);
aic8800_demo_init();
#endif
#if VSF_USE_USB_HOST == ENABLED
usrapp_usbh_common_init();
# if VSF_LINUX_USE_LIBUSB == ENABLED
vsf_linux_libusb_startup();
# endif
#endif
// 2. fs
#if APP_USE_SCSI_DEMO == ENABLED
mkdir("/scsi", 0);
#endif
// 3. install executables
extern int usr_main(int argc, char *argv[]);
busybox_bind(VSF_LINUX_CFG_BIN_PATH "/app", usr_main);
}
这里是需要按照代码注释里的0-3来初始化,一般用户只需要在第三部里添加自已的应用。
extern int 用户应用入口(int argc, char *argv[]);
busybox_bind(VSF_LINUX_CFG_BIN_PATH "/用户应用程序名字", 用户应用入口);
busybox_bind可以把用户的main入口,绑定到某个可执行文件上,通过命令行调用的时候,就可以执行。
用户应用代码,直接按照linux的方式开发就行。
【自动运行】
在vsf_usr_cfg.h里,修改VSF_LINUX_GIT_INIT_SCRIPTS配置,这个是用逗号分隔的字符串,启动的时候,会挨个执行
【驱动对接】
1. 串口绑定
这里的串口是指按照VSF的hal标准实现的串口驱动,可以是芯片自带的串口,也可以是USB转串口等设备,实例类型为vsf_usart_t(或者子类)。
int vsf_linux_fs_bind_uart(char *path, vsf_usart_t *uart);
vsf_linux_fs_bind_uart可以绑定串口到某个文件,用法:vsf_linux_fs_bind_uart("/dev/ttyS0", vsf_hw_usart0);
2. 块设备绑定
int vsf_linux_fs_bind_mal(char *path, vk_mal_t *mal);
这里的块设备是VSF中的vk_mal_t(或其子类)类型的设备。
用法:vsf_linux_fs_bind_mal("/dev/sda", &user_mal);
|