[問題] 改寫UART程式 ,不使用while等待

看板C_and_CPP作者 (神武信魔)時間11年前 (2014/08/08 12:25), 11年前編輯推噓6(607)
留言13則, 7人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Ansi C 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) MCU 自訂的函數 問題(Question): 不想使用while在那裏不斷地等待,占用CPU的時間. 那段時間可以執行近萬行指令. 餵入的資料(Input): 同樣的參數 預期的正確結果(Expected Output): 同樣的結果 錯誤結果(Wrong Output): 現在測試出的結果有 1.程式亂飛(PC亂了) 2.不斷地持續傳送 程式碼(Code):(請善用置底文網頁, 記得排版) 好讀版 http://ideone.com/dz4HER void UART1WriteString( char *string) { // P_Debug_O=1; while(*string != '\0') { while(!UARTTransmitterIsReady(UART_MODULE_ID)) ; UARTSendDataByte(UART_MODULE_ID, *string); string++; while(!UARTTransmissionHasCompleted(UART_MODULE_ID)) ; } // P_Debug_O=0; } 補充說明(Supplement): 我試過下面這一種寫法還是不行 IO_FLAG是自己訂的Union,用來作流程控制的. void UART1Trans_fail( void) { P_Debug_O=1; if(UARTTransmitterIsReady(UART_MODULE_ID)) { UARTSendDataByte(UART_MODULE_ID, U1TX_Buffer[U1TX_Index]); // IO_FLAG.U1TXP=1; //Uart1 TX in processing flag hand up IO_FLAG.U1TXReady=0; } // P_Debug_O=0; if(UARTTransmissionHasCompleted(UART_MODULE_ID)) { // IO_FLAG.U1TXP=0; if(U1TX_CNT==0) //check need to send next byte { IO_FLAG.U1TXReady=1; IO_FLAG.U1TXP=0; } U1TX_CNT--; U1TX_Index++; } P_Debug_O=0; } // -- 在臺灣,何謂R&D工程師? 1.Reverse and Decap :IC反向工程,去膠,打開封裝,拍照,複製電路佈局。 2.Resign and Die :沒死的就操到辭職,沒辭職的就操到死。 3.Rework and Debug :計畫永遠跟不上變化,變化永遠跟不上老闆的一句話! 4.Relax and Delay :太過於輕鬆(Relax),那麼就要有schedule delay的準備! 但是外派到大陸的臺灣郎,晚上是R (鴨)陪客戶,白天是D (豬)任人宰割! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 115.80.225.76 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1407471920.A.E5C.html

08/08 13:21, , 1F
怎麼不用事件,應該有大部份的chip都有支援吧?
08/08 13:21, 1F

08/08 13:21, , 2F
看你的chip是哪顆copy範例程式就對了。
08/08 13:21, 2F
範例程式就是那一支使用while的. 已經可以猜到原廠的說法了.我們保證我們的function是好的. 怎麼用是客戶的事情... yes!! YOU KNOW. ※ 編輯: kingzero (115.80.225.76), 08/08/2014 13:55:47

08/08 14:21, , 3F
看他硬體IP完成收送時會不會發中斷,改成用中斷處理
08/08 14:21, 3F

08/08 14:22, , 4F
不然就是資料出去之後啟動timer去看狀態
08/08 14:22, 4F
UART會產生中斷,我試試看中斷怎麼做.但是我還必須搞懂兩個旗標什麼情況會舉起跟放下. ※ 編輯: kingzero (115.80.225.76), 08/08/2014 14:58:14

08/08 20:32, , 5F
通常MCU中斷都是有一個特殊的函數名 去實作它就好了
08/08 20:32, 5F

08/08 20:33, , 6F
不過我也碰過廠商範例寫超爛的 最後寄信到更上層的原廠
08/08 20:33, 6F

08/08 20:33, , 7F
才拿到詳細的API文件可以用 不然真的寫到吐血
08/08 20:33, 7F

08/09 00:58, , 8F
你用的是哪一款MCU ?
08/09 00:58, 8F

08/09 01:25, , 9F
MCU型號說一下!!應該就有一堆SampleCode了
08/09 01:25, 9F
我實在是很不想說是哪一款MCU.因為會顛覆大家的那款MCU的良好印象.

08/10 20:27, , 10F
使用interrupt才是最佳解
08/10 20:27, 10F
那款MCU在官方網站上的sample code就只可以動.而且還是使用while的方式在等狀態. Interrupt只是跳出去,不處理. 可以參考下面的的超鏈結. http://ideone.com/dz4HER MCU大廠表示:我們只證明我的硬體是好的,怎麼應用是客戶的事情. ※ 編輯: kingzero (115.80.237.25), 08/11/2014 09:34:54 ※ 編輯: kingzero (115.80.237.25), 08/11/2014 14:42:37

08/12 02:17, , 11F
廠商的SampleCode本來就只是讓你測試這個功能是能WORK的
08/12 02:17, 11F

08/12 02:18, , 12F
實際CASE的使用 尤其是interrupt跟Multitask之類的應用
08/12 02:18, 12F

08/12 02:19, , 13F
就是coding的功夫了
08/12 02:19, 13F
文章代碼(AID): #1Jv54mvS (C_and_CPP)