七、系统使用说明
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 设备通过凤凰端子提供标准工业接口,支持快速接入和使用,相关接口布局图如下:
接口功能定义表:
| 接口类别 | 端子标识 | 功能描述 |
|---|---|---|
| GPIO | IN1、IN2、OUT1、OUT2 | 通用输入/输出数字接口 |
| RELAY | NO、COM、NC | 继电器常开/常闭触点接口 |
| CAN | CL、CH | CAN 总线差分信号接口 |
| RS232 | RX、TX | RS232 全双工串行通信接口 |
| RS485 | 1A、1B、2A、2B | RS485 半双工串行通信接口 |
7.3.2 GPIO 使用
AIBOX 设备提供两组独立的 GPIO 输入/输出接口,具体定义如下:
| 端子名称 | GPIO编号 | 方向 | 功能描述 |
|---|---|---|---|
| IN2 | GPIO5 | 输入 | 数字信号输入接口 |
| IN1 | GPIO6 | 输入 | 数字信号输入接口 |
| OUT1 | GPIO12 | 输出 | 数字信号输出接口 |
| OUT2 | GPIO98 | 输出 | 数字信号输出接口 |
以 GPIO12 输出为例:
- 导出 GPIO:将 GPIO 节点导出到
/sys/class/gpio/export。
echo 12 > /sys/class/gpio/export
- 设置 GPIO 方向:设置为输入或输出。
echo out > /sys/class/gpio/gpio12/direction
- 读写 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 设备文件,有 ttyPS0、ttyPS1、ttyPS2 等。如果 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,可以分为三类:
- OS 管理的部分,即可以用
malloc、kmalloc等常规 API 分配出来使用。
root@taco-mes20:~# free -h
total used free shared buff/cache available
Mem: 14Gi 348Mi 14Gi 10Mi 142Mi 14Gi
Swap: 0B 0B 0B
- 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_t 和 cpu_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");
}
- 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 内存的实际分配情况。要验证配置是否生效,可以通过重启设备并再次检查这些文件的内容。