国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品
搜索
熱門(mén)關(guān)鍵詞:
比較器
CMOS
電感
CSR
PSoC
手機(jī)版
官方微博
微信公眾號(hào)
登錄
|
免費(fèi)注冊(cè)
首頁(yè)
新聞
新品
文章
下載
電路
問(wèn)答
視頻
職場(chǎng)
雜談
會(huì)展
工具
博客
論壇
在線研討會(huì)
技術(shù)頻道:
單片機(jī)/處理器
FPGA
軟件/編程
電源技術(shù)
模擬電子
PCB設(shè)計(jì)
測(cè)試測(cè)量
MEMS
系統(tǒng)設(shè)計(jì)
無(wú)源/分立器件
音頻/視頻/顯示
應(yīng)用頻道:
消費(fèi)電子
工業(yè)/測(cè)控
汽車(chē)電子
通信/網(wǎng)絡(luò)
醫(yī)療電子
機(jī)器人
當(dāng)前位置:
EEChina首頁(yè)
›
論壇
›
新手園地
返回列表
查看:
964
|
回復(fù):
0
飛凌嵌入式干貨分享 - printf的歸宿-數(shù)據(jù)打印到哪兒了
[復(fù)制鏈接]
哦哈喲
哦哈喲
當(dāng)前離線
積分
1158
電梯直達(dá)
樓主
發(fā)表于 2021-3-6 16:47:33
|
只看該作者
|
倒序?yàn)g覽
|
閱讀模式
貿(mào)澤電子有獎(jiǎng)問(wèn)答視頻,回答正確發(fā)放10元微信紅包
關(guān)鍵詞:
飛凌嵌入式
關(guān)于
printf
printf是一個(gè)
接口
,跟UNIX標(biāo)準(zhǔn)IO的write系統(tǒng)調(diào)用類(lèi)似,但是更像C庫(kù)的fwrite,因?yàn)橥盗械暮瘮?shù)中還有一個(gè)fprintf(至于同系列其它的函數(shù),請(qǐng)自行man)。printf和fwrite的
區(qū)別
在于兩點(diǎn):
1.它可以格式化輸出,如果用fwrite,它接受的是一個(gè)固定的buffer,你不得不在調(diào)fwrite之前先使用sprintf之類(lèi)的函數(shù)格式化buffer;
2.它免除了你的fopen-fwrite-fclose這個(gè)序列的調(diào)用,因?yàn)樗苯訉⒏袷交膬?nèi)容寫(xiě)入U(xiǎn)NIX進(jìn)程自然打開(kāi)的1號(hào)文件描述符,即標(biāo)準(zhǔn)輸出。
既然printf寫(xiě)入了標(biāo)準(zhǔn)輸出,那么接下來(lái)就要定義什么是標(biāo)準(zhǔn)輸出。在早期UNIX年代,人們?cè)诮K端或者偽終端操作機(jī)器,那時(shí)的輸入基本都是鍵盤(pán),磁帶更古老的東西,而輸出就是一個(gè)計(jì)算結(jié)果,需要展示出來(lái)給人看的那種,一般為終端屏幕,也可以是一條紙帶,那么程序怎么知道輸入和輸出到底是什么呢?這就需要程序明確指定。UNIX的“一切皆文件”思想以及“分離抽象”思想徹底改變了這一切。
UNIX定義了抽象文件描述符0,1,2分別為標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤輸出。至于它們到底對(duì)應(yīng)什么設(shè)備,你可以在程序初始化的時(shí)候顯式重定向到任意設(shè)備,也可以在外部shell做類(lèi)似的重定向,這樣就把指明設(shè)備這件事從程序分離了出來(lái)。
我為什么不統(tǒng)一說(shuō)一下fwrite調(diào)用對(duì)程序性能的影響呢?因?yàn)樵撜{(diào)用之前你必須執(zhí)行fopen,而fopen的一個(gè)參數(shù)明確表示了你希望寫(xiě)入的對(duì)象是什么,這就不會(huì)帶來(lái)異議,畢竟如果你非要在性能
測(cè)試
的時(shí)候?qū)?/font>
cf卡
,那也是你愿意。printf就不同了,它對(duì)效率的影響取決于標(biāo)準(zhǔn)輸出是什么以及你是如何重定向標(biāo)準(zhǔn)輸出的,所謂的標(biāo)準(zhǔn)輸出并不是真實(shí)的設(shè)備,它只是一個(gè)抽象層,具體如何解釋標(biāo)準(zhǔn)輸出,還要依靠外部。
數(shù)據(jù)都去哪兒了
我以下面這個(gè)超級(jí)小的程序來(lái)說(shuō)明printf的時(shí)候,數(shù)據(jù)都去哪了:
#include
#include
int main(int argc, char **argv)
{ int i = 0;
int c = atoi(argv[1]);
for(; i < c; i++) {
printf("############ %d\n", i);
} return 0;
}
我先給出結(jié)果:
1.在/dev/tty1上直接執(zhí)行
ti
me ./test 1000
... ######### 995
######### 996
######### 997
######### 998
######### 999
real 0m0.414s
user 0m0.003s
sys 0m0.411s
2.在/dev/tty1上執(zhí)行time ./test 1000 >/dev/tty2
real 0m0.007s
user 0m0.003s
sys 0m0.007s
3.在SecureCRT上執(zhí)行time ./test 1000
...
######### 997
######### 998
######### 999
real 0m0.010s
user 0m0.002s
sys 0m0.003s
在SecureCRT上執(zhí)行time ./test 100000 >/dev/tty1,此時(shí)不切換tty
...
等了幾秒,無(wú)結(jié)果,于是在鍵盤(pán)按下Alt-F2,切換到第二個(gè)tty,馬上顯示出了結(jié)果:
real 0m4.276s
user 0m0.066s
sys 0m4.204s
5.在tty1上執(zhí)行time ./test 100000 >/dev/tty2:
real 0m0.499s
user 0m0.081s
sys 0m0.410s
6.在tty1上執(zhí)行time ./test 100000 >/dev/null
real 0m0.030s
user 0m0.028s
sys 0m0.001s
通過(guò)以上的結(jié)果數(shù)據(jù),我們可以得到以下的結(jié)論:
a.對(duì)于tty終端而言,如果當(dāng)前終端不是寫(xiě)入的終端,那么開(kāi)銷(xiāo)主要在內(nèi)核態(tài),且開(kāi)銷(xiāo)不是很大;
b.對(duì)于tty終端而言,如果當(dāng)前終端是寫(xiě)入的終端,那么開(kāi)銷(xiāo)主要在內(nèi)核態(tài),且開(kāi)銷(xiāo)很大;
c.對(duì)于不管是tty還是遠(yuǎn)程的pty終端,寫(xiě)入/dev/null的開(kāi)銷(xiāo)主要在用戶(hù)態(tài),開(kāi)銷(xiāo)不大;
d.對(duì)于pty遠(yuǎn)程終端(/dev/pts/X),不管寫(xiě)入的是不是當(dāng)前的pty終端,開(kāi)銷(xiāo)主要在內(nèi)核態(tài),且開(kāi)銷(xiāo)不是很大
e.對(duì)應(yīng)上面的結(jié)果和結(jié)論,下面給出一幅圖解,詳細(xì)解釋一下printf冰山下面的秘密:
線路規(guī)程串口舉例:
簡(jiǎn)易圖如下:
我想上圖已經(jīng)很清楚了,如果不懂什么叫行規(guī)程(也叫線路規(guī)程)的話(huà),請(qǐng)閱讀《UNIX環(huán)境高級(jí)編程》的終端和偽終端章節(jié),簡(jiǎn)單來(lái)說(shuō),它就是一個(gè)中間層,用來(lái)適配VFS接口和底層的具體驅(qū)動(dòng),比如解釋和處理控制字符等。從上面的圖中,我們可以看出,主要的開(kāi)銷(xiāo)幾乎都集中在底層,而底層卻偏偏是我們不能控制或者很難控制的。之所以上面的測(cè)試?yán)又衧sh登錄的終端對(duì)test性能的測(cè)試效果良好,但是那是因?yàn)榫W(wǎng)絡(luò)環(huán)境好,你在一個(gè)64kbps相隔5k公里的線路上試一下。
小小的printf下面竟然藏著如此多的內(nèi)容,并且很可能就是它成了你的程序的性能瓶頸,因?yàn)樽畹讓拥挠绊懸蛩赝遣豢煽氐摹D敲词遣皇蔷褪且馕吨乙ㄗh大家從來(lái)不用printf打印呢?或者說(shuō)干脆就不要用標(biāo)準(zhǔn)輸出呢?并不是這樣。但是為何不把打印這種事交給本機(jī)的另一個(gè)進(jìn)程呢?事實(shí)上,幾乎所有的需要記錄日志的系統(tǒng)都是這么做的,而syslog則迎合了這個(gè)思想。這種思想的背后就是“用可控制的一次IPC替換不可控制冰山之下的茫茫深海
關(guān)于日志記錄
日志記錄一直都是“薛定諤貓”式的東西,因?yàn)槿罩居涗涀鳛橐欢未a,它已經(jīng)是程序的一部分,不可能獨(dú)立地觀察程序的行為,如果說(shuō)用鏡像系統(tǒng)的話(huà),那么這種行為就是被動(dòng)的,你不得不鏡像每一條
指令
,以發(fā)現(xiàn)一些關(guān)鍵的信息,要想主動(dòng)記錄關(guān)鍵事件,必須用日志系統(tǒng)。打印日志可以方便信息獲取和審計(jì),但是代價(jià)有時(shí)也是高昂的:
1.你要設(shè)計(jì)一套日志回滾系統(tǒng),防止
存儲(chǔ)
空間被撐爆;
2.你要讓日志記錄盡快完成,不能降低關(guān)鍵路徑的性能;
3.你要反復(fù)調(diào)試代碼,確保日志記錄的緩沖區(qū)不會(huì)溢出;
4.為了讓日志更短,語(yǔ)言能力不好的人組織的日志就像電報(bào)一樣難以理解。
...
我認(rèn)為,日志記錄應(yīng)該遵循以下的原則:
1.除非必須要把事件發(fā)生的時(shí)間記錄下來(lái),否則就用
計(jì)數(shù)器
代替日志記錄,一系列的事件映射成一系列的
計(jì)數(shù)
器,由用戶(hù)決定什么時(shí)候查看事件發(fā)生了。事實(shí)上,
Linux
的網(wǎng)絡(luò)子系統(tǒng)就是用的這種方式,所有的/proc/net/netstat就是這個(gè)查看接口。
2.一定要有一個(gè)日志級(jí)別控制選項(xiàng),用戶(hù)可以決定是否記錄日志,以及記錄的日志詳細(xì)到什么程度。
tty層接口
驅(qū)動(dòng)代碼摘自:
lichee/linux-3.10/drivers/tty/serial/sunxi-uart.c
接收數(shù)據(jù)
static unsigned int sw_uart_handle_rx(struct sw_uart_port *sw_uport, unsigned int lsr)
{
….
tty_flip_buffer_push(&sw_uport->port.state->port);
…
}
tty_termios_baud_rate(termios)
tty_termios_encode_baud_rate(termios, baud, baud);
發(fā)送數(shù)據(jù)
百度搜索:飛凌
嵌入式
了解更多行業(yè)動(dòng)態(tài)
www.forlinx.com
收藏
0
頂
0
踩
0
相關(guān)文章
•
新品亮相!飛凌嵌入式i.MX91x核心板登陸臺(tái)北國(guó)際電腦展
•
發(fā)燒友實(shí)測(cè) | i.MX8MP 的MJPG碼流傳輸
•
飛凌iMX8MQ linux5.4.3 修改開(kāi)機(jī)進(jìn)度條
•
嵌入式密碼之智能交通信號(hào)燈
•
全志T507-C核心板引腳功能修改指引
•
飛凌嵌入式分享丨全志 A40i / T3對(duì)CAN的支持
•
飛凌iMX8MM擴(kuò)展HDMI和LVDS顯示如何避免踩坑
•
國(guó)產(chǎn)平臺(tái)之T507 開(kāi)發(fā)板Android 安全策略漫談
•
一文讀懂,為什么推薦您采用嵌入式核心板開(kāi)發(fā)產(chǎn)品?
•
全志A40i如何使用 ADB 調(diào)試工具
回復(fù)
舉報(bào)
返回列表
高級(jí)模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登錄后才可以回帖
登錄
|
立即注冊(cè)
本版積分規(guī)則
發(fā)表回復(fù)
回帖后跳轉(zhuǎn)到最后一頁(yè)
關(guān)于我們
-
服務(wù)條款
-
使用指南
-
站點(diǎn)地圖
-
友情鏈接
-
聯(lián)系我們
電子工程網(wǎng)
© 版權(quán)所有
京ICP備16069177號(hào)
| 京公網(wǎng)安備11010502021702
快速回復(fù)
返回頂部
返回列表
主站蜘蛛池模板:
中文字幕在线二区
|
亚洲va在线va天堂成人
|
日本一区不卡在线观看
|
91香蕉视频在线
|
草逼视频免费看
|
色婷婷激情五月
|
国产一级二级三级毛片
|
免费看黄色的网站
|
一区二区视频免费观看
|
久热久色
|
国产成人宗合
|
欧美日韩视频一区三区二区
|
激情文学图片
|
国产综合色香蕉精品五月婷
|
麻豆精品视频 在线视频
|
91精品免费在线观看
|
成人免费午夜视频
|
欧美一块操
|
日韩欧美视频一区二区三区
|
国产国语一级毛片在线视频
|
国产精品一区二区三区久久
|
国产人成在线视频
|
羞羞午夜爽爽爽爱爱爱爱
|
99久久免费国内精品
|
97香蕉久久夜色精品国产
|
扒丝袜basiwa影院首页
|
国产精品亚洲国产三区
|
六月婷婷网
|
青青草国产97免久久费观看
|
中文字幕亚洲高清综合
|
99re这里只有精品在线观看
|
伊人网欧美
|
久久久国产99久久国产一
|
日本高清在线视频www色下载
|
日韩免费观看
|
欧美在线视频免费播放
|
欧美日韩在线视频播放
|
亚洲日本一区二区三区
|
天天操免费视频
|
麻豆md国产在线观看
|
久久6精品
|