Re: 急!關於USART的TX中斷問題
|
||||
---|---|---|---|---|
高級會員
|
我現在的確是在寫一個RTOS,當作PIC的練習,因為這是公司給我的qualification,可以讓我徹底瞭解PIC的問題.
很感謝大家在MCHP Forum給我的建議! 我之前有完成一個Rx Queue+LCD Display程式,但是做壓力測試時,用BR115200,一次PC送&收一萬個codes試試看,發現會漏值,所以我想我可能需要2個Queue來解決,不過沒想到兩Queue的Bridge我還在思考....甚至我覺得把Rx Buffer開大一點的效率說不定是一樣的(I guess)!! 之前的員工是用8051,結果OSC比PIC慢,做壓力測試卻不會漏,我想PIC速度更快,一定更不會漏!!! Dear Master, 看了您的source code, 解決了我不少疑惑, 尤其在empty與full的判斷,我一直在思考是否有更快的方式, 您這方法的確是個好方法!!! 感謝答覆,我會繼續思考RTOS的寫法, 不過至目前為止,我一本OS的書都沒看過, 可以介紹幾本入學的嗎?
發表於: 2008/7/20 13:33
|
|||
|
Re: 急!關於USART的TX中斷問題
|
||||
---|---|---|---|---|
資深會員
|
我自己用的queue(FIFO)是設計成環形的。queue的結構如下:
//herader file
檢查是否為空或是滿的狀況檢查方式如下:
//c files
要用的話直接在主程式宣告就行了....要幾個就有擠個... 參考看看囉....這東東以前寫的,用很久沒有啥問題...而且如果你的Q_SIZE是256或是2的冪次方的話,這東西還有一些小TIP可以改過節省計算的一些步驟喔...
發表於: 2008/7/18 17:18
Edited by master on 2008年07月18日 18:02:36
Edited by master on 2008年07月18日 18:03:26 Edited by master on 2008年07月18日 18:03:58 Edited by master on 2008年07月18日 18:13:07 |
|||
不要問我哪裡來,我只是個流浪天涯的工程師
|
||||
|
Re: 急!關於USART的TX中斷問題
|
||||
---|---|---|---|---|
資深會員
|
參照:
我沒有建議1個Queue啊?... 我以為我是在討論TX中斷的問題... 因為TX和RX在處理時配置BUFFER是在RTOS裡的基本手段。一般就是一個給Tx,一個Rx。我自己比較不給RX配置Buffer,因為我的UART RX通常是接封包資料。所以ISR只處理接收封包的處理。然後設置semaphore(@RTOS)或是flag標記讓主程式處理命令。 而且TX和RX本來就是兩個不相干的工作,槁在一起討論有點奇怪...XD
發表於: 2008/7/18 17:13
|
|||
不要問我哪裡來,我只是個流浪天涯的工程師
|
||||
|
Re: 急!關於USART的TX中斷問題
|
||||
---|---|---|---|---|
版主
|
ㄧ般在 C 會使用陣列的方式來完成 Queue Buffer 並使用兩個 Index 來索引資料,利用這兩個 Index 的差異值來判斷有多少資料在 Queue Buffer 裡。
X index = Y index 時無新資料。 X index > Y index 至少有ㄧ筆以上的資料 存入資要到 Queue 時,X index 加ㄧ後存入 取走 Queue 資料時,Y index +1 指向下一筆資料 要有頭尾的限制,與queue 滿了以後資料要如何覆蓋的考量。
發表於: 2008/7/18 15:50
|
|||
|
Re: 急!關於USART的TX中斷問題
|
||||
---|---|---|---|---|
版主
|
對初學著來說,個人建議 UART 的發送 (Tx) 還是不要使用中斷的方式傳送。接收的話建議要使用中斷接收。
使用中斷方式傳送資料,流程架構對初學著不易理解,而且開始與結束的處理也比較困難。如果程式的要求不是那麼 Real Time 的話,因為 Polling TXIF 所造成的引響是不大的。
發表於: 2008/7/18 15:47
|
|||
|
Re: 急!關於USART的TX中斷問題
|
||||
---|---|---|---|---|
高級會員
|
再請問一下,
我想寫的是有2個Queue同時存在, 一個給Tx,一個Rx, 如此設計是怕會漏值, 是否有其必要如此設計??? 我想Master的建議應該是只有一個Queue吧,Right?
發表於: 2008/7/18 15:16
|
|||
|
Re: 急!關於USART的TX中斷問題
|
||||
---|---|---|---|---|
資深會員
|
Q1:TX中斷。
Q2:YES,只要佇列不為空,TX中斷就不會停止。 Q3:不用,停止ISR要在ISR裡面作。停止TX中斷的條件就是佇列資料為空。 RX接收跟TX沒關係 差不多就是這樣吧...XD 很多概念其實都是從OS的書裡來的....
發表於: 2008/7/17 13:56
|
|||
不要問我哪裡來,我只是個流浪天涯的工程師
|
||||
|
Re: 急!關於USART的TX中斷問題
|
||||
---|---|---|---|---|
高級會員
|
Dear Master,
昨天我又試了一晚,仍有些問題想要請教!! "直接維護一個環形佇列,把要送的資料ADD到佇列後啟動中斷。只要佇列不要爆,後面的資料就是一直加到尾巴" Q1: 您在這所說的中斷,是指TX中斷,還是Timer中斷(偵測TX_Queue內是否有值,若有則傳送)?? 在您寫的範例裡: char putsUART(*str) { //檢查佇列剩餘空間,基本上不動TXREG,都放在中斷裡作 //...把資料加入佇列之中,如果佇列滿或空間不足 //,return -1 if(PIE1bits.TXIE = 0){PIE1bits.TXIE = 1}; return 0; } Q2: "基本上不動TXREG,都放在中斷裡作",您指的是Tx還是Timer中斷??若為TX interrupt, 是否在您的範例if(PIE1bits.TXIE=0)的上一行要加上TXREG=str[0]??若如此,那是否會遇到"Call putsUART時,TXIE已為TRUE(也就是狀態為續傳,not the situation that sending the first data)"的問題? Q2: "後面的資料就是一直加到尾巴"是在PutsUART內做的,對吧?? "TX中斷就會一直運作到佇列為空時停止","資料傳完要把TX中斷關掉" Q3: 如果Tx在傳時,Rx又有值要收,需要用Rx來中斷Tx嗎?但在這當中Tx未送完,TXIE=1,該怎麼辦?而且我的TX中斷程式寫成 if(TXIF) { TXIF=0; // USART Transmit interrupt flag bit if(Tx_Queue有值) TXREG=TX_Queue[i++]; if(Tx_Queue無值 && TXIE==TRUE) TXIE=0; } // end of TXIF 整個中斷TXIF()程式中,還需加入什麼判斷,或是disable什麼嗎?? 謝謝!!
發表於: 2008/7/17 9:44
|
|||
|
Re: 急!關於USART的TX中斷問題
|
||||
---|---|---|---|---|
高級會員
|
感謝Master與mmmmm的答覆,我想我已經從Master的回應找到solution了,Thanks a lot.
發表於: 2008/7/16 17:16
|
|||
|