printf( ) - write a formatted string to the standard output stream (ANSI).
log( ) does not actually perform the output directly to the logging streams, but instead queues the message to the logging task, logMsg( ) can be called from interrupt service routines.
printf()是將信息輸出到標(biāo)準(zhǔn)輸出設(shè)備(STDIN/STDOUT)中,如果此時(shí)設(shè)備正在工作,那么就會(huì)發(fā)生阻塞.
log()是使用消息隊(duì)列的方式,它將信息地址發(fā)送到隊(duì)列,由專(zhuān)門(mén)的任務(wù)將信息打印出來(lái).
關(guān)于Log的工作機(jī)理析桥。LogMsg利用消息隊(duì)列將用戶(hù)所發(fā)的消息傳送給LogTask,然后由LogTask將其顯示在屏幕或者其他輸出設(shè)備上。而VxWorks默認(rèn)的LogTask的任務(wù)優(yōu)先級(jí)很高,這就直接導(dǎo)致了任務(wù)的切換。
切換是這樣發(fā)生的,假設(shè)用戶(hù)任務(wù)usrTask的優(yōu)先級(jí)是51級(jí)(通常要低于網(wǎng)絡(luò)任務(wù)50級(jí),一般在100級(jí)以后)幸冻,而我記憶中的LogTask是1級(jí)任務(wù),僅次于中斷響應(yīng)辩越。
當(dāng)usrTask調(diào)用LogMsg的時(shí)候嘁扼,LogTask解除阻塞狀態(tài),獲得CPU資源黔攒,而usrTask則排隊(duì)到就緒任務(wù)隊(duì)列去了趁啸。LogTask釋放CPU資源后,就緒隊(duì)列中的第一個(gè)任務(wù)開(kāi)始執(zhí)行督惰,usrTask則繼續(xù)在就緒隊(duì)列里等待
log可 用于中斷函數(shù)調(diào)用不傅,而printf不能用于中斷,會(huì)阻塞
printf 在向串口發(fā)送數(shù)據(jù)時(shí)赏胚,串口驅(qū)動(dòng)是存在發(fā)送緩存的访娶,當(dāng)我們使用stampX 時(shí),一次printf 調(diào)用不會(huì)導(dǎo)致發(fā)送緩存滿(mǎn)觉阅,所以printf 在將字符串送到緩沖區(qū)里就返回了崖疤,所以速度較快(并且和串口的波特率無(wú)關(guān))。而使用timexN時(shí)典勇,它會(huì)多次調(diào)用printf劫哼,導(dǎo)致發(fā)送緩沖滿(mǎn),這時(shí)printf 會(huì)被阻塞割笙,等待發(fā)送完成权烧,這時(shí)測(cè)出來(lái)的性能就基本上反映了串口的通訊速率
固:在大工程中眯亦,使用log,不使用printf.