从桌面开发突然进入 VxWorks 嵌入式开发,有几个认知上的调整:
- 桌面开发的时候,驱动、操作系统和 IDE 之后,我们才开始新建项目、编写代码;
- 嵌入式开发,从板级支持包、系统镜像就需要新建对应的项目了。
- 理解嵌入式系统可裁剪,镜像大概率并不支持那些在桌面操作系统上常见的指令、服务和开发所需的库,需要有针对性的一个一个配置相应的驱动、组件。
Das U-Boot
加载桌面操作系统之前的引导阶段,按下任意键进入 BIOS。与之类似,我们在板子引导程序读秒期间(使用串口调试工具)发送任意键能够进入 uboot,使用 printenv
等命令查看状态。
1 | 查看版本 |
如何从 tftp 加载系统镜像并启动? U-boot 中的 ipaddr=
似乎没有生效,ping
失败。
1 | ping 127.0.0.1 |
如何通过串口从主机拷贝文件到硬盘?load[bxyz]
到内存,再从内存到文件系统。 [rs]z
命令是什么?
1 | 检查 |
如何从 U 盘启动?
使用 loady
使用串口将 ft2004.elf
内核文件加载到内存(传输很慢,需要耐心),然后 bootvx32 0x90100000
启动。
之前 U 盘没有插好(可能是 USB 接口接触不良),前后晃动一下 U 盘能够看到 /bd0
,能够从 U 盘拷贝文件了!
VxWorks
关于 VxWorks 和 WorkBench 的环境,网上能够轻松找到的是 Vxworks 6.8 的版本,不过也是十年前的环境了。
envShow( ) - display the environment for a task
VxWorks 环境变量分为全局环境变量和私有环境变量,后者在 task 内部生效,在 task 之间不共享。
现代实时操作系统是基于多任务和任务间通信的概念的操作系统。
多任务环境允许一个实时应用由一组各自独立的任务组成,每个任务拥有自己的执行线程和一组系统资源。
任务间通信工具实现这些任务间的同步和通信,以协调它们之间的活动。在 Vxworks 中任务间通信工具包括信号量、消息队列和事件等。
可以在 VxWorks 中输入 help
/nethelp
显示命令。
可下载工程(Downloadable Kernel Module Project)
注释风格
VxWorks WorkBench 中 C/C++ 编译器参数默认包含 -ansi
,而 C89 中只支持 /* comment */
注释风格。
ANSI C、ISO C、Standard C是指美国国家标准协会(ANSI)和国际标准化组织(ISO)对 C 语言发布的标准。历史上,ANSI C 这个名字专门用于指代此标准的原始版本,也是支持最好的版本(称为 C89 或 C90)
使其支持 // comment
形式的注释:
- 工程属性的 Build Properties 选项卡中,打开 Build Tools
- 找到 C/C++ compiler 和 assembler
- 删掉其中的
-ansi
- ok了
相对路径
Tornado 中配置代码的相对路径,例如设置头文件包含路径。
在工程的”Builds”选项卡中, 点开”default”, 弹出”Properties: build specification ‘default’”对话框,
点开”C/C++ compiler”, 再点开右下的”Include paths…”, 弹出设备包含路径的对话框
路径中可以使用一些全局路径,如:$(PRJ_DIR)
、 $(WIND_BASE)
比如表示 bsp 包 pcPentium_LW 的路径:$(WIND_BASE)/target/config/pcPentium_LW
比如表示 vx 工程所在的文件夹的上 2 层路径:$(PRJ_DIR)/../..
同样的这些 $
打头的全局路径,也可以用做一些第三方库文件的相对路径中,比如在设置 EXTRA_MODULES
时,也可使用。
DeltaOS
做国产平替会使用到 DeltaOS 道系统,开发环境是 LambdaPro 。需要付费。
从同事手中转过来 xp 的虚拟机包含试用版的 LambdaPro ,试用期在 22年10月中旬左右。开发环境没有虚拟的仿真机,将编译结果放到飞腾的板子运行,通过补充单行日志来调试。
碰到的第一个问题,不知道如何连接、使用这块板子。网口在没启动系统、未进行配置的时候是无法使用的,多个网口也不知道连接哪一个是可用的(二维魔方的右下角)。串口之前没接触过。
2024年4月24日,备忘:右下角的网口似乎损坏了,无法生效。改用左下角的网口 ngb0 ,插上网线后 D53 灯会亮。
2024年5月22日,备忘:哪个网口可以用,每次都不一样。通过串口输出查看分配的 ip ,通过插拔网线和修改对端主机的 ip 查找可用网口。
串口驱动
在设备管理器中,查看串口失败,报串口驱动问题,“PL2303HXA自2012已停产,请联系供货商”,USB 不识别。解决”PL2303HXA自2012已停产,请联系供货商” USB不识别的问题-CSDN博客
可以使用 xshell 作为串口调试工具:串口波特率 11520 ;数据位 8 ;
加载系统
碰到的第二个问题是,系统引导配置的环境变量有问题,无法加载系统。
注意:加载 VxWorks 或者 DeltaOS 系统镜像成功后,在串口调试工具中会输出显著的 VXWOERKS 的符号图形。
缺少组件
进入 DeltaOS 系统后,常用的命令行操作(或函数):
1 | 查看网络地址,尝试使用 telnet 和 ftp |
在 DeltaOS 或 VxWorks 中,无论是使用上述 ifconfig
命令,还是连接 telnet 服务或 ftp 服务,都需要在制作系统镜像时保证添加了对应的组件,否则是无法使用的。
碰到的第三个问题,终于和项目有关了。运行 DKM 项目编译出的 out 文件时,报错找不到符号链接(符号未定义)。因为不熟悉嵌入式可裁剪特性,不熟悉组件,匆匆接手也不熟悉编译的项目结构,我无法判断缺失的接口定义是镜像缺失(一般通过新增组件解决)还是项目丢失了源代码,或者删除代码后未及时清理无效的调用。
网上找不到关于道系统和 LambdaPro 的相关资料,通过 LambdaPro 帮助菜单了解开发环境等工具的使用方式。但帮助手册的质量一般,存在更新不及时等问题。
LambdaPro
对称多处理器(Symmetric Multi-Processor, SMP)系统。
制作系统镜像时,一般都是多核的(smp)。编译 dkm 项目时,相应的也应该使用 smp 的配置来生成。
@todo 怎么切换项目的调试模式?
配置 IP
VxWorks 配置网络的接口 ifLib - network interface library,似乎在这块板子上无法生效,代码中相关的函数调用全部注释了。
这块板子加载了 NGBE 的驱动,似乎是网讯的网卡驱动。目前已知的能够生效的配置网路的接口是 ifconfig ,但在 Vxworks 体系内似乎不是常规操作,更像是板子自定义的函数。
VxWorks 6.9 下组件
INCLUDE_IFCONFIG
提供了命令ifconfig()
,包含组件INCLUDE_IPIFCONFIG_CMD
后,也可以在 cmd 里使用ifconfig
命令用 于配置或查询网络接口。