第一章:裸奔的代价——当两个任务同时把手伸向串口
做嵌入式开发的,谁没遇到过这种鬼打墙的现象:你写了个漂亮的各种传感器数据采集程序,跑了一天都挺好,结果半夜两点测试那边发来一张图,串口打印的数据突然乱码了,或者I2C总线突然死锁了,整个系统像植物人一样只有心跳没有反应。
你查了一周代码,逻辑完美无缺。其实,问题往往不在逻辑,而在时机。
咱们先不谈那些高大上的理论,先看个最真实的“翻车”现场。假设你用的是STM32或者类似的MCU,跑了个FreeRTOS(或者RT-Thread,原理都一样)。你有两个高频任务:
Task_A:负责采集温度,通过I2C总线读取传感器。
Task_B:负责采集加速度计,也是同一个I2C总线。
这俩哥们在代码里大概长这样:
// 伪代码,意会即可
void Task_A(void *pv) {
while(1) {
I2C_Start();
I2C_SendAddr(0x50); // 温度传感器地址
// …读取数据
I2C_Stop();
vTaskDelay(100);
}
}
void Task_B(void *pv) {
while(1) {
I2C_Start();
I2C_SendAddr(0x60); // 加速度计地址
// …读取数据
网硕互联帮助中心

评论前必须登录!
注册