嵌入式数据共享问题
void task1(void)
{
vcounterrors(9);
}
void task2(void)
{
vcounterrors(11);
}
static int cerrors;
void vcounterrors(int cnewerrors)
{
cerrors += cnewerrors;
}
这是陈向群翻译的国外那本嵌入式系统软件教程中的一段代码,这里是任务之间互相调用的问题。
cerrors += cnewerrors;汇编代码如下:
MOVE R1, (cerrors)
ADD R1, (cnewerrors)
MOVE R1 (cerrors), R1
RETURN
下面是任务切换:
任务task1调用vcunterrors(9)
MOVE R1, (cerrors)
ADD R1, (cnewerrors)
ROST切换到task2
任务task2调用vcounterrors(11)
MOVE R1, (cerrors)
ADD R1,(cnewerrors)
MOVE (cerrors), R1
ROST切换到任务task1
MOVE R1 (cerrors), R1
书上说,最后cerrors的值为25(初始值5,加11,加9),并且说它应该为14;
也就是说25是出现数据共享问题后的错值,而14才是正确的。可是我看那段代码最后怎么看都是14啊,并且我感觉这例子中间代码切换不会出现问题,虽然他们共享cerrors可是,在计算过程中两者不会冲突啊,从任务task1切换到任务task2,R1的值是保存在栈中,返回时从栈中取出并不会出错啊,我真不明白为什么。本人刚开始学这个,很多都不懂,这段代码虽然简单,可是,我老是感觉用在数据共享这个例子中有很多不恰当,所以,请大家帮帮我。这是机械工业出版社《嵌入式系统软件教程》(美)David E.Simon著 陈向群等译,中文版95页,英文版149页。
PS:急求,想了一晚上没想通。老师也没说明白,说是翻译错了。