ElfBoard 是飞凌面向嵌入式教学的开发板(ELF1/ELF-RK3506/ELF2 等),跑 Linux,入门最常用 C 语言做应用开发;数据类型决定变量占内存大小、能存什么值,条件判断用来做 GPIO、ADC、传感器的分支逻辑,是板上 LED、按键、温感采集实验的基础,新手容易踩无符号数比较、溢出、类型隐式转换的坑。
一、ElfBoard C 语言常用数据类型
嵌入式开发要重点关心占用字节、取值范围、有无符号,直接影响采集、控制、串口上传。
| 类型 | 占用字节 | 说明 | ElfBoard 典型用途 |
|---|---|---|---|
| char | 1 | 字符 / 8 位整数,signed -128~127;unsigned 0~255 | 串口单字节收发、IO 状态、简单标志位 |
| short | 2 | 16 位整型 | 小范围传感器数值 |
| int | 4 | 32 位整型(A7 架构),最常用 | 计数、按键次数、ADC 原始值 |
| long | 4/8 | 取决于系统,Linux 下 32 位是 4,64 位 8 | 长计时、大数值 |
| long long | 8 | 64 位整型 | 高精度计时、大流量统计 |
| float | 4 | 单精度浮点 | 温湿度、电压换算(ADC 转电压) |
| double | 8 | 双精度浮点 | 高精度算法,NPU 推理计算 |
| uint8_t / uint16_t / uint32_t | 固定 1/2/4 | stdint.h 标准固定宽度类型,推荐嵌入式优先用 | 寄存器、协议、ADC、CAN、串口数据包(跨平台不踩坑) |
重点提示:ElfBoard Linux 应用开发,优先 stdint.h 固定宽度类型,不要依赖 int、short 的不确定长度,后期移植驱动、通信协议不会乱。
二、条件判断语法(C 语言)
核心:if / if-else / if-else if / switch,搭配比较运算符、逻辑运算符。
- 基础 if
if(条件)
{
// 条件成立执行
}
- if-else
if(adc_val > 1800)
{
// 电压高,点亮LED
}
else
{
// 熄灭LED
}
- 多分支 if-else if
if(temp < 25)
{
}
else if(temp < 30)
{
}
else
{
}
- switch(适合固定离散值,按键、模式选择)
switch(key_val)
{
case 1: break;
case 2: break;
default: break;
}
运算符:
- 比较:> < >= <= == !=
- 逻辑:&&与 ||或 !非
⚠️ 高频坑:== 不要写成 =;无符号数不能判断小于 0;浮点不要直接 == 判断相等。
三、ElfBoard 板上实战示例(ADC 采集 + 条件判断控制 LED)
include
include
int main(void)
{
uint32_t adc_raw; // 固定宽度无符号,ADC原始值
float vol;
adc_raw = get_adc(); // 读取板载ADC,ElfBoard配套封装函数
vol = adc_raw 3.3f / 4095.0f;
if(vol > 2.5f)
{
led_set(1); // 高电平点亮
}
else if(vol < 1.0f)
{
led_set(0);
}
else
{
printf("电压中等\r\n");
}
return 0;
}
这个逻辑就是 ElfBoard 经典实验:电位器调节 ADC,根据电压区间分支控制 LED。
四、嵌入式专属易错点(ElfBoard 实验高频)
- 隐式类型转换:uint32 和 int 比较,int 自动转无符号,负数会变成超大正数,判断失效。
- 浮点精度:ADC 换算出来的 float,不能写 if(vol == 2.5),要用区间 if(fabs(vol-2.5) < 0.01)。
- 寄存器类型:操作外设寄存器,必须用uint8_t/uint32_t,不能用有符号 int,防止符号扩展出错。
- 条件判断里的延时阻塞:if 里面直接 sleep,会卡住整个程序;工业 / 物联网项目建议状态机替代长延时。
五、学习顺序建议
- 先分清 char、int、uint32_t、float,在 ElfBoard 串口打印 sizeof 看实际字节
- 写简单 if 判断,读取按键 GPIO 电平分支
- ADC 采集 + 浮点换算 + 区间判断,做电位器控制 LED
- switch 做多按键模式切换
- 进阶:状态机,替代大量 if-else 嵌套(适合传感器多任务)
【相关 FAQ】
问题 1:ElfBoard 做 C 语言编程,数据类型为什么优先用 stdint.h 的 uint32_t 而不是 int?
回答 1:ElfBoard 是 Linux ARM 平台,int 长度固定但跨平台不确定;uint32_t 是标准固定宽度,操作 ADC、寄存器、串口数据包、CAN 协议时,不会因为平台变化导致字节长度错乱,嵌入式开发更安全。
问题 2:ElfBoard 条件判断写 ADC 电压,为什么不能直接用 == 判断浮点数?
回答 2:float 存在精度误差,ADC 换算后的电压是近似值,直接 == 大概率永远不触发;正确做法是用差值小于一个很小阈值做区间判断。
问题 3:ElfBoard 无符号 uint 变量做条件判断,能不能判断小于 0?
回答 3:不能,uint 系列最小值就是 0,if(x < 0)永远为假,是新手在 ADC、IO 实验里最常见 bug。
问题 4:ElfBoard 条件判断 if 和 switch 怎么选?
回答 4:连续范围判断(电压、温度)用 if-else if;固定离散值(按键编号、模式码)用 switch,代码可读性更好。
【参考资料】
[2026-10-01] ElfBoard 官网 ELF1 C 语言基础教程
[2026-09-12] ElfBoard ELF-RK3506 Linux 应用编程手册
[2026-08-20] 飞凌 ElfBoard ADC、GPIO 实验例程文档
[2026-07-05] stdint.h 嵌入式固定宽度类型规范
【免责声明】
本文是 ElfBoard Linux 应用 C 语言入门教程,驱动内核编程、Python 开发语法会有差异;实际编译、GPIO/ADC 函数以你手上 ELF1/ELF-RK3506 配套 SDK 和例程为准。
如果你想要,我可以给你一份可直接在 ElfBoard 上编译运行的【按键 + ADC + 条件判断完整工程代码】。
