各位好,小弟目前在拜读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;
}
想请问,小弟的逻辑哪里有错误或矛盾呢?谢谢各位前辈拨冗查看。