RISC-VLinux嵌入式调试记录
传输文件
在使用spc时出现问题:

解决方法:使用 -O 参数使scp的传输模式为传统传输
密码:cvitek
chmod 777 xxx文件
ssh连接报错
解决方法
C:\Users\wula.ssh\know_hosts中删除对应行,相当于连接变成重新连接。
电脑IP:192.168.150.3
子网掩码:255.255.255.0
配置Wi-Fi
insmod /mnt/system/ko/3rd/8821cs.ko
insmod /mnt/system/ko/3rd/8723ds.ko
cd /mnt/data
echo "ctrl_interface=/var/run/wpa_supplicant" > /tmp/wpa_supplicant.conf
./wpa_supplicant -iwlan0 -Dnl80211 -c/tmp/wpa_supplicant.conf &
./wpa_cli -i wlan0
scan
scan_results
add_network
set_network 0 ssid "Wireless CUC"
set_network 1 ssid "XiaoChenMi50"
#二选一
set_network 0 key_mgmt NONE
set_network 1 psk ""
#连接网络
select_network 0
quit
#动态IP分配
udhcpc -b -i wlan0 -R
ping www.baidu.com
校园网
认证地址ip:172.16.229.30
dns地址:172.16.228.9
修改/etc/resolv.conf不行,只读
echo "nameserver 172.16.228.9" > /tmp/resolv.conf.tmp
mount --bind /tmp/resolv.conf.tmp /etc/resolv.conf
设置时间:
date -s "2026-04-17 21:45:00"
使用auth登录连接
./auth-cuc auth -u 202219263013 -p qwe123456QWE --insecure
python环境配置
配置交叉工具链
在文件夹cvi_mmf_sdk中
source build/cvisetup.sh
defconfig cv1812h_wevb_0007a_emmc_huashan
创建工作目录
mkdir -p ~/riscv-sysroot/usr
export SYSROOT=~/riscv-sysroot/usr
交叉编译zlib
cd ~
wget https://zlib.net/zlib-1.3.1.tar.gz
tar -xzf zlib-1.3.1.tar.gz
cd zlib-1.3.1
# 配置为静态库,指定交叉编译器前缀
CHOST=riscv64-unknown-linux-musl ./configure --prefix=$SYSROOT --static
make -j$(nproc)
make install
交叉编译Openssl
cd ~
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar -xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
# 注意:必须指定目标系统为 linux-generic64,并启用 no-shared 生成静态库
./Configure linux-generic64 no-shared no-tests --prefix=$SYSROOT \
--cross-compile-prefix=riscv64-unknown-linux-musl-
make -j$(nproc)
make install
make -j$(nproc)
确认 _ssl 模块不再出现在 "not found" 列表中
make install DESTDIR=$(pwd)/install-root
交叉编译python
cd /home/chenm47/Desktop/Python_build/Python-3.8.20
rm -rf build-riscv
mkdir build-riscv && cd build-riscv
export SYSROOT=$HOME/riscv-sysroot/usr
../configure \
--host=riscv64-unknown-linux-musl \
--build=x86_64-pc-linux-gnu \
--prefix=/mnt/data/python3.8 \
--disable-shared \
--disable-ipv6 \
--with-ensurepip=install \
--enable-optimizations \
ac_cv_file__dev_ptmx=no \
ac_cv_file__dev_ptc=no \
ac_cv_func_dlopen=yes \
ac_cv_lib_dl_dlopen=yes \
ac_cv_header_dlfcn_h=yes \
ac_cv_func_dlsym=yes \
CPPFLAGS="-I$SYSROOT/include" \
LDFLAGS="-L$SYSROOT/lib -Wl,--dynamic-linker=/lib/ld-musl-riscv64v_xthead.so.1 -static-libgcc" \
LIBS="-Wl,-Bstatic -lssl -lcrypto -lz -Wl,-Bdynamic -ldl"
Make
make -j$(nproc) EXTRA_LDFLAGS="-static"
make install DESTDIR=$(pwd)/install-root
验证静态连接
file install-root/mnt/data/python3.8/bin/python3.8
预期输出应包含 statically linked,且没有 interpreter 字样
复制
# 进入安装根目录
cd /home/yourname/Python-3.8.13/build-riscv/install-root
# 将 usr/bin 下的所有文件移入 mnt/data/python3.8/bin
cp -a usr/bin/* mnt/data/python3.8/bin/
# 将 usr/lib 下的所有文件移入 mnt/data/python3.8/lib
cp -a usr/lib/* mnt/data/python3.8/lib/
# 合并完成后,可以选择删除 usr 目录以节省空间(可选)
rm -rf usr
打包
tar -czvf python3.8-riscv-static-pip.tar.gz python3.8
传输
scp -O .\python3.8-riscv-static-pip.tar.gz root@192.168.150.2:/mnt/data
RISC-V板子验证
#在开发板上创建一个符号链接,让 python 指向 python3.8
ln -s /mnt/data/python3.8/bin/python3.8 /mnt/data/python3.8/bin/python
/mnt/data/python3.8/bin/python3.8 --version
/mnt/data/python3.8/bin/pip3 --version
Linux 常用命令
rm -r 文件夹名称,递归删除文件夹
tar -czvf 创建的归档文件名称 要归档的文件
tar -xzvf 要解压的归档文件名
gzip 文件名 Gzip压缩
gzip -d example.txt.gz Gzip解压
临时环境变量
export PATH=/mnt/data/python3.8/bin:$PATH
mqtt等环境配置
下载源码
git clone https://github.com/eclipse/paho.mqtt.c.git
创建Cmake文件
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_PROCESSOR riscv64)SET(CMAKE_C_COMPILER riscv64-unknown-linux-musl-gcc)
SET(CMAKE_CXX_COMPILER riscv64-unknown-linux-musl-g++)SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
编译:
mkdir build_riscv
cd build_riscv
cmake -DCMAKE_TOOLCHAIN_FILE=../riscv64-musl.cmake \
-DPAHO_WITH_SSL=OFF \
-DPAHO_BUILD_STATIC=ON \
-DPAHO_BUILD_SHARED=OFF \
..
make
编写测试程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include "MQTTClient.h" // Paho 头文件
#define BROKER "tcp://59.110.150.106:1883"
#define CLIENTID "riscv_test_client"
#define QOS 1
#define TIMEOUT 10000L
// 模拟发送 JS 里的 JSON 结构(这里只做示意,实际可根据需要调整)
void publish_test_data(MQTTClient client) {
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
char payload[256];
time_t now = time(NULL);
char time_str[16];
strftime(time_str, sizeof(time_str), "%H:%M:%S", localtime(&now));
// 温度数据(三节点)
sprintf(payload,
"{\"xAxis\":{\"data\":[\"%s\"]},\"series\":["
"{\"data\":[%d]},{\"data\":[%d]},{\"data\":[%d]}]}",
time_str, (rand()%10) + 25, (rand()%10) + 23, (rand()%10) + 27);
pubmsg.payload = payload;
pubmsg.payloadlen = strlen(payload);
pubmsg.qos = QOS;
MQTTClient_publishMessage(client, "temp", &pubmsg, &token);
printf("Published temp: %s\n", payload);
// 湿度数据
sprintf(payload,
"{\"xAxis\":{\"data\":[\"%s\"]},\"series\":["
"{\"data\":[%d]},{\"data\":[%d]},{\"data\":[%d]}]}",
time_str, (rand()%30)+40, (rand()%30)+40, (rand()%30)+40);
pubmsg.payload = payload;
pubmsg.payloadlen = strlen(payload);
MQTTClient_publishMessage(client, "humi", &pubmsg, &token);
// 烟雾数据
sprintf(payload,
"{\"xAxis\":{\"data\":[\"%s\"]},\"series\":["
"{\"data\":[%d]},{\"data\":[%d]},{\"data\":[%d]}]}",
time_str, rand()%2000, rand()%2000, rand()%2000);
MQTTClient_publishMessage(client, "smoke", &pubmsg, &token);
// 水位数据
sprintf(payload,
"{\"xAxis\":{\"data\":[\"%s\"]},\"series\":["
"{\"data\":[%d]},{\"data\":[%d]},{\"data\":[%d]}]}",
time_str, rand()%2, rand()%2, rand()%2);
MQTTClient_publishMessage(client, "water", &pubmsg, &token);
// 在线情况(饼图)
int online = rand()%4;
int offline = 3 - online;
sprintf(payload,
"{\"series\":[{\"data\":[{\"value\":%d,\"name\":\"在线\"},"
"{\"value\":%d,\"name\":\"离线\"}]}]}",
online, offline);
MQTTClient_publishMessage(client, "online", &pubmsg, &token);
// 预警信息
sprintf(payload,
"{\"1\":{\"fire\":false,\"water\":false,\"ice\":false},"
"\"2\":{\"fire\":false,\"water\":false,\"ice\":false},"
"\"3\":{\"fire\":false,\"water\":false,\"ice\":false}}");
MQTTClient_publishMessage(client, "alert", &pubmsg, &token);
MQTTClient_waitForCompletion(client, token, TIMEOUT);
}
int main() {
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
int rc;
MQTTClient_create(&client, BROKER, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
printf("Failed to connect, return code %d\n", rc);
exit(-1);
}
printf("Connected to MQTT broker\n");
srand(time(NULL));
// 发送10组测试数据,间隔2秒
for (int i = 0; i < 10; i++) {
publish_test_data(client);
sleep(2);
}
MQTTClient_disconnect(client, 10000);
MQTTClient_destroy(&client);
printf("Test finished\n");
return 0;
}
编译C语言程序:
riscv64-unknown-linux-musl-gcc -o mqtt_test mqtt_test.c \
-I./src \
-L./build_riscv/src \
-lpaho-mqtt3c -lpthread -static
随后将文件传输至板子运行即可。
三轴传感器
IP地址:192.168.1.169
子网掩码:255.255.255.0
默认网关:192.168.1.1
Lora模块
配置交叉编译环境
在文件夹cvi_mmf_sdk中
source build/cvisetup.sh
defconfig cv1812h_wevb_0007a_emmc_huashan
编译c文件
riscv64-unknown-linux-musl-gcc ./serial_test.c -o serial_test -march=rv64imafdcvxthead -mcmodel=medany -mabi=lp64d
环境变量
export PATH=/mnt/data/usr/bin:$PATH
串口1复用
./cvi_pinmux -w JTAG_CPU_TCK/UART1_RX
./cvi_pinmux -w JTAG_CPU_TMS/UART1_TX
/mnt/data/usr/bin# ./cvi_pinmux -w IIC0_SCL/UART1_TX
/mnt/data/usr/bin# ./cvi_pinmux -w IIC0_SDA/UART1_RX
提示词
【嵌入式环境信息】
- 设备厂商/芯片: Cvitek (如 CV1800B / CV181xH)
- CPU架构: RISC-V 64-bit (平头哥 Xuantie C906)
- 内核版本: Linux 5.10.4-tag
- C库: musl libc
- 系统构建: Buildroot + BusyBox (无包管理器)
- init系统: BusyBox init (/sbin/init -> ../bin/busybox)
- 存储空间:
- 根文件系统 (/dev/root): 13.6M (已用100%,无剩余空间)
- 主要可写分区 (/mnt/data 和 /tmp): 实际指向 /dev/mmcblk0p7,大小 2.9G,可用 2.7G
- 注意: /tmp 也挂载了 tmpfs (2.9G,但实际是内存文件系统,重启丢失)
- 内存大小:
- 总内存: 68 MB (MemTotal: 68232 kB)
- 可用内存: 约 44 MB (MemAvailable: 44136 kB)
- 预装软件: busybox, 基础工具 (ls, cat, sh等), 无Python
- 网络: 可用 (eth0 等)
- 交叉工具链: riscv64-unknown-linux-musl-gcc (Xuantie 900)
- 关键限制:
- 根分区已满,不能向 / 写入任何文件
- 无包管理器,无法动态链接非musl库
- 内存较小 (68MB),运行稍大的程序可能受限
- 可用存储位置: /mnt/data (约2.7GB 可用,持久化存储) 和 /tmp (重启丢失)
编译
编译diagnosis_publisher
riscv64-unknown-linux-musl-gcc -static -O2\
-I /home/chenm47/Desktop/mqttBuilder/paho.mqtt.c/src \
-L /home/chenm47/Desktop/mqttBuilder/paho.mqtt.c/build_riscv/src \
-o diagnosis_publisher diagnosis_publisher.c bearing_diagnosis.c \
-lpaho-mqtt3c -lpthread -lm
编译sensor_collector
riscv64-unknown-linux-musl-gcc -static -O2 -o sensor_collector sensor_collector.c
设置网口IP
传输文件到板子
ifconfig eth0 192.168.150.2 netmask 255.255.255.0
传感器配置:
ifconfig eth0 192.168.1.169 netmask 255.255.255.0
传感器地址:192.168.1.164
最终运行
./sensor_collector | ./diagnosis_publisher