作者zzss2003 (brotherD)
看板C_and_CPP
标题[讨论] Round-Robin with interrupt
时间Fri Sep 8 16:04:05 2017
各位好,小弟目前在拜读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;
}
想请问,小弟的逻辑哪里有错误或矛盾呢?谢谢各位前辈拨冗查看。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.248.26.157
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1504857848.A.29D.html
1F:→ Lipraxde: 你是不是只有看书,没动手做过? 09/08 16:11
2F:→ zzss2003: 是的! 09/08 16:27
3F:推 chuegou: 有资料可以传 跟 硬体准备好传资料 是两件事喔 09/08 16:31
c大你好。有资料可以传的条件已经在if里面被判断了,如果没资料可以传就会跳过if。
我在文中想表达的意思是,硬体已经随时准备好传资料,就算没有fLinkAReadyToSend去
判断。
※ 编辑: zzss2003 (60.248.26.157), 09/08/2017 17:14:08
4F:推 chuegou: 硬体可传资料的前提是前一笔资料已经传出去 不是随时喔 09/08 19:26
5F:→ chuegou: 所以要等传完资料产生中断 09/08 19:26
C大,您是指说,在虚拟码!!Send ch to Link A这行中,虽然MCU已经发送指令请硬体送出
去了,但送也需要时间,如果没有fLinkAReadyToSend = False这一行,可能发生在资料还
没送完的情况,下一笔就又要被送出去了吗?
谢谢您的提醒,我没有考虑到这一点(我先入为主地以为硬体传出去的速度比指令跑一圈的
速度还快很多)
※ 编辑: zzss2003 (115.82.5.51), 09/09/2017 13:08:35
6F:推 chuegou: 对 一般来说 处理器的速度是MHz 通讯是KHz 09/10 02:47
7F:推 Sex5F: send to queue已经做完get relay 09/11 13:29
8F:→ Sex5F: 只要确认有拿到relay,处理relay资料 09/11 13:30
9F:→ Sex5F: 因为,get relay可能return false 09/11 13:30
谢谢C大与性感DER五楼
※ 编辑: zzss2003 (60.248.26.157), 09/12/2017 10:50:18