Zephyr_01, environment

前言

使用qemu_cortex_m3模拟的板子

目录结构

SDK和测试工程路径如下

测试工程目录结构如下

复制代码
wwl@wwl-pc:~/testprj/0_mode$ tree .
.
├── CMakeLists.txt
├── hp.sh
├── prj.conf
└── src
    ├── app.c
    └── main.c

main.c内容如下

c 复制代码
#include <zephyr/kernel.h>

int main(void)
{
   return 0;
}

app.c是测试工程,我会在这里做一些测试任务

CMakeLists.txt

复制代码
cmake_minimum_required(VERSION 3.20.0)

set(BOARD qemu_cortex_m3)
set(ENV{ZEPHYR_BASE} "/home/wwl/zephyrproject/zephyr")

find_package(Zephyr REQUIRED HINTS ${ZEPHYR_BASE})

project(hello)

target_sources(app PRIVATE src/main.c)
target_sources(app PRIVATE src/app.c)

prj.conf工程配置文件

复制代码
CONFIG_QEMU_ICOUNT=y
CONFIG_QEMU_ICOUNT_SHIFT=5
CONFIG_QEMU_ICOUNT_SLEEP=y

hp.sh我打包了一些编译相关指令,不爱用west

sh 复制代码
#!/bin/bash

# 配置区(根据你的实际路径修改)
VENV_PATH="$HOME/zephyrproject/.venv"
ZEPHYR_SDK_PATH="${ZEPHYR_SDK_PATH:-$HOME/zephyr-sdk-1.0.1}"  # 添加这行!
QEMU_ARM="$ZEPHYR_SDK_PATH/hosttools/sysroots/x86_64-pokysdk-linux/usr/bin/qemu-system-arm"
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"  # 脚本所在目录

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 激活虚拟环境
activate_venv() {
    if [ -f "$VENV_PATH/bin/activate" ]; then
        source "$VENV_PATH/bin/activate"
        echo -e "${GREEN}✓ 虚拟环境已激活${NC}"
    else
        echo -e "${RED}✗ 虚拟环境未找到: $VENV_PATH${NC}"
        exit 1
    fi
}

# 退出虚拟环境
deactivate_venv() {
    deactivate 2>/dev/null || true
    echo -e "${GREEN}✓ 虚拟环境已退出${NC}"
}

# 构建函数
do_build() {
    echo -e "${YELLOW}>>> 开始构建...${NC}"
    cmake -B build "$PROJECT_DIR"
    if [ $? -ne 0 ]; then
        echo -e "${RED}✗ CMake 配置失败${NC}"
        return 1
    fi
    
    make -C build -j$(nproc)
    if [ $? -ne 0 ]; then
        echo -e "${RED}✗ 编译失败${NC}"
        return 1
    fi
    
    echo -e "${GREEN}✓ 构建成功!固件位于: build/zephyr/zephyr.bin${NC}"
}

do_gdb() {
    echo -e ">>> 启动 QEMU GDB server (端口 1234)...${NC}"
    echo -e ">>> 另开终端运行: arm-none-eabi-gdb build/zephyr/zephyr.elf${NC}"
    echo -e ">>> 然后在 GDB 内执行: target remote :1234${NC}"
    $QEMU_ARM -M lm3s6965evb -cpu cortex-m3 -kernel build/zephyr/zephyr.elf -s -S -serial stdio
}

do_build() {
    echo -e "${YELLOW}>>> 开始构建...${NC}"
    cmake -B build "$PROJECT_DIR"
    if [ $? -ne 0 ]; then
        echo -e "${RED}✗ CMake 配置失败${NC}"
        return 1
    fi
    
    make -C build -j$(nproc)
    if [ $? -ne 0 ]; then
        echo -e "${RED}✗ 编译失败${NC}"
        return 1
    fi
    
    echo -e "${GREEN}✓ 构建成功!${NC}"
}

# 清理函数
do_clean() {
    echo -e "${YELLOW}>>> 清理构建目录...${NC}"
    rm -rf build
    echo -e "${GREEN}✓ 清理完成${NC}"
}

# 主命令处理
case "$1" in
    build)
        activate_venv
        do_build
        deactivate_venv
        ;;
    run)
        activate_venv
        make -C build run
        deactivate_venv
        ;;
    rebuild)
        activate_venv
        do_clean
        do_build
        deactivate_venv
        ;;
    gdb)
        activate_venv
        do_gdb
        deactivate_venv
        ;;
    clean)
        do_clean
        ;;
    *)
        echo "用法: $0 {build|run|rebuild|clean}"
        echo ""
        echo "  build       - 完整构建(cmake + make)"
        echo "  gdb         - 启动 GDB 调试模式"
        echo "  run         - 启动 QEMU 运行"
        echo "  rebuild     - 清理后重新构建"
        echo "  clean       - 删除 build 目录"
        exit 1
        ;;
esac

Vscode配置

.vscode/launch.json 这个文件让我可以使用GDB调试

复制代码
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach GDB to QEMU",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/0_mode/build/zephyr/zephyr.elf",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "/home/wwl/zephyr-sdk-1.0.1/gnu/arm-zephyr-eabi/bin/arm-zephyr-eabi-gdb",
            "miDebuggerServerAddress": "localhost:1234",
            "setupCommands": [
                {
                    "text": "set architecture arm",
                    "ignoreFailures": false
                }
            ]
        }
    ]
}

.vscode/settings.json VScode 配置文件,主要是排除SDK中的venv和west文件

复制代码
{
    "files.watcherExclude": {
        "**/.venv": true,
        "**/.west": true,
    },
    "files.exclude": {
        "**/.venv": true,
        "**/.west": true,
    },
    "search.exclude": {
        "**/.venv": true,
        "**/.west": true,
    },
    "C_Cpp.codeAnalysis.exclude": {
        "**/.venv": true,
        "**/.west": true,
    },
    "C_Cpp.errorSquiggles": "disabled",
}
相关推荐
JieE2127 小时前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
candyTong9 小时前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
_柳青杨13 小时前
深入理解 JavaScript 事件循环
前端·javascript
大家的林语冰19 小时前
ES5 凉凉,Babel 8 正式发布,默认不再编译为 ES5 和 CJS......
前端·javascript·前端工程化
唐青枫20 小时前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马21 小时前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户37215742613521 小时前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
逐光老顽童21 小时前
Java 与 Kotlin 混合开发避坑指南:30 个真实案例实录
android·kotlin
weedsfly21 小时前
异步编程全景与事件循环——彻底搞懂 JS 执行机制
前端·javascript
用户17335980753721 小时前
纯前端 PDF 数字签名实战:Vue 3 + pdf-lib 在浏览器里完成签名嵌入
前端·javascript