Skip to main content
Version: 1.0.0

七、系统使用说明

7.1 获取软件版本

root@taco-mes20:~$ tps-version
FFmpeg: 4.3.2
OpenCV: 4.5.4-dev
TACO version: NA
U-Boot: U-Boot 2020.01 (Aug 20 2025 - 09:09:41 +0000)
Kernel version: Linux taco-mes20 6.6.0 #220 SMP Tue Sep 23 09:28:55 UTC 2025 riscv64 riscv64 riscv64 GNU/Linux
HWversion: tps mes20
MCUversion (marchid): 0x80000000090c0d00

7.2 获取分区信息

要获取系统中的分区信息,可以使用 lsblk 命令。该命令将列出所有可用的块设备及其分区。

root@taco-mes20:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
mmcblk0 179:0 0 29.1G 0 disk
├─mmcblk0p1 179:1 0 1G 0 part
└─mmcblk0p2 179:2 0 28.1G 0 part
mmcblk0boot0 179:8 0 8M 1 disk
mmcblk0boot1 179:16 0 8M 1 disk
mmcblk1 179:24 0 59.5G 0 disk
├─mmcblk1p1 179:25 0 1G 0 part /boot/firmware
└─mmcblk1p2 179:26 0 58.5G 0 part /

分区信息解释:

  • mmcblk0:这是一个磁盘设备,总大小为 29.1 GB。它包含两个分区:
    • mmcblk0p1:这是 mmcblk0 的第一个分区,大小为 1 GB,类型为 part(分区)。
    • mmcblk0p2:这是 mmcblk0 的第二个分区,大小为 28.1 GB,类型为 part(分区)。
  • mmcblk0boot0:这是一个磁盘设备,大小为 8 MB。它包含一个分区:
  • mmcblk0boot1:这是 mmcblk0boot0 的分区,大小为 8 MB,类型为 disk(磁盘)。
  • mmcblk1:这是另一个磁盘设备,总大小为 59.5 GB。它包含两个分区:
    • mmcblk1p1:这是 blk1 的第一个分区,大小为 1 GB,类型为 part(分区),挂载点为 /boot/firmware,这通常用于存放启动固件或引导程序。
    • mmcblk1p2:这是 blk1 的第二个分区,大小为 58.5 GB,类型为 part(分区),挂载点为 /,这是根文件系统所在的分区。

7.3 主要接口使用

7.3.1 接口概述

AIBOX 设备通过凤凰端子提供标准工业接口,支持快速接入和使用,相关接口布局图如下:

接口功能定义表:

接口类别端子标识功能描述
GPIOIN1、IN2、OUT1、OUT2通用输入/输出数字接口
RELAYNO、COM、NC继电器常开/常闭触点接口
CANCL、CHCAN 总线差分信号接口
RS232RX、TXRS232 全双工串行通信接口
RS4851A、1B、2A、2BRS485 半双工串行通信接口

7.3.2 GPIO 使用

AIBOX 设备提供两组独立的 GPIO 输入/输出接口,具体定义如下:

端子名称GPIO编号方向功能描述
IN2GPIO5输入数字信号输入接口
IN1GPIO6输入数字信号输入接口
OUT1GPIO12输出数字信号输出接口
OUT2GPIO98输出数字信号输出接口

以 GPIO12 输出为例:

  1. 导出 GPIO:将 GPIO 节点导出到 /sys/class/gpio/export
echo 12 > /sys/class/gpio/export
  1. 设置 GPIO 方向:设置为输入或输出。
echo out > /sys/class/gpio/gpio12/direction
  1. 读写 GPIO 值
echo 1 > /sys/class/gpio/gpio12/value  # 设置为高电平
cat /sys/class/gpio/gpio12/value # 读取当前值

7.3.3 RS232 和 RS485 使用

AIBOX 通过凤凰端子提供串行通信接口:RS232 全双工与两路 RS485 半双工。用跳线短接板端 RS232_TX 与 RS232_RX,即可形成自发自收通道。

端子定义:

  • RS232_TX:RS232 发送数据线
  • RS232_RX:RS232 接收数据线
  • RS485_1A:第一路 RS485 差分正极
  • RS485_1B:第一路 RS485 差分负极
  • RS485_2A:第二路 RS485 差分正极
  • RS485_2B:第二路 RS485 差分负极

用户可以通过以下命令测试串行通信:

root@taco-mes20:~# echo "Hello World" > /dev/ttyPS0
Hello World

ttyPS0 为相应的 UART 设备文件,有 ttyPS0ttyPS1ttyPS2 等。如果 UART 不可用,可能是因为硬件设计或配置问题。

  • 以下是一个展示如何配置和使用 RS485 接口的示例代码:
int uart_send_test() {
std::string portname = "/dev/ttyPS2";
std::string test_data = "Hello, RS485!";
int baudrate = B115200;

if (uartTestConfig.contains("test rs485 send")) {
const json& config = uartTestConfig["test rs485 send"];
if (config.contains("port")) {
portname = config["port"].get<std::string>();
}
if (config.contains("data")) {
test_data = config["data"].get<std::string>();
}
if (config.contains("baudrate")) {
baudrate = baudrate_to_constant(config["baudrate"].get<int>());
}
}

int fd = open(portname.c_str(), O_RDWR | O_NOCTTY | O_SYNC);
if (fd < 0) {
perror("open RS485 port failed");
return -1;
}

if (set_interface_attribs(fd, baudrate, 0) != 0) {
close(fd);
return -1;
}
set_blocking(fd, 0);

std::string full_data = test_data + "\r\n";
int ret = write(fd, full_data.c_str(), full_data.length());
if (ret < 0) {
perror("RS485 write failed");
close(fd);
return -1;
}
DEBUG_INFO("Sent %d bytes: %s", ret, full_data.c_str());

close(fd);
return 0;
}
  • 以下是一个展示如何配置和使用 RS232 接口的示例代码:
int uart_loopback_test() {
std::string portname = "/dev/ttyPS1";
int baudrate = B115200;
std::string test_data = "hello!\n";

if (uartTestConfig.contains("test uart loopback")) {
const json& config = uartTestConfig["test uart loopback"];
if (config.contains("port")) {
portname = config["port"].get<std::string>();
}
if (config.contains("baudrate")) {
baudrate = baudrate_to_constant(config["baudrate"].get<int>());
}
if (config.contains("data")) {
test_data = config["data"].get<std::string>();
}
} else if (uartTestConfig.contains("RS232 local loopback Test")) {
const json& config = uartTestConfig["RS232 local loopback Test"];
if (config.contains("port")) {
portname = config["port"].get<std::string>();
}
if (config.contains("baudrate")) {
baudrate = baudrate_to_constant(config["baudrate"].get<int>());
}
if (config.contains("data")) {
test_data = config["data"].get<std::string>();
}
}

int fd = open(portname.c_str(), O_RDWR | O_NOCTTY | O_SYNC);
if (fd < 0) {
perror("open");
return -1;
}

if (set_interface_attribs(fd, baudrate, 0) != 0) {
close(fd);
return -1;
}
set_blocking(fd, 0);

int data_len = test_data.length();
int ret = write(fd, test_data.c_str(), data_len);
if (ret < 0) {
perror("write failed");
close(fd);
return -1;
}

usleep((data_len + 25) * 100);

char buf[100];
int n = read(fd, buf, sizeof buf);
if (n > 0) {
buf[n] = '\0';
DEBUG_INFO("Loopback test on %s: received %s\n", portname.c_str(), buf);
} else {
perror("No data received");
close(fd);
return -1;
}

close(fd);
return 0;
}

通过上述代码,用户可以配置 RS232 或 RS485 接口并通过该接口发送数据。具体配置和功能取决于实际的硬件设计和需求。

7.3.4 RELAY 使用

RELAY 是一个用于控制继电器的模块。该功能通过操作指定的GPIO引脚来控制继电器的吸合(ON)与释放(OFF)状态,并检测实际操作是否成功,适用于验证继电器硬件及控制链路的完整性。

端子定义:

  • NO:常开触点
  • COM:公共端
  • NC:常闭触点

具体使用方法请参考 「TacoOS&BSP(AIBOX) 开发技术手册」文档的「RELAY」章节

7.3.5 CAN 总线使用

CAN 总线是一种用于数据传输的异步通信协议,它使用双工的通信方式,允许多个设备之间进行数据传输。

端子定义:

  • CL:低电平信号线
  • CH:高电平信号线

测试代码封装了 CAN 总线测试逻辑,具体实现请参考 「TacoOS&BSP(AIBOX) 开发技术手册」文档的「CAN 总线」章节

7.4 查询硬件温度

使用命令 cat /sys/class/thermal/thermal_zone0/temp 获取 SoC 芯片温度。该命令返回的温度数值单位为毫摄氏度(mC)。

root@taco-mes20:~# cat /sys/class/thermal/thermal_zone0/temp
26816

上述命令返回的数值 26816 表示芯片温度为 26.816°C。

使用命令 cat /sys/class/thermal/thermal_zone1/temp 获取核心板温度。该命令返回的温度数值单位同样为毫摄氏度(mC)。

root@taco-mes20:~# cat /sys/class/thermal/thermal_zone1/temp
30250

7.5 查询内存信息

AIBOX 板载了 14GB DDR,可以分为三类:

  1. OS 管理的部分,即可以用 mallockmalloc 等常规 API 分配出来使用。
root@taco-mes20:~# free -h
total used free shared buff/cache available
Mem: 14Gi 348Mi 14Gi 10Mi 142Mi 14Gi
Swap: 0B 0B 0B
  1. taco-sys 管理的部分,预留给 NPU、VENC、VDEC 使用,需要使用 libtacosys.so 库接口使用,可通过启动介质中 bootfs 分区里 config.txt 配置(下面所示是注释掉的默认值),可以按需修改:
##########           Memory Configuration           ##########
# Uncomment this to set tacosys memory address to 0x140000000,
# and size to 0x80000000 bytes (2GiB)
# tacosys_mem_addr=0x140000000
# tacosys_mem_size=0x80000000

下面是一些使用 libtacosys 接口的实例代码,调用 npu_usage_tcpu_usage_t 结构体来获取使用情况:

    taco_npu_usage_t npu_usage = {0};
if (taco_sys_get_npu_usage(&npu_usage) == TACO_SUCCESS) {
printf("NPU Usage: %d%%\n", npu_usage.npu_usage);
} else {
printf("Failed to get NPU usage\n");
}

taco_cpu_usage_t cpu_usage = {0};
if (taco_sys_get_cpu_usage(&cpu_usage) == TACO_SUCCESS) {
printf("Total CPU Usage: %d%%\n", cpu_usage.total_cpu_usage);
for (int i = 0; i < 8; i++) {
printf("CPU%d Usage: %d%%\n", i, cpu_usage.cpu_usage[i]);
}
} else {
printf("Failed to get CPU usage\n");
}
  1. NPU 管理的部分,专门预留给 NPU(下面所示是注释掉的默认值),可以按需修改:
# Uncomment this to set npu memory address to 0x1c0000000,
# and size to 0x280000000 bytes (10GiB)
# npu_mem_addr=0x1c0000000
# npu_mem_size=0x280000000

这些命令将显示 tacosys 和 NPU 内存的实际分配情况。要验证配置是否生效,可以通过重启设备并再次检查这些文件的内容。