嵌入式数据共享问题

skd2278 2006-11-14 04:58:02
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:急求,想了一晚上没想通。老师也没说明白,说是翻译错了。
...全文
134 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
大熊猫侯佩 2006-11-14
  • 打赏
  • 举报
回复
自己琢磨一下吧,呵呵
大熊猫侯佩 2006-11-14
  • 打赏
  • 举报
回复
但是task1中途被挂起了,切换回来时r1=14。
skd2278 2006-11-14
  • 打赏
  • 举报
回复
如你所说的逻辑,我有点不明白,因为两个任务是单独的要保证每个调用都能正确得到结果,其中task1的值并没有被损坏。也就是说,它被task2切换了以后还能得到正确的值,这个共享数据不会影响task1得到最后正确的结果,因为在这里我们只关心task1得到的结果。
大熊猫侯佩 2006-11-14
  • 打赏
  • 举报
回复
cerrors初始值是5,那么按正常的逻辑执行完毕后cerrors为5+9+11=25

他说的是时间片被换出的情况,也算是特殊的情况,即时间片正好在预想的地方
切换时所得的值。

如果预想的情况发生,最后回到task1时由于任务上下文的保护,r1寄存器的值
仍为 14 ,这时在写入 cerrors 时会将 task2 已写入的值"冲掉",即最后
cerrors的值为 14 ,不知这样说你可否理解?

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧