前言
使用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",
}