vsf.linux应用开发说明

[复制链接]
 楼主| 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
  1. // TODO: SDL require that main need argc and argv
  2. int VSF_APP_ENTRY(int argc, char *argv[])
  3. {
  4.     VSF_STREAM_INIT(&VSF_DEBUG_STREAM_RX);
  5.     VSF_STREAM_INIT(&VSF_DEBUG_STREAM_TX);

  6. #if VSF_USE_TRACE == ENABLED
  7.     vsf_start_trace();
  8.     vsf_stdio_init();
  9. #endif

  10.     vsf_trace_info("start linux..." VSF_TRACE_CFG_LINEEND);
  11.     vsf_linux_stdio_stream_t stream = {
  12.         .in     = (vsf_stream_t *)&VSF_DEBUG_STREAM_RX,
  13.         .out    = (vsf_stream_t *)&VSF_DEBUG_STREAM_TX,
  14.         .err    = (vsf_stream_t *)&VSF_DEBUG_STREAM_TX,
  15.     };
  16.     vsf_linux_init(&stream);
  17.     return 0;
  18. }
这里是初始化了调试数据流(一般是调试串口、或者是windows/linux下的命令行终端),并且使用调试数据流来启动linux子系统。
这部分代码不需要修改。
2. linux建议FHS(Filesystem Hierarchy Standard
  1. int vsf_linux_create_fhs(void)
  2. {
  3.     // 0. devfs, busybox, etc
  4.     vsf_linux_vfs_init();
  5.     busybox_install();

  6.     // 1. hardware driver related demo
  7. #ifdef __AIC8800__
  8.     extern void aic8800_demo_init(void);
  9.     aic8800_demo_init();
  10. #endif
  11. #if VSF_USE_USB_HOST == ENABLED
  12.     usrapp_usbh_common_init();
  13. #   if VSF_LINUX_USE_LIBUSB == ENABLED
  14.     vsf_linux_libusb_startup();
  15. #   endif
  16. #endif

  17.     // 2. fs
  18. #if APP_USE_SCSI_DEMO == ENABLED
  19.     mkdir("/scsi", 0);
  20. #endif

  21.     // 3. install executables
  22.     extern int usr_main(int argc, char *argv[]);
  23.     busybox_bind(VSF_LINUX_CFG_BIN_PATH "/app", usr_main);
  24. }
这里是需要按照代码注释里的0-3来初始化,一般用户只需要在第三部里添加自已的应用。
  1. extern int 用户应用入口(int argc, char *argv[]);
  2. 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(或者子类)。
  1. 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. 块设备绑定
  1. 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

粉丝
快速回复 在线客服 返回列表 返回顶部