初始环境配置
在我的Thinkpad SL410K老本子上装了Linux mint xfce后,把开发环境简单搭建下:
1. 配置中文输入法,software manager里面搜googlepinyin,够用。
2. 安装git, 做好版本管理。
3. 安装zsh,提高命令行工作效率。Powerlevel10k, 插件:git,zsh-autosuggestions,zsh-syntax-highlighting,history。
4. 安装vscode,添加通义灵码插件, 安装C/C++插件。
5. 安装交叉编译工具链。
由于toolchains是32位的,系统是64位的,需要进行以下操作,让系统能够运行32位toolchains
# 确保多架构已启用
sudo dpkg --add-architecture i386
sudo apt-get update
# 安装核心32位库(会自动匹配系统兼容的版本)
sudo apt-get install libc6-i386 lib32z1 lib32stdc++6
从 “基础到上层” 的开发顺序排序
建了个项目文件夹, 并在下面把每一个知识点都建一个文件夹,准备一个个梳理一遍。
嵌入式开发的逻辑是 “先懂硬件接口→再做底层驱动→然后搭系统框架→最后开发应用”,排序如下:
0. 调试与工具(贯穿全流程的 “辅助手段”)
- JTAG/SWD 调试:硬件断点、单步执行,定位底层代码问题。
- 交叉编译工具链:如 arm-none-eabi-gcc(裸机 / RTOS)、arm-linux-gnueabihf-gcc(Linux)。
- Makefile/CMake:管理多文件编译,定义依赖关系。
1. 硬件基础层(最底层,决定 “怎么和硬件对话”)
- GPIO(通用输入输出):所有外设的基础(如 LED、按键、传感器引脚),先掌握高低电平、方向配置。
- 时钟系统(Clock):学习 CPU 主频、外设时钟源(如 PLL、HSE/LSE),理解 “时钟决定设备运行速度”。
- 中断系统(IRQ):掌握外部中断、定时器中断的配置,理解 “异步事件如何被 CPU 响应”。
- MCU/CPU 架构:了解指令集(如 ARM Thumb-2)、寄存器(如 R0-R15)、存储映射(RAM/Flash 地址范围)。
2. 底层功能外设(基于硬件基础,实现 “具体功能”)
- UART(通用异步收发传输器):RS232/485 的底层依赖,先学串口通信(波特率、奇偶校验)。
- DMA(直接内存访问):理解 “不占用 CPU,直接在外设和内存间传数据”(如 UART/SPI 数据通过 DMA 传输)。
- PWM(脉冲宽度调制):用于电机调速、LED 调光,学习占空比、频率配置。
3. 芯片间通信接口(实现 “设备与设备对话”)
- IIC(I²C,集成电路总线):用于连接传感器(如温湿度传感器 SHT30),掌握主从通信、地址仲裁。
- SPI(串行外设接口):用于高速通信(如 LCD 屏、Flash),学习 CS 片选、全双工传输。
4. 系统启动层(让硬件 “跑起来”)
- bootloader:学习启动流程(初始化硬件→加载内核→跳转到内核),如 U-Boot 的配置与编译。
5. 操作系统层(管理 “硬件资源与任务”)
- kernel(内核):先学 RTOS(如 FreeRTOS)的任务调度、信号量,再扩展到 Linux 内核(进程管理、驱动框架)。
- filesystem(文件系统):基于内核,学习 FAT32、ext4、JFFS2 等,理解 “数据如何在 Flash 中存储”。
6. 总线与工业协议(实现 “多设备组网”)
- CAN(控制器局域网):汽车 / 工业常用总线,学习帧格式(数据帧、远程帧)、仲裁机制。
- LIN(本地互联网络):汽车低成本总线,基于 UART,学习主从通信、帧同步。
- RS232/RS485:工业串口通信,RS485 支持多节点,学习差分信号、总线阻抗匹配。
- Modbus:工业通用协议(基于 RS485/CAN),学习 RTU/ASCII 模式、功能码(如 03 读保持寄存器)。
7. 通用接口与无线通信(扩展 “设备连接范围”)
- USB:通用接口(如 USB HID、CDC),学习枚举过程、数据传输(批量 / 中断传输)。
- WiFi:无线局域网,学习 STA/AP 模式、TCP/UDP 通信(如通过 ESP8266 模块)。
- Bluetooth(蓝牙):短距离无线通信,学习 BLE(低功耗)、经典蓝牙的设备配对与数据传输。
8. 应用开发层(实现 “用户功能”)
- Qt:嵌入式 GUI 开发,基于 C++,学习窗口、控件、信号与槽,开发交互界面。
文件夹:
0-0_tools/
1-0_gpio/
1-1_clock/
1-2_irq/
1-3_cpu-architecture/
2-0_uart/
2-1_spi/
2-2_i2c/
2-3_pwm/
2-4_adc-dac/
2-5_timer/
3-0_bootloader/
3-1_device-tree/
4-0_rtos/
4-1_linux-kernel/
4-2_filesystem/
5-0_can/
5-1_lin/
5-2_rs232-rs485/
5-3_modbus/
5-4_ethernet/
6-0_usb/
6-1_wifi/
6-2_bluetooth/
6-3_zigbee/
6-4_lora/
7-0_qt/
7-1_embedded-database/
7-2_ai-frameworks/
8-0_low-power/
8-1_security/
8-2_ota/
建文件夹的命令:
mkdir -p 0-0_tools 1-0_gpio 1-1_clock 1-2_irq 1-3_cpu-architecture 2-0_uart 2-1_spi 2-2_i2c 2-3_pwm 2-4_adc-dac 2-5_timer 3-0_bootloader 3-1_device-tree 4-0_rtos 4-1_linux-kernel 4-2_filesystem 5-0_can 5-1_lin 5-2_rs232-rs485 5-3_modbus 5-4_ethernet 6-0_usb 6-1_wifi 6-2_bluetooth 6-3_zigbee 6-4_lora 7-0_qt 7-1_embedded-database 7-2_ai-frameworks 8-0_low-power 8-1_security 8-2_ota
基本上包含了当前行业对嵌入式软件工程师的技能要求。