[讨论] Round-Robin with interrupt

楼主: zzss2003 (brotherD)   2017-09-08 16:04:05
各位好,小弟目前在拜读Simon的An Embedded Software Primer一书。
目前遇到程式码范例看不懂的问题。
图片:https://imgur.com/a/HNawj
https://imgur.com/a/sGirY
https://imgur.com/a/SWpUe
https://imgur.com/a/F0sAi
问题在图5.7的程式码。不懂的问题有2个。
1.在if(fLinkAReadyToSend && fQueueHasData(&qDataToLinkA))
{
ch = chQueueGetData(&qDataToLinkA);
disable();
!!Send ch to Link A
fLinkAReadyToSend = FALSE;
enable()
}
里,为什么会先把Queue里面的值丢进ch后,在关闭中断?如果把值丢进去后,发生中断跑
到void interrupt vGotCharacterOnLinkA(void)或者是void interrupt
vGotCharacterOnLinkB(void),那么传到LINK A的值不就是错的了吗?
2.fLinkAReadyToSend这个判断式的是不是可以省略?
程式的流程是这样子。当资料处理好传到Link(不管是A或B)的暂存器,就必须发生中断
,把暂存器的值拿进去CH做处理,处理完再放到Queue里面,再回到main里头。这时候编
码或解码的function处理完Queue之后,再把值放到"处理完的Queue"。当fLinkAReadyTo
Send为TRUE(一开始就设为TRUE)且"处理完的Queue"有data,就会开始把"处理完的Queue
的里面的值"放进CH,然后传给Link。传完Link后,再把fLinkBReadyToSend设为False,
且再开启中断。
我的疑问是,既然在if循环里面,已经确保中断不会发生了,那就表示说在把资料透过
CH传给LINK的过程中,是不会被打扰的,那为什么还要判断fLinkBReadyToSend,判断这
个的目的不就是因为担心CH有没有正在被使用吗?
我觉得程式可以直接改成这样子:
if(fQueueHasData(&qDataToLinkA)){
disable();
ch = chQueueGetData(&qDataToLinkA);
!!Send ch to Link A
enable();
}
然后把这个function删除
void interrupt vSentCharacterOnLinkA(void)
{
fLinkAReadyToSend = TRUE;
}
想请问,小弟的逻辑哪里有错误或矛盾呢?谢谢各位前辈拨冗查看。
作者: Lipraxde (Lipraxde)   2017-09-08 16:11:00
你是不是只有看书,没动手做过?
楼主: zzss2003 (brotherD)   2017-09-08 16:27:00
是的!
作者: chuegou (chuegou)   2017-09-08 16:31:00
有资料可以传 跟 硬件准备好传资料 是两件事喔硬件可传资料的前提是前一笔资料已经传出去 不是随时喔所以要等传完资料产生中断
作者: Sex5F (HTC)   2017-09-11 13:29:00
send to queue已经做完get relay只要确认有拿到relay,处理relay资料因为,get relay可能return false

Links booklink

Contact Us: admin [ a t ] ucptt.com