本项目已完成从前后台轮询系统向 FreeRTOS 多任务架构的迁移。通过抢占式调度和任务解耦,显著提升了系统的实时性和可靠性。
系统被划分为三个核心任务,通过优先级配置确保了通信的高优先级响应:
| 任务名称 | 优先级 | 堆栈大小 | 职责说明 |
|---|---|---|---|
| TaskLoRa | osPriorityHigh |
512 Words | 负责 SPI 射频接收、协议解析及串口转发,确保数据不丢失。 |
| TaskLCD | osPriorityNormal |
1024 Words | 负责 NT35510 屏幕渲染。利用阻塞机制减少 CPU 占用。 |
| defaultTask | osPriorityLow |
128 Words | 系统状态监控及空闲处理。 |
采用 生产者-消费者 (Producer-Consumer) 模型:
- 生产者 (LoRa Task):当 LoRa 模块接收到合法数据包并校验通过后,将数据封装进
LoRa_Packet_t结构体,通过osMessageQueuePut发送。 - 消费者 (LCD Task):平时处于
osWaitForever阻塞状态(不占 CPU)。一旦队列收到数据,立即唤醒进行 UI 刷新。
graph TD subgraph "High Priority: TaskLoRa (Producer)" A[RF Data Received] --> B{CRC Check} B -- Pass --> C[Parse to Structure] C --> D[osMessageQueuePut] end
subgraph "Queue Buffer"
D --> E[LoRaDataQueue]
end
subgraph "Normal Priority: TaskLCD (Consumer)"
E --> F[osMessageQueueGet]
F -- Data Ready --> G[Format String]
G --> H[FSMC LCD Refresh]
H --> F
end
style E fill:#f9f,stroke:#333,stroke-width:2px
style A fill:#dfd,stroke:#333
style H fill:#ddf,stroke:#333
- 独立时钟源:将 HAL 库的
Timebase Source切换至 Timer 1,避免与 FreeRTOS 的SysTick产生冲突。 - 堆栈保护:针对
sprintf浮点数处理在任务中容易溢出的问题,将 LCD 任务堆栈扩容至 4KB (1024 Words)。 - 资源解耦:利用
extern关键字与模块化头文件管理,解决了多任务环境下全局变量重定义的冲突问题。
- RTOS 内核: FreeRTOS V10.3.1 (CMSIS-RTOS V2)
- 内存分配策略:
Heap_4(支持内存碎片管理) - 关键配置:
TOTAL_HEAP_SIZE:32768Bytes (F407 192KB RAM 冗余充足)MINIMAL_STACK_SIZE:128Words
(此处可插入你刚才拍的那张照片,或者使用以下占位符)
RTOS 实时效果展示: 界面顶部实时显示心跳星号
*。即使在执行复杂的经纬度浮点运算时,LoRa 的接收闪烁也毫无卡顿,验证了高优先级任务的抢占成功。
- 软件定时器: 移除任务内的
osDelay闪灯,改用 FreeRTOS Software Timer 实现系统心跳。 - 互斥锁 (Mutex): 引入互斥量保护串口 1,防止多任务并发打印导致的乱码。
- 水位监测: 实现任务堆栈水位监测功能,防止长时间运行导致的内存溢出。
# 在 feat-freertos-migration 分支下
git add README.md
git commit -m "Docs: Update README to reflect RTOS architecture and task planning"
git push origin feat-freertos-migration
更新完 README 后,你的 GitHub 仓库就像一个成熟的开源项目了!你想不想尝试写一个简单的“堆栈水位监测”小功能?它可以帮你确认 1024 Words 的堆栈是否真的够用。