10.单片机 开发流程和c语言开发环境配置
是一个包含多个目录路径的列表,用冒号(Linux/macOS)或分号(Windows)分隔。它不包含函数的具体实现,只包含函数声明、宏定义、结构体定义等。是已经编译好的二进制代码,包含函数的具体实现。执行main.c时,只会在src目录下 找与main.c平级的文件。:告诉链接器(Linker)去哪里找库文件。如果你设置了环境变量,就相当于每次编译时,编译器自动帮你加上了某些。,链接器需要将编译好
1.BSP 是应用层的“硬件抽象地基”
- 应用层需要调用如
bsp_swdt_init()、bsp_uart_send()、bsp_led_on()等接口。 - 如果这些接口还没实现,应用逻辑无法编译或运行。
- 例如:你的主程序想“每5秒喂一次狗”,但
bsp_swdt_refresh()还没写,就无法测试。
2. 避免应用层直接依赖芯片细节
- 如果没有 BSP,应用层可能直接调用
SWDT_FeedDog()、操作寄存器等,导致:- 代码难以移植
- 硬件变更时大面积修改
- 先定义好 BSP 接口,应用层就能基于“契约”开发。
3. 便于模块化测试
- BSP 可以单独验证(如:用示波器测看门狗是否真在 6.5s 超时)
- 应用层开发时假设 BSP 已经“工作正常”
🔄 但实际开发中往往是 “接口先行 + 并行开发”
| 阶段 | BSP 团队 | 应用团队 |
|---|---|---|
| 1. 接口定义 | 编写 bsp_wdt.h,明确函数名、参数、返回值 | 同步查看 .h 文件,开始写调用代码 |
| 2. 实现与联调 | 实现 bsp_wdt.c | 使用 桩函数(stub) 或 模拟 BSP 临时跑通逻辑 |
| 3. 集成测试 | 提供完整 BSP | 替换桩函数,真实运行 |
二、头文件 库文件
头文件(通常是 .h 或 .hpp 文件)是 C/C++ 代码的“接口说明书”。它不包含函数的具体实现,只包含函数声明、宏定义、结构体定义等。编译器需要读取头文件来检查代码的语法是否正确。
-I 的作用:编译器默认只会去系统固定的目录(如 /usr/include)找头文件。如果头文件在其他位置,必须用 -I 告诉编译器额外的搜索路径
3. 编译的最后一步是链接,链接器需要将编译好的代码与实际的函数实现(即库文件)合并。库文件通常是 .a(静态库)或 .so(动态库,在 Windows 下是 .lib 和 .dll)
库文件是已经编译好的二进制代码,包含函数的具体实现。程序运行时需要链接这些库才能正常工作。库分为两种:
-
静态库(
.a或.lib):编译时直接复制到可执行文件中。 -
动态库(
.so或.dll):编译时只记录依赖,运行时再加载。 -
-L的作用:告诉链接器(Linker)去哪里找库文件。链接器默认只去系统固定目录(如/usr/lib)找库。 -
-l的作用:指定要链接的具体库文件名(去掉前缀lib和后缀)
PATH 环境变量:是一个包含多个目录路径的列表,用冒号(Linux/macOS)或分号(Windows)分隔。当你在终端输入一个命令(如 gcc)时,系统会按顺序在 PATH 列表中的目录里查找对应的可执行文件。
首先,我们先明确: 头文件搜索目录
| 步骤 | 双引号 #include "..." |
尖括号 #include <...> |
|---|---|---|
| 第一步 | 当前源文件目录 | -I 指定的目录 |
| 第二步 | -I 指定的目录 | 环境变量路径 |
| 第三步 | 环境变量路径 CPATH | 系统默认目录 |
| 第四步 | 系统默认目录 | (结束) |
一. 假设project结构如下:
project/
├── inc/
│ └── utils.h <-- 头文件在这里
└── src/
└── main.c <-- 源文件在这里
1. 对于 #include "utils.h" 而言
1 查找的逻辑是平级的,而不是递归的。
执行main.c时,只会在src目录下 找与main.c平级的文件
2.不会自动递归搜索子目录。 编译器非常“死板”,它只认路径。
就算src里还有一个子目录src,编译器也不会到子目录去寻找文件
3. 如果你在 main.c 中写 #include "inc/utils.h"
- 找不到
inc文件夹(因为inc在上级目录)。 - 报错!
应该写成 #include "../inc/utils.h"
..代表上级目录。- 意思是:“去上一级目录,然后进
inc文件夹里找utils.h”。
还可以,使用-I
假设你在 src 目录,可以执行:
gcc -I../inc main.c -o main
-I 参数是相对于命令行执行位置的:
- 在根目录:
-Iinc指向project/inc。 - 在 src 目录:必须写
-I../inc才能指向project/inc
2.环境变量路径
你可以把环境变量理解为一种“全局的、默认的 -I 参数”。如果你设置了环境变量,就相当于每次编译时,编译器自动帮你加上了某些 -I 路径。
补充:指定头文件(-I)、库文件(-L)或可执行文件(PATH)
更多推荐

所有评论(0)