色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

串口驅(qū)動(dòng)框架剖析及性能提升

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 作者:RTThread物聯(lián)網(wǎng)操作 ? 2022-01-26 16:36 ? 次閱讀

前言:苦串口驅(qū)動(dòng)久矣!

現(xiàn)狀

串口驅(qū)動(dòng)三種工作模式:輪詢、中斷、DMA

輪詢模式占用 CPU 最高,但是實(shí)現(xiàn)也是最簡單的;DMA 占用 CPU 最少,實(shí)現(xiàn)也是最麻煩的;中斷模式居中。

原串口驅(qū)動(dòng)有以下幾個(gè)問題:

1、中斷模式,接收有緩存,發(fā)送沒緩存

2、中斷模式,讀操作是非阻塞的,沒有阻塞讀;寫操作因?yàn)闆]有緩存,只能阻塞寫,沒有非阻塞寫。

3、中斷接收過程,每往發(fā)送寄存器填充一個(gè)字符,就使用完成量等待發(fā)送完成中斷,通過完成量進(jìn)行進(jìn)程調(diào)度次數(shù)和發(fā)送數(shù)據(jù)量同樣多!

4、DMA 模式比較復(fù)雜,在實(shí)現(xiàn)上更復(fù)雜。

a.首先,接收有兩種緩存方案,一種沒有緩存,借用應(yīng)用層的內(nèi)存直接做 DMA 接收緩存;一種有緩存,用的和中斷模式下相同的 fifo 數(shù)據(jù)結(jié)構(gòu)。發(fā)送只有一種緩存方式,把應(yīng)用層內(nèi)存放到數(shù)據(jù)隊(duì)列里做發(fā)送緩存。

b.無論哪種緩存方案,都沒有考慮阻塞的問題。而是拋給串口驅(qū)動(dòng)一個(gè)內(nèi)存地址,就返回到應(yīng)用層了。應(yīng)用層要么動(dòng)用rt_device_set_rx_indicatert_device_set_tx_complete做同步——退化成 poll 模式,失去了 DMA 的優(yōu)勢;要么繼續(xù)干其它工作——拋給串口驅(qū)動(dòng)的內(nèi)存可能引入隱患。

c.為了防止 DMA 工作的時(shí)候又有新的讀寫需求。

對串口驅(qū)動(dòng)的期望

輪詢模式不在今天討論計(jì)劃內(nèi)。下面所有的討論都只涉及中斷和 DMA 兩種模式。

無論哪種工作模式,都應(yīng)該有至少一級緩存機(jī)制。

無論哪種工作模式,都應(yīng)該可以設(shè)置成阻塞或者非阻塞。

默認(rèn)是阻塞 io 模式;如果想用非阻塞工作模式,可以通過 open 或者 control 修改。

讀寫阻塞特性是同步的,不存在阻塞寫非阻塞讀或者非阻塞寫阻塞讀兩種模式。

阻塞讀的過程是,沒有數(shù)據(jù)永久阻塞;有數(shù)據(jù)無論多少(小于等于期望數(shù)據(jù)量),返回讀取的數(shù)據(jù)量。

阻塞寫的過程是,緩存空間為 0 阻塞等待緩存被釋放;緩存空間不足先填滿緩存,繼續(xù)等待緩存被釋放;緩存空間足夠,把應(yīng)用層數(shù)據(jù)拷貝到驅(qū)動(dòng)緩存。最后返回搬到緩存的數(shù)據(jù)量。

非阻塞讀的過程是,沒有數(shù)據(jù)返回 0;有數(shù)據(jù),從 fifo 拷貝數(shù)據(jù)到應(yīng)用層提供的內(nèi)存,返回拷貝的數(shù)據(jù)量。

非阻塞寫的過程是,緩存為 0 ,返回 0;緩存不足返回寫成功了多少數(shù)據(jù);緩存足夠,把數(shù)據(jù)搬移完,返回寫成功的數(shù)據(jù)量。

無論是輪詢、中斷、DMA 哪種模式,都應(yīng)該可以實(shí)現(xiàn) STREAM 特性。

中斷模式下的理論實(shí)踐

注:以下實(shí)現(xiàn)是在 NUC970 上完成的,有些特性可能不是通用的。例如,串口外設(shè)自帶硬件 fifo ,uart1 是高速 uart 設(shè)備,fifo 有 64 字節(jié)。uart3 的 fifo 就只有 16 字節(jié)。

定義緩存數(shù)據(jù)結(jié)構(gòu)

為實(shí)現(xiàn)上述需求,接收和發(fā)送都需要有如下一個(gè) fifo

 1structrt_serial_fifo
 2{
 3rt_uint32_tbuf_sz;
 4/*softwarefifobuffer*/
 5rt_uint8_t*buffer;
 6
 7rt_uint16_tput_index,get_index;
 8
 9rt_bool_tis_full;
10};

注:別問我為啥不用 ringbuffer

大部分還是借用struct rt_serial_rx_fifo的實(shí)現(xiàn)的。增加了個(gè)buf_sz由 fifo 自己維護(hù)自己的緩存容量

針對 fifo 特意定義了三個(gè)函數(shù),

rt_forceinline rt_size_t _serial_fifo_calc_data_len(struct rt_serial_fifo *fifo)計(jì)算 fifo 中寫入的數(shù)據(jù)量

rt_forceinline void _serial_fifo_push_data(struct rt_serial_fifo *fifo, rt_uint8_t ch)壓入一個(gè)數(shù)據(jù)(不完整實(shí)現(xiàn),具體見下文)

rt_forceinline rt_uint8_t _serial_fifo_pop_data(struct rt_serial_fifo *fifo)彈出一個(gè)數(shù)據(jù)(不完整實(shí)現(xiàn),具體見下文)

讀設(shè)備過程

讀設(shè)備對應(yīng)中斷接收。

 1rt_inlineint_serial_int_rx(structrt_serial_device*serial,rt_uint8_t*data,intlength)
 2{
 3rt_size_tlen,size;
 4structrt_serial_fifo*rx_fifo;
 5rt_base_tlevel;
 6
 7RT_ASSERT(serial!=RT_NULL);
 8
 9rx_fifo=(structrt_serial_fifo*)serial->serial_rx;
10RT_ASSERT(rx_fifo!=RT_NULL);
11
12/*disableinterrupt*/
13level=rt_hw_interrupt_disable();
14
15len=_serial_fifo_calc_data_len(rx_fifo);
16
17if((len==0)&&//non-blockingiomode
18(serial->parent.open_flag&RT_DEVICE_OFLAG_NONBLOCKING)==RT_DEVICE_OFLAG_NONBLOCKING){
19/*enableinterrupt*/
20rt_hw_interrupt_enable(level);
21return0;
22}
23if((len==0)&&//blockingiomode
24(serial->parent.open_flag&RT_DEVICE_OFLAG_NONBLOCKING)!=RT_DEVICE_OFLAG_NONBLOCKING){
25do{
26/*enableinterrupt*/
27rt_hw_interrupt_enable(level);
28
29rt_completion_wait(&(serial->completion_rx),RT_WAITING_FOREVER);
30
31/*disableinterrupt*/
32level=rt_hw_interrupt_disable();
33
34len=_serial_fifo_calc_data_len(rx_fifo);
35}while(len==0);
36}
37
38if(len>length){
39len=length;
40}
41
42/*readfromsoftwareFIFO*/
43for(size=0;size44{
45/*otherwisethere'sthedata:*/
46*data=_serial_fifo_pop_data(rx_fifo);
47data++;
48}
49
50rx_fifo->is_full=RT_FALSE;
51
52/*enableinterrupt*/
53rt_hw_interrupt_enable(level);
54
55returnsize;
56}

簡單說明就是:關(guān)中斷,計(jì)算緩存數(shù)據(jù)量,如果為空判斷是否需要阻塞。拷貝完數(shù)據(jù),開中斷。

這里需要注意的是,拷貝完數(shù)據(jù)后 fifo 必然不會(huì)是 full 的rx_fifo->is_full = RT_FALSE這句沒有加在_serial_fifo_pop_data函數(shù),所以上面說它的實(shí)現(xiàn)是不完整的。

寫設(shè)備過程

寫設(shè)備對應(yīng)中斷發(fā)送

 1rt_inlineint_serial_int_tx(structrt_serial_device*serial,constrt_uint8_t*data,intlength)
 2{
 3rt_size_tlen,length_t,size;
 4structrt_serial_fifo*tx_fifo;
 5rt_base_tlevel;
 6rt_uint8_tlast_char=0;
 7
 8RT_ASSERT(serial!=RT_NULL);
 9
10tx_fifo=(structrt_serial_fifo*)serial->serial_tx;
11RT_ASSERT(tx_fifo!=RT_NULL);
12
13size=0;
14do{
15length_t=length-size;
16/*disableinterrupt*/
17level=rt_hw_interrupt_disable();
18
19len=tx_fifo->buf_sz-_serial_fifo_calc_data_len(tx_fifo);
20
21if((len==0)&&//non-blockingiomode
22(serial->parent.open_flag&RT_DEVICE_OFLAG_NONBLOCKING)==RT_DEVICE_OFLAG_NONBLOCKING){
23/*enableinterrupt*/
24rt_hw_interrupt_enable(level);
25break;
26}
27
28if((len==0)&&//blockingiomode
29(serial->parent.open_flag&RT_DEVICE_OFLAG_NONBLOCKING)!=RT_DEVICE_OFLAG_NONBLOCKING){
30/*enableinterrupt*/
31rt_hw_interrupt_enable(level);
32
33rt_completion_wait(&(serial->completion_tx),RT_WAITING_FOREVER);
34
35continue;
36}
37
38if(len>length_t){
39len=length_t;
40}
41/*copytosoftwareFIFO*/
42while(len>0)
43{
44/*
45*tobepolitewithserialconsoleaddalinefeed
46*tothecarriagereturncharacter
47*/
48if(*data=='
'&&
49(serial->parent.open_flag&RT_DEVICE_FLAG_STREAM)==RT_DEVICE_FLAG_STREAM&&
50last_char!='
')
51{
52_serial_fifo_push_data(tx_fifo,'
');
53
54len--;
55if(len==0)break;
56last_char=0;
57}elseif(*data=='
'){
58last_char='
';
59}else{
60last_char=0;
61}
62
63_serial_fifo_push_data(tx_fifo,*data);
64
65data++;len--;size++;
66}
67
68/*ifthenextpositionisreadindex,discardthis'readchar'*/
69if(tx_fifo->put_index==tx_fifo->get_index)
70{
71tx_fifo->is_full=RT_TRUE;
72}
73
74//TODO:starttx
75serial->ops->start_tx(serial);
76
77/*enableinterrupt*/
78rt_hw_interrupt_enable(level);
79}while(size80
81returnsize;
82}

簡單說明就是:關(guān)中斷,計(jì)算 fifo 剩余容量,如果空間不足判斷是否阻塞。拷貝數(shù)據(jù),開中斷。

如果數(shù)據(jù)沒拷貝完,繼續(xù)上述過程,直到所有數(shù)據(jù)拷貝完成。

上述函數(shù)也實(shí)現(xiàn)了 STREAM 打開模式,檢查 “r”“n” 不完整的問題。

特別注意:上述函數(shù)并沒有執(zhí)行寫“發(fā)送寄存器”的操作,開中斷前,這里執(zhí)行了一句serial->ops->start_tx(serial)用于開啟發(fā)送過程(這個(gè)的實(shí)現(xiàn)可能在不同芯片上略有差異)。

中斷接收

 1while(1){
 2ch=serial->ops->getc(serial);
 3if(ch==-1)break;
 4
 5/*iffifoisfull,discardonebytefirst*/
 6if(rx_fifo->is_full==RT_TRUE){
 7rx_fifo->get_index+=1;
 8if(rx_fifo->get_index>=rx_fifo->buf_sz)rx_fifo->get_index=0;
 9}
10/*pushanewdata*/
11_serial_fifo_push_data(rx_fifo,ch);
12
13/*ifputindexequaltoreadindex,fifoisfull*/
14if(rx_fifo->put_index==rx_fifo->get_index)
15{
16rx_fifo->is_full=RT_TRUE;
17}
18}
19
20rt_completion_done(&(serial->completion_rx));

先計(jì)算是否還有數(shù)據(jù)要發(fā)送,如果沒有,調(diào)用serial->ops->stop_tx(serial)對應(yīng)上面的serial->ops->start_tx(serial)

因?yàn)橛布詭?fifo ,這里最多可以連續(xù)寫 64 個(gè)字節(jié)。

因?yàn)榘l(fā)送 fifo 是往外彈出數(shù)據(jù)的,最后肯定是非滿的。

未說明的問題

對于串口設(shè)備來講,接收是非預(yù)期的,所以串口接收中斷必須一直開著。發(fā)送就不一樣了,沒有發(fā)送數(shù)據(jù)的時(shí)候是可以不開發(fā)送中斷的。

上文中提到的兩個(gè)opsstart_txstop_tx正是開發(fā)送中斷使能,關(guān)發(fā)送中斷使能。另外,它倆還有更重要的作用。

在 NUC970 的設(shè)計(jì)上,只要發(fā)送寄存器為空就會(huì)有發(fā)送完成中斷,并不是發(fā)送完最后一個(gè)字節(jié)才產(chǎn)生。正因?yàn)檫@個(gè)特性,當(dāng)開發(fā)送中斷使能的時(shí)候會(huì)立馬進(jìn)入中斷。在中斷里判斷是否有數(shù)據(jù)要發(fā)送,剛好可以作為“啟動(dòng)發(fā)送”。

對于其它芯片,如果發(fā)送中斷的含義是“發(fā)送完最后一個(gè)字節(jié)”,僅僅使能發(fā)送中斷還不夠,還需要軟件觸發(fā)發(fā)送中斷。這是發(fā)送不同于接收的最重要的地方。

DMA 模式下的實(shí)現(xiàn)探討

為什么上一節(jié)叫實(shí)踐,這一節(jié)變成探討了?

第一,筆者還沒時(shí)間在 NUC970 上完成 DMA 的部分。

第二,有了上面中斷模式的鋪墊,DMA 模式也是輕車熟路。不覺得 NUC970 的硬件 fifo 就是 DMA 的翻版嗎?

DMA 模式需要二級緩存機(jī)制。第一級緩存和中斷模式用的 fifo 一樣。這樣 read write 兩個(gè)函數(shù)的實(shí)現(xiàn)可以是一樣的。

在此基礎(chǔ)上,增加一個(gè)數(shù)組。如下是完整串口設(shè)備定義:

 1structrt_serial_device
 2{
 3structrt_deviceparent;
 4
 5conststructrt_uart_ops*ops;
 6structserial_configureconfig;
 7
 8void*serial_rx;
 9void*serial_tx;
10
11rt_uint8_tserial_dma_rx[64];
12rt_uint8_tserial_dma_tx[64];
13
14cb_serial_tx_cb_tx;
15cb_serial_rx_cb_rx;
16
17structrt_completioncompletion_tx;
18structrt_completioncompletion_rx;
19};
20typedefstructrt_serial_devicert_serial_t;

這兩個(gè)數(shù)組作為 DMA 收發(fā)過程的緩存。

發(fā)送數(shù)據(jù)時(shí),從 serial_tx 的 fifo 拷貝數(shù)據(jù)到 serial_dma_tx ,啟動(dòng) DMA。發(fā)送完成后判斷 serial_tx 的 fifo 是否還有數(shù)據(jù),有數(shù)據(jù)繼續(xù)拷貝,直到 fifo 為空關(guān)閉 DMA 發(fā)送。

接收數(shù)據(jù)時(shí),在 DMA 中斷里拷貝serial_dma_rx所有數(shù)據(jù)到 serial_rx 的 fifo 。如果 DMA 中斷分完成一半中斷和全部傳輸完成兩種中斷。可以分成兩次中斷,每次只處理一半數(shù)據(jù),這樣每次往 fifo 倒騰數(shù)據(jù)的時(shí)候,還有一半緩沖區(qū)可用,也不至于會(huì)擔(dān)心倉促。

我們需要做的工作只有“怎么安全有效啟動(dòng) DMA 發(fā)送。

底層驅(qū)動(dòng)

以上都是串口設(shè)備驅(qū)動(dòng)框架部分,下面說說和芯片操作緊密相關(guān)的部分

init 函數(shù),負(fù)責(zé)注冊設(shè)備到設(shè)備樹。

configure 函數(shù),負(fù)責(zé)串口外設(shè)初始化,包括波特率、數(shù)據(jù)位、流控等等。還有個(gè)重要的工作就是調(diào)用引腳復(fù)用配置函數(shù)。

control 函數(shù),使能禁用收發(fā)等中斷。

putc 函數(shù),負(fù)責(zé)寫發(fā)送寄存器,寫寄存器前一定先判斷發(fā)送寄存器是否可寫是否為空,阻塞等。

getc 函數(shù),負(fù)責(zé)讀接收寄存器,讀寄存器前一定先判斷是否有有效數(shù)據(jù),如果沒有返回 -1。

start_tx 函數(shù),使能發(fā)送中斷,如果發(fā)送寄存器為空,觸發(fā)發(fā)送中斷。(如果芯片沒有這個(gè)特性,需要想辦法觸發(fā)發(fā)送完成中斷)

stop_tx 函數(shù),禁用發(fā)送中斷。

中斷回調(diào)函數(shù),負(fù)責(zé)處理中斷,根據(jù)中斷狀態(tài)調(diào)用rt_hw_serial_isr函數(shù)。

實(shí)機(jī)驗(yàn)證

中斷模式在 NUC970 芯片下經(jīng)過千萬級數(shù)據(jù)收發(fā)測試的考驗(yàn)。測試環(huán)境有如下兩種:

1、非阻塞 io;波特率 9600;串口調(diào)試工具:USR-TCP232 ,USR 出的調(diào)試工具。

串口調(diào)試工具定時(shí) 50ms 發(fā)送 30 個(gè)字符。NUC970 接收到數(shù)據(jù)后返回接收到的數(shù)據(jù)。

2、阻塞 io;波特率 115200;串口調(diào)試工具:USR-TCP232 ,USR 出的調(diào)試工具。

串口調(diào)試工具定時(shí) 10ms 發(fā)送 30 個(gè)字符。NUC970 接收到數(shù)據(jù)后返回接收到的數(shù)據(jù)。(串口調(diào)試助手發(fā)送了 200w 字節(jié)數(shù)據(jù),接收到了相同個(gè)數(shù)字符!)

0a6eb976-79ef-11ec-952b-dac502259ad0.png

結(jié)論

因?yàn)?NUC970 芯片的特殊性,上面雖說使用的是中斷模式,其實(shí)和 DMA 有點(diǎn)兒類似了。假如是沒收發(fā)一個(gè)字節(jié)數(shù)據(jù)各對應(yīng)一次中斷,中斷次數(shù)會(huì)比較多。

但是,在應(yīng)用層來看,無論是中斷還是 DMA 都是一樣的——要么阻塞,要么非阻塞。

原文標(biāo)題:RT-Thread驅(qū)動(dòng)篇之串口驅(qū)動(dòng)框架剖析及性能提升

文章出處:【微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10855

    瀏覽量

    211594
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1838

    瀏覽量

    85263
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1551

    瀏覽量

    76431

原文標(biāo)題:RT-Thread驅(qū)動(dòng)篇之串口驅(qū)動(dòng)框架剖析及性能提升

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Firefly支持AI引擎Tengine,性能提升,輕松搭建AI計(jì)算框架

    的計(jì)算圖表示。ARM專用AI引擎 Tengine支持了Firefly平臺,可以輕松搭建AI計(jì)算框架性能大幅度提升,助力AI開發(fā)。在Firefly-RK3399平臺上,安裝Tengine后,可以運(yùn)行
    發(fā)表于 08-13 15:58

    Spring框架的設(shè)計(jì)理念

    Spring作為現(xiàn)在最優(yōu)秀的框架之一,已被廣泛的使用,51CTO也曾經(jīng)針對Spring框架中的hqC應(yīng)用做過報(bào)道。本文將從另外一個(gè)視角試圖剖析出Spring框架的作者設(shè)計(jì)Spring
    發(fā)表于 07-15 08:17

    LiteOS通信模組教程04-深度剖析LiteOS的AT框架

    ,代碼量陡增暫且不說,編程的難度也是直接上升,所以,我們需要基于串口驅(qū)動(dòng),在保證數(shù)據(jù)被完整接收的前提之上,再根據(jù)AT命令通信的特點(diǎn),設(shè)計(jì)一層AT框架,專門負(fù)責(zé)解析數(shù)據(jù),提取有效信息。2. 剖析
    發(fā)表于 02-26 09:03

    如何提升EMC性能

    在電源模塊應(yīng)用中,EMC 設(shè)計(jì)往往是重中之重,因?yàn)殛P(guān)乎整個(gè)用戶產(chǎn)品的 EMC 性能。那么如何提升 EMC 性能呢?本文從電源模塊的設(shè)計(jì)與應(yīng)用角度為您解讀。EMC 測試又叫做電磁兼容,描述的是產(chǎn)品
    發(fā)表于 10-29 07:07

    如何提升基站性能

    如何提升基站性能
    發(fā)表于 05-26 06:33

    如何在串口波特率識別里提升i.MXRT代碼的執(zhí)行性能

    怎樣去識別SBL項(xiàng)目里ISP串口的高波特率呢?如何在串口波特率識別里提升i.MXRT代碼的執(zhí)行性能呢?
    發(fā)表于 11-09 07:48

    rt-thread驅(qū)動(dòng)資料下載

    驅(qū)動(dòng)框架剖析性能提升串口驅(qū)動(dòng)的期望輪詢模式不在今天
    發(fā)表于 03-24 15:37

    微軟發(fā)布開源框架驅(qū)動(dòng)程序模塊新框架

    為了方便開發(fā)人員為Windows編寫驅(qū)動(dòng)程序,微軟昨天發(fā)布了一個(gè)開源框架驅(qū)動(dòng)程序模塊框架(DMF)。這個(gè)新框架將允許開發(fā)人員編寫簡單和結(jié)構(gòu)化
    發(fā)表于 08-22 11:37 ?1134次閱讀

    全面剖析負(fù)極材料和電池性能關(guān)系

    全面剖析負(fù)極材料和電池性能關(guān)系
    的頭像 發(fā)表于 03-11 15:53 ?2414次閱讀
    全面<b class='flag-5'>剖析</b>負(fù)極材料和電池<b class='flag-5'>性能</b>關(guān)系

    深度剖析USB設(shè)備端驅(qū)動(dòng)框架

    Linux kernel 來說的,而非單一設(shè)備。從整體概括了USB主機(jī)端和設(shè)備端的通信框架。 Linux kernel 中早已集成了較為完善的USB協(xié)議棧,由于其規(guī)模龐大,包含多個(gè)類別的設(shè)備驅(qū)動(dòng),所以
    的頭像 發(fā)表于 06-07 14:12 ?3130次閱讀

    全面剖析電子管的性能

    全面剖析電子管的性能
    發(fā)表于 01-20 10:14 ?9次下載

    詳解Netty高性能異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)框架

    大家好,今天我們來聊聊Netty的那些事兒,我們都知道Netty是一個(gè)高性能異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)框架
    的頭像 發(fā)表于 03-16 10:57 ?1842次閱讀

    剖析單片機(jī)串口最底層的本質(zhì)?

    精華 | 剖析單片機(jī)串口最底層的本質(zhì)?
    的頭像 發(fā)表于 10-18 18:16 ?820次閱讀
    <b class='flag-5'>剖析</b>單片機(jī)<b class='flag-5'>串口</b>最底層的本質(zhì)?

    利用封裝、IC和GaN技術(shù)提升電機(jī)驅(qū)動(dòng)性能

    利用封裝、IC和GaN技術(shù)提升電機(jī)驅(qū)動(dòng)性能
    的頭像 發(fā)表于 11-23 16:21 ?576次閱讀
    利用封裝、IC和GaN技術(shù)<b class='flag-5'>提升</b>電機(jī)<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>性能</b>

    串口驅(qū)動(dòng)分析之serial driver

    前兩節(jié)我們介紹串口驅(qū)動(dòng)框架和tty core部分。這節(jié)我們介紹和硬件緊密相關(guān)的串口驅(qū)動(dòng)部分。
    的頭像 發(fā)表于 09-04 14:23 ?421次閱讀
    <b class='flag-5'>串口</b><b class='flag-5'>驅(qū)動(dòng)</b>分析之serial driver
    主站蜘蛛池模板: 99re8热视频这在线视频| www.久艹| 伦理片 qvod| 最新果冻传媒在线观看免费版| 久久精品国产eeuss| 在线成 人av影院| 久久久久久久久免费视频| 淫品色影院| 乱码中字在线观看一二区| 91热久久免费精品99| 女人张开腿让男人添| 不卡人妻无码AV中文系列APP| 日本漫画大全无翼乌| 国产成人久久婷婷精品流白浆| 午夜福利小视频400| 国产综合视频在线观看一区| 亚洲人成影院在线播放| 久久免费精品一区二区| 97超碰97资源在线观看| 欧美精品AV无码一区二区| 耻辱诊察室1一4集动漫在线观看| 日日射日日操| 国产色综合色产在线视频| 亚洲日韩一区精品射精| 噜噜噜在线AV免费观看看| japanesematur乱儿| 善良的小峓子2在钱中文版女主角| 国产精品一区二区20P| 亚洲欧美日韩一级特黄在线| 久久久久婷婷国产综合青草 | 国产伦精品一区二区三区免费| 羞羞答答影院在线| 久久高清内射无套| 99在线精品国自产拍不卡| 日韩视频在线观看| 国产在线精品亚洲第1页| 在线视频久久只有精品第一日韩| 男人扒开添女人下部口述| 抽插的日日液液H| 亚洲妈妈精品一区二区三区| 老师在讲桌下边h边讲课|