0%

接触嵌入式

从桌面开发突然进入 VxWorks 嵌入式开发,有几个认知上的调整:

  1. 桌面开发的时候,驱动、操作系统和 IDE 之后,我们才开始新建项目、编写代码;
  2. 嵌入式开发,从板级支持包、系统镜像就需要新建对应的项目了。
  3. 理解嵌入式系统可裁剪,镜像大概率并不支持那些在桌面操作系统上常见的指令、服务和开发所需的库,需要有针对性的一个一个配置相应的驱动、组件。

Das U-Boot

加载桌面操作系统之前的引导阶段,按下任意键进入 BIOS。与之类似,我们在板子引导程序读秒期间(使用串口调试工具)发送任意键能够进入 uboot,使用 printenv 等命令查看状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看版本
version
# 获取帮助
help
?
# 打印环境变量
printenv
# 查询 FAT 格式设备的目录和文件信息
fatls scsi 0:8
fatls scsi 0:1
# bootcmd 自动启动时执行命令
setenv bootcmd "fatload scsi 0:1 0x90100000 Ft2004.elf; bootvx32 0x90100000;"
saveenv
# 查看日期时间
date
# 查看帮助
help date

# 更多
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)

如何从 tftp 加载系统镜像并启动? U-boot 中的 ipaddr= 似乎没有生效,ping 失败。

1
2
3
4
5
6
7
8
9
10
ft2004#ping 127.0.0.1
Trying ethernet@28210000
ethernet@28210000 Waiting for PHY auto negotiation to complete......... TIMEOUT !
Could not initialize PHY ethernet@28210000
FAIL
Trying ethernet@2820c000
DMA reset timeout
FAIL
ping failed; host 127.0.0.1 is not alive
ft2004#

如何通过串口从主机拷贝文件到硬盘?load[bxyz] 到内存,再从内存到文件系统。 [rs]z 命令是什么?

1
2
# 检查
ping 10.23.50.128

如何从 U 盘启动?

使用 loady 使用串口将 ft2004.elf 内核文件加载到内存(传输很慢,需要耐心),然后 bootvx32 0x90100000 启动。

之前 U 盘没有插好(可能是 USB 接口接触不良),前后晃动一下 U 盘能够看到 /bd0 ,能够从 U 盘拷贝文件了!

ssh 文件传输命令:sz 与 rz 命令

使用 sz/rz 基于串口传输文件

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 形式的注释:

  1. 工程属性的 Build Properties 选项卡中,打开 Build Tools
  2. 找到 C/C++ compiler 和 assembler
  3. 删掉其中的 -ansi
  4. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看网络地址,尝试使用 telnet 和 ftp 
# 一般是 168.67.0.1
ifconfig
# 查看设备
devs
# 列出当前目录。在根目录下不能使用,需要先进入某个磁盘,比如 ata0:1
ls
# 拷贝文件
copy "src" , "dest"
# 加载目标代码
ld < a.out
# 执行目标代码的函数
helloKitty
# 卸载目标代码
unld("a.out")

在 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 命令用 于配置或查询网络接口。