文章

RISC-VLinux嵌入式调试记录

传输文件

在使用spc时出现问题:

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

许可协议:  CC BY 4.0