打印

vsf.linux应用开发说明

[复制链接]
971|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vsfopen|  楼主 | 2022-7-8 15:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);



使用特权

评论回复

相关帖子

发新帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

325

帖子

8

粉丝