全志T113 Tina5.0开发实战:定制应用程序与优化启动流程
1. 全志T113 Tina5.0开发环境搭建在开始定制应用程序和优化启动流程之前我们需要先搭建好开发环境。全志T113 Tina5.0系统支持OpenWrt和Buildroot两种构建系统这里我们以OpenWrt为例进行说明。首先需要下载Tina5.0 SDK开发包解压后你会看到一个完整的开发目录结构。我建议在Ubuntu 18.04或20.04系统上进行开发因为这是官方测试最多的环境。实测在Windows下的WSL2也能运行但可能会遇到一些路径问题。安装必要的依赖包sudo apt-get update sudo apt-get install build-essential subversion git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip lib32z1 lib32z1-dev lib32stdc6 libstdc6 -y配置环境变量很重要我习惯在~/.bashrc中添加export PATH$PATH:/opt/toolchain/bin export STAGING_DIR/opt/toolchain/staging_dir编译整个系统前建议先执行make menuconfig在这里选择正确的芯片型号(T113)和开发板配置。新手最容易犯的错误就是选错了芯片型号导致后续编译失败。2. 添加自定义应用程序到Tina系统2.1 应用程序打包方式Tina系统提供了两种方式来打包自定义应用程序第一种是通过busybox-init-base-files机制。这个目录下的文件在编译时会自动覆盖到rootfs中。我们可以把应用程序直接放在/home/sdk/t113_tina5.0/openwrt/target/t113/t113-ws_devboard/busybox-init-base-files这种方式简单直接适合静态文件或简单的脚本。第二种是通过创建OpenWrt软件包的方式这是更规范的做法。我们可以在/home/sdk/t113_tina5.0/openwrt/package目录下创建自己的软件包。我建议参考现有的软件包结构比如btmanager这个示例。2.2 创建自定义软件包让我们以一个简单的helloworld程序为例演示如何创建完整的软件包在package目录下创建helloworld文件夹新建Makefile文件内容如下include $(TOPDIR)/rules.mk PKG_NAME:helloworld PKG_RELEASE:1 PKG_BUILD_DIR : $(BUILD_DIR)/$(PKG_NAME) include $(INCLUDE_DIR)/package.mk define Package/helloworld SECTION:utils CATEGORY:Utilities TITLE:Helloworld -- prints a snarky message endef define Package/helloworld/description Its my first package demo. endef define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ endef define Build/Configure endef define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR) \ CC$(TARGET_CC) \ CFLAGS$(TARGET_CFLAGS) -Wall \ LDFLAGS$(TARGET_LDFLAGS) endef define Package/helloworld/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/usr/bin/ endef $(eval $(call BuildPackage,helloworld))创建src目录并编写helloworld.c程序执行make menuconfig在Utilities类别中找到helloworld并选中执行make package/helloworld/compile进行编译2.3 常见问题解决在实际操作中我遇到过几个典型问题权限问题确保你的开发账户对SDK目录有读写权限路径问题绝对路径和相对路径要区分清楚建议使用$(TOPDIR)这样的变量依赖问题如果程序依赖其他库需要在Makefile中明确声明编译选项交叉编译时要注意目标架构和本机的区别3. 配置应用程序开机自启动3.1 init.d脚本编写Tina系统使用busybox的init机制启动脚本存放在/home/sdk/t113_tina5.0/openwrt/target/t113/t113-dev/busybox-init-base-files/etc/init.d一个典型的启动脚本如下#!/bin/sh /etc/rc.common START95 STOP15 APP_NAMEmyapp APP_PATH/usr/bin/myapp APP_PID_FILE/var/run/myapp.pid start() { echo Starting $APP_NAME start-stop-daemon -S -b -m -p $APP_PID_FILE -x $APP_PATH } stop() { echo Stopping $APP_NAME start-stop-daemon -K -p $APP_PID_FILE } restart() { stop sleep 1 start }几个关键点START95表示启动顺序数字越大启动越晚使用start-stop-daemon管理进程记得给脚本执行权限chmod x /etc/init.d/myapp3.2 启用自启动创建好脚本后需要启用它/etc/init.d/myapp enable这会在/etc/rc.d/下创建对应的软链接。3.3 调试技巧调试启动脚本时我常用的方法在脚本中添加调试输出echo Debug: Starting at $(date) /tmp/debug.log手动测试/etc/init.d/myapp start /etc/init.d/myapp stop查看日志logread | grep myapp检查进程ps | grep myapp4. 修改开机LOGO与启动优化4.1 替换开机LOGOTina系统的开机LOGO文件位置取决于使用的构建系统对于OpenWrt构建/home/sdk/t113_tina5.0/openwrt/target/t113/t113-common/boot-resource/boot-resource/bootlogo.bmp对于Buildroot构建/home/sdk/t113_tina5.0/device/config/chips/t113/boot-resource/boot-resource/bootlogo.bmp替换时要注意图片必须是BMP格式建议使用24位色深分辨率要匹配屏幕文件大小不能超过分区限制4.2 解决LOGO大小问题如果替换后打包报错可能是LOGO太大。需要修改分区配置/home/sdk/t113_tina5.0/device/config/chips/t113/configs/axx/linux-5.4/sys_partition.fex找到boot-resource分区调整size值[partition] name boot-resource size 23404.3 启动流程优化要实现快速启动可以从以下几个方面优化精简内核通过make kernel_menuconfig移除不需要的驱动和功能优化init进程减少不必要的启动脚本并行启动在/etc/inittab中添加::sysinit:/etc/init.d/rcS S boot 延迟加载非关键服务可以延迟启动文件系统优化使用squashfs只读rootfs减少校验时间实测通过这些优化T113的启动时间可以从原来的10秒左右缩短到5秒以内。5. 高级定制技巧5.1 文件系统定制除了添加应用程序我们还可以定制整个文件系统添加自定义用户 在busybox-init-base-files/etc/passwd和/etc/shadow中添加条目修改网络配置 编辑busybox-init-base-files/etc/config/network添加自定义服务 创建/etc/init.d脚本和/etc/config配置文件5.2 内核模块开发如果需要开发内核模块可以在package/kernel目录下创建模块编写Kconfig和Makefile通过make kernel_menuconfig启用模块编译并打包到镜像中5.3 固件打包与烧写完成所有修改后执行make -j$(nproc)生成固件位于out/t113/目录下。烧写工具推荐使用PhoenixSuit注意开发板要进入FEL模式选择正确的固件文件第一次烧写可能需要安装驱动6. 调试与问题排查开发过程中难免会遇到各种问题我总结了一些常见问题的解决方法系统无法启动检查串口输出定位卡在哪个阶段确认内核命令行参数是否正确验证文件系统是否完整应用程序运行异常使用strace跟踪系统调用检查动态库依赖ldd /path/to/app查看系统日志logread性能问题使用top查看系统资源使用情况使用ftrace分析内核性能使用perf进行性能剖析网络问题ifconfig查看接口状态route -n检查路由表ping测试基本连通性在实际项目中我建议建立一个checklist记录每次遇到的问题和解决方法这样可以大大提高开发效率。