• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::


Browsing this Thread:   1 Anonymous Users




(1) 2 »


Re: 急!關於USART的TX中斷問題
#15
資深會員
資深會員


查看用戶資訊
1.Building a Real Time Operating System: RTOS from the Ground Up by Colin Walls

2.Simple Real-time Operating System: A Kernel Inside View for a Beginner by Chowdary Venkateswara Penumuchu

3.MicroC/OS-II:即時作業系統核心 (MicroC/OS-II: The Real-Time Kernel, 2/e)

4.Real-Time Concepts for Embedded Systems by Qing Li, Caroline Yao

5.Patterns for Time-Triggered Embedded Systems: Building Reliable Applications with the 8051 Family of Microcontrollers

1.2我是從亞瑪遜訂的

3.4.5.天瓏有賣,5有簡體板。

上面的code在長度為2的冪次方時可以簡化,如長度為256,那head和tail就只會在0-255變化,如果是16,你只要把queue_t修改一下如
typedef struct QUEUE
{
       
char                 data[Q_SIZE];
       
unsigned char  head:4;
       
unsigned char  tail:4;
       
unsigned char  len;
}
queue_t;


那程式碼%Q_SIZE的部分就能不要....簡單的TIP。

發表於: 2008/7/20 14:57
不要問我哪裡來,我只是個流浪天涯的工程師
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 急!關於USART的TX中斷問題
#14
高級會員
高級會員


查看用戶資訊
我現在的確是在寫一個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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 急!關於USART的TX中斷問題
#13
資深會員
資深會員


查看用戶資訊
我自己用的queue(FIFO)是設計成環形的。queue的結構如下:
//herader file
#define Q_SIZE 10
typedef struct QUEUE
{
       
char                 data[Q_SIZE];
       
unsigned char  head;
       
unsigned char  tail;
       
unsigned char  len;
}
queue_t;

檢查是否為空或是滿的狀況檢查方式如下:
//c files
char isFull(queue_t *_queue)
{
    if((
_queue->head%Q_SIZE) == ((_queue->tail+1)%Q_SIZE)){return 1;}
    return 
0;
}

char isEmpty(queue_t *_queue)
{
    if((
_queue->head%Q_SIZE) == (_queue->tail%Q_SIZE)){return 1;}
    return 
0;
}

要用的話直接在主程式宣告就行了....要幾個就有擠個...
參考看看囉....這東東以前寫的,用很久沒有啥問題...而且如果你的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
不要問我哪裡來,我只是個流浪天涯的工程師
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 急!關於USART的TX中斷問題
#12
資深會員
資深會員


查看用戶資訊
參照:

me84108 寫道:
再請問一下,
我想寫的是有2個Queue同時存在,
一個給Tx,一個Rx,
如此設計是怕會漏值,
是否有其必要如此設計???

我想Master的建議應該是只有一個Queue吧,Right?


我沒有建議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
不要問我哪裡來,我只是個流浪天涯的工程師
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 急!關於USART的TX中斷問題
#11
版主
版主


查看用戶資訊
ㄧ般在 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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 急!關於USART的TX中斷問題
#10
版主
版主


查看用戶資訊
對初學著來說,個人建議 UART 的發送 (Tx) 還是不要使用中斷的方式傳送。接收的話建議要使用中斷接收。
使用中斷方式傳送資料,流程架構對初學著不易理解,而且開始與結束的處理也比較困難。如果程式的要求不是那麼 Real Time 的話,因為 Polling TXIF 所造成的引響是不大的。

發表於: 2008/7/18 15:47
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 急!關於USART的TX中斷問題
#9
高級會員
高級會員


查看用戶資訊
再請問一下,
我想寫的是有2個Queue同時存在,
一個給Tx,一個Rx,
如此設計是怕會漏值,
是否有其必要如此設計???

我想Master的建議應該是只有一個Queue吧,Right?

發表於: 2008/7/18 15:16
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 急!關於USART的TX中斷問題
#8
資深會員
資深會員


查看用戶資訊
Q1:TX中斷。

Q2:YES,只要佇列不為空,TX中斷就不會停止。

Q3:不用,停止ISR要在ISR裡面作。停止TX中斷的條件就是佇列資料為空。
RX接收跟TX沒關係
差不多就是這樣吧...XD

很多概念其實都是從OS的書裡來的....

發表於: 2008/7/17 13:56
不要問我哪裡來,我只是個流浪天涯的工程師
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 急!關於USART的TX中斷問題
#7
高級會員
高級會員


查看用戶資訊
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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 急!關於USART的TX中斷問題
#6
高級會員
高級會員


查看用戶資訊
感謝Master與mmmmm的答覆,我想我已經從Master的回應找到solution了,Thanks a lot.

發表於: 2008/7/16 17:16
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------