[问题] disable中断的替代方案(逻辑求救)

楼主: zzss2003 (brotherD)   2017-09-05 18:24:14
抱歉,小弟的标题下的不好(真的不晓得该怎么下)。最近小弟在拜读David E.Simon的An
Embedded Software Primer一书,目前读到第四章"中断"。
本章前面举几个例题,说明当中断发生在CPU正在把hardware register的value搬近data
memory的途中,会导致程式有bug。其中有一个方法是当在处理资料的之前,先关掉中断,
等处理完资料后,在开启中断。
然后作者说这种方式的优点可以解决shared-data problem,但缺点是会增加interrupt
latency。接著作者在继续介绍如何不用disable -> 处理资料 -> enable的方式达到解决
shared-data problem的问题。
图1:https://imgur.com/a/PMYE1
这个例题利用了一个变量fTaskCodeUsingTempsB解决这个问题。
当中断发生时,会先去判断fTaskCodeUsingTempsB的值,如果TURE,则改变A矩阵的值(此
时主函式main在处理的是B矩阵的值);如果FALSE,则改变B矩阵的值(此时主函式处理A矩
阵)。借此可以解决shared-data problem(因为没有一种情况是当主程式在处理A矩阵的值
,中断的副程式又改变A矩阵的值)。但这个程式有个小小的缺点是:如果中断发生在While
循环的起点(此时fTaskCodeUsingTempsB为1)且硬件丢进A[0]跟A[1]的值不一样,在中断完
成并跳回主程式的时候,alarm并不会发作(因为此时在判断矩阵B),必须要等到主程式跑
到fTaskCodeUsingTempB = !fTaskCodeUsingTempB;才能在下一个while判断到矩阵A。
作者则提供了修正这个bug后的例题。
图2:https://imgur.com/a/GjJzz
图3:https://imgur.com/a/oFsqm
我的问题在于,我看不懂第二个例题在做什么。
中断副函式把一组温度写进iTemperatureQueue的矩阵。Because the iHead pointer and
the iTail pointer ensure that the interrupt routine will be writing to
different locations in the queue(array) than the ones(locations) from which the
task code(the code in the main) is reading, the shared-data problem is
eliminated.
这是作者的意思(英文有解读错误请指正)
我晓得在中断副函式中,一组温度的值会先放在iTemperatureQueue[0]跟[1],接着放进
[2]跟[3](iHead = iHead + 2),且当iHead超过上限100时,下一组温度会覆蓋[0]跟[1]的
值,以此类推。
在主函式中,一开始iTail跟iHead都为0,表示第一轮循环并不会进入if,接着中断发生,
if条件成立,array[0]跟array[1]被放进去值,iHead变2,跳出中断。
第二轮循环,if条件成立(0 != 2),a[0]跟a[1]的值放进iTemperature1跟iTemperature2
以此类推...但我不懂为什么这种方式就可以解决例题1的问题。
第二个是,我看不懂在中断副函式里面的if成立的条件,我觉得很复杂。
我想把!拿掉,拿掉后应该是会变成这样子:
if( (iHead+2 != iTail) && (iHead != QUEUE_SIZE-2 || iTail != 0) )
但我还没想出来为什么这行判断式是阵列还没满的条件。
谢谢大家耐心看完这冗长的文章。小弟感激不尽~
作者: Lipraxde (Lipraxde)   2017-09-05 18:45:00
可以先问一下你有没有学过queue?
楼主: zzss2003 (brotherD)   2017-09-05 21:04:00
作者: Lipraxde (Lipraxde)   2017-09-06 12:19:00
1中断里会进到else,代表中断的太频繁,queue放不下了,只好把这次拿到值舍去2你自己不是有写?就笛摩根出来的东西3circle queued看一看
作者: enonrick (EnonRick)   2017-09-06 12:51:00
123(代表你不懂queue)4(该书该章已经解释很清楚,你还不懂就是不理解书在表达什么,重看吧)
楼主: zzss2003 (brotherD)   2017-09-06 15:19:00
看了Circle queue后会了QQ

Links booklink

Contact Us: admin [ a t ] ucptt.com