背景:在开发板上判断旋钮左旋和右旋从而控制一个数的增加和减小(TASK A),同时在LCD上显示这个数(TASK B)。问题:假设左旋一下,则在LCD上显示左旋了很多下,用串口显示确实多次操作了。
思考:认真思考后发现问题出在任务的同步上,当A从开始到结束,有可能B已经运行很多次了,这就导致了多次判断出错。
解决:
A:
if (Knob_num && Knob_dir) {
Knob_num_temp = Knob_num;
Knob_dir_temp = Knob_dir;
Knob_num = Knob_dir = 0;
if(Knob_dir_temp == KNOB_LEFT) {
position_x --;
} else {
position_x ++;
}
}
B:
if (Knob_num_temp && Knob_dir_temp) {
//do some thing
Knob_num_temp = Knob_dir_temp = 0;
}
当A中检测到旋钮旋转时,把状态传给中间变量,然后清零,之后在A中对状态的操作都换成对中间变量的操作。
在B中用中间变量作为if进入条件,这样当进入A时,即使任务切换至B也只会进入一次B中if,这样就用两个"多余“的变量实现了“同步”。