一、当FIFO存储的数据等于水线cfg_thd时,数据输出,此时的读使能为:

assign      rd_en = rdusedw >= cfg_thd && empty == 0;
//无论何时,读的第一条件是empty == 0,即FIFO不为空

二、状态切换,即不仅存在启动水线,也同时存在停止水线
要求: 当FIFO中存储的数据大于等于启动水线时发送数据,即发送状态;当数据个数小于停止水线时停止发送,即空闲状态
cfg_thd_0 :停止水线
cfg_thd_1 :启动水线
分析 : 很显然,次FIFO存在两个明显的状态,即:发送状态和空闲状态。 空闲状态下,rdusedw >= cfg_thd_1跳到发送状态;发送状态下,rdusedw < cfg_thd_0 跳到空闲状态下。用flag来标识,flag == 1是发送状态,flag == 0 是空闲状态。
flag信号的设计

always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginflag <= 0;endelse if(flag == 0 && rdusedw >= cfg_thd_1)beginflag <= 1;endelse if(flag == 1 && rdusedw < cfg_thd_0)beginflag <= 0;end
end

rd_en 信号设计

assign     rd_en = flag && empty == 0;     //发送状态下,FIFO内有数据就读出数据

三、收到eop或者存储的数据大于等于250个时开始发送数据(即FIFO开始读取),读取完一个完整的包文才开始传输下一个。
分析: 相比 【二】 来说,多了一个eop的条件,如果直接使用eop来作为读信号,那么在下一个报文较短时,会出现读数据的混乱。而此处隐藏了发送状态与空闲状态,在空闲状态下,接收到eop或者FIFO存储数据大于等于250开始发送,即进入发送状态;在发送状态下,发送完一整个包文时进入空闲状态。
由于读写隔离原则,使用信息FIFO来标识何时进行读取。
信息FIFO的wr_en和wdata设计

assign     wr_en = din_vld && din_eop;  //判断是否有一个完整的包文
assign     wdata = 1;                   //此情况不需要信息FIFO进行存储有效数据,故存储任意值均可

flag(空闲与发送指示)信号的设计


assign    rd_en = empty==0 && flag;
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginflag <= 0;endelse if(flag == 0 && (rdusedw >= 250 || msg_empty == 0))beginflag <= 1;endelse if(msg_rd)begin //msg_rd 为信息FIFO的读使能flag <= 0;end
end
assign     msg_rd = rd_en && q[8];  // q[8]为dout_eop  即在发送完一个包文时清掉信息FIFO总线上的值

四、多选一进行读写的FIFO
这里也要进行分类,看是选择如何输入和输出,是有完整包文输出还是只要达到选择条件就输出。
(一) 不需要完整包文输出,只要有数据就根据要求输出。
FIFO00有数据,就发FIFO00;FIFO00没有数据而FIFO01有数据,就发FIFO01;FIFO00和FIFO01没数据,而FIFO02有效,就发FIFO02数据。
由于不需要完整包文和其他附加条件,所以不需要信息FIFO
wr_en 和wdata

assign    wr_en0 = din_vld_a;
assign    wdata_a = din_a;
assign    wr_en1 = din_vld_b;
assign    wdata_b = din_b;
assign    wr_en2 = din_vld_c;
assign    wdata_c = din_c;

//读使能

assign      rd_0 = empty_a == 0;
assign      rd_1 = empty_a && empty_b == 0;
assign      rd_2 = empty_a && empty_b && empty_c == 0;

dout and chan

always @(posedge clk or negedge rst_n)beginif(rst_n==0)begindout <= 0;endelse if(rd_0)begindout <= q_0;endelse if(rd_1)begindout <= q_1;endelse if(rd_2)begindout <= q_2;end
end
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginchan <= 0;endelse if(rd_0)beginchan <= 0;endelse if(rd_1)beginchan <= 1;endelse if(rd_2)beginchan <= 2;end
end

(二) 完整包文输出,根据要求选择FIFO输出。(不需要存储完整包文后再选择发送)
选中一个通道时就把这个包文输出完整,即输出到eop再进行下一次选择。
是否选中信号work_flag构造


//注意,选中与不选中的条件
//选中一个通道时,就一直读数据,直到读出一个完整包文结束该选中状态
//选中的状态:在空闲时,即没选中时,任意一FIFO内有数据就输出,进入选中状态
//未选中状态:在选中状态时,该通道输出EOP,结束选中状态进入未选中状态
assign       work_flag_start = work_flag == 0 && (empty_0==0 || empty_1==0 || empty_2==0);
assign       work_flag_stop = work_flag &&  dout_eop_tmp;
assign       dout_eop_tmp = dout_0_tmp || dout_1_tmp || dout_2_tmp ;
/
always  @(posedge clk or negedge rst_n)beginif(rst_n==0)beginwork_flag <= 0;endelse if(work_flag_start)beginwork_flag <= 1;endelse if(work_flag_stop)beginwork_flag <= 0;end
end//选择哪个FIFO输出
//FIFO_0有数据时选中FIFO_0,直到FIFO_0输出EOP
//FIFO_0无数据而FIFO_1有数据时,选择FIFO_1数据,直到FIFO_1输出EOP结束选中状态
//FIFO_0和FIFO_1无数据而FIFO_2有数据时,选择FIFO_2输出,直到FIFO_2输出EOP结束选中状态
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginflag_sel <= 0;endelse if(work_flag_start)beginif(empty_0==0)beginflag_sel <= 0 ;endelse if(empty_1)beginflag_sel <= 1 ;endelse if(empty_2)beginflag_sel <= 2 ;endend
end
 FIFO的读信号设计
  assign        rd_en_0 = work_flag && flag_sel == 0 && empty_0 == 0;assign        rd_en_1 = work_flag && flag_sel == 1 && empty_1 == 0;assign        rd_en_2 = work_flag && flag_sel == 2 && empty_2 == 0;

(三) 完整包文输出,需要收到完整的包文后再进行选择FIFO输出。
选中一个通道时就把这个包文输出完整,即输出到eop再进行下一次选择。

 数据FIFO的写信号和写数据构造
assign     wr_en_0 = din_a_vld ;
assign     wdata_0 = {din_a_sop,din_a_eop,din_a}; assign     wr_en_1 = din_b_vld ;
assign     wdata_1 = {din_b_sop,din_b_eop,din_b}; assign     wr_en_2 = din_c_vld ;
assign     wdata_2 = {din_c_sop,din_c_eop,din_c};

信息FIFO构造(因为要在存储完一个完整包文时才选择输出,根据读写隔离原则,使用信息FIFO来标明读条件)

//输入一次完整的包文,即遇到din_a_eop/din_b_eop/din_c_eop 后将信息FIFO读使能拉高
assign       msg_wr_en_0 = din_a_vld && din_a_eop ;
assign       msg_wdata_0 = 1;assign       msg_wr_en_1 = din_b_vld && din_b_eop ;
assign       msg_wdata_1 = 1;assign       msg_wr_en_2 = din_c_vld && din_c_eop ;
assign       mag_wdata_2 = 1;

是否选中状态选择,与(二)中条件类似,但是不完全相同

//也是分为开始选择与结束选择
//开始选择条件为存储完完整包文时,FIFO0有数据则选择FIFO0;FIFO0无数据但FIFO1有数据则选择FIFO1;若只有FIFO2有数据,则选择FIFO2的数据输出assign    work_flag_start = work_flag == 0 && (msg_empty_0 == 0 || msg_empty_1 == 0 || msg_empty_2 == 0);
assign    work_flag_stop  = work_flag && dout_eop_tmp ;
assign    dout_eop_tmp    = q_a[8] && q_b[8] && q_c[8];always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginwork_flag <= 0;endelse if(work_flag_start)beginwork_flag <= 1;endelse if(work_flag_stop)beginwork_flag <= 0;end
endalways @(posedge clk or negedge rst_n)beginif(rst_n==0)beginflag_sel <= 0;endelse if(flag_work_start)beginif(msg_empty_0==0)beginflag_sel <= 0;endelse if(msg_empty_1)beginflag_sel <= 1;endelse if(msg_empty_2)beginflag_sel <= 2;endend
end

数据FIFO读使能以及信息FIFO读使能

//信息FIFO
//在发送完一个完整的包文时将总线上的数据清掉
assign       msg_rd_en_0 = dout_eop_a;
assign       msg_rd_en_1 = dout_eop_b;
assign       msg_rd_en_2 = dout_eop_c;assign      dout_eop_a = q_a[8] && rd_en_a;
assign      dout_eop_b = q_b[8] && rd_en_b;
assign      dout_eop_c = q_c[8] && rd_en_c;//数据FIFO的读使能assign     rd_en_0 = work_flag && flag_sel == 0 && empty_a == 0;
assign     rd_en_1 = work_flag && flag_sel == 1 && empty_b == 0;
assign     rd_en_2 = work_flag && flag_sel == 2 && empty_c == 0;

五、多通道数据FIFO选择输出,各个通道数据位不同,而输出的数据位相同
示例:
(一)

  • A通道是输入8bit数据 ,FIFO要求输出16bit
    B通道是输入16bit数据,FIFO要求输出16bit
    C通道是输入32bit数据,FIFO要求输出16bit
    不需要存入完整包文,只要有数据就读
  • 分析:因为输入都不一致,分别为8、16、32bit,而输出为16bit,那么显然,A通道进来的数据需要在计数器的作用下将两次数据合并成一个16bit的数据进行输出;B通道进来的数据可以直接按选择输出;C通道进来的数据是32bit,那么需要在计数器的处理下,使用两个时钟将32bit转换成16bit输出。

写侧数据处理
A通道数据处理

//计数两个A通道数据后写入FIFO,而当数据不是偶数时,即计数到din_a_eop或者2就清0计数器
always @(posedge clk or negedge rst_n)beginif(rst_n==0)begincnt0 <= 0;endelse if(add_cnt0)beginif(end_cnt0)begincnt0 <= 0;endelse begincnt0 <= cnt0 + 1'b1;endend
endassign    add_cnt0 = din_a_vld;
assign    end_cnt0 = add_cnt0 && (cnt0 == 2-1 || din_a_eop);//关于A通道的数据,SOP,EOP,MTY(无效数据数),VLD等信号的设计
//要分开设计,因为各个信号的条件不同
//wdata_0_data
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginwdata_0_data <= 0;endelse if(add_cnt0)beginwdata_0_data[15 - 8*cnt0 -:8] <= din_a;end
end
//wdata_0_sop
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginwdata_0_sop <= 0;endelse if(add_cnt0 && cnt0 == 1-1)beginwdata_0_sop <= din_a_sop;end
end//wdata_0_eop
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginwdata_0_eop <= 0;endelse if(end_cnt0)beginwdata_0_eop <= din_a_eop;end
end//wdata_0_mty
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginwdata_0_mty <= 0;endelse if(din_a_vld && din_a_eop)beginwdata_0_mty <= 1 - cnt;endelse beginwdata_0_mty <= 0;end
end
//wdata_0_en
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginwdata_0_en <= 0;endelse beginwdata_0_en <= end_cnt0;end
endassign   wdata_0 = {wdata_0_sop,wdata_0_eop,wdata_0_mty,wdata_0_data};//SOP,EOP,MTY,DIN[15:0]

B通道:

assign    wdata_1 = {wdata_1_sop,wdata_1_eop,wdata_1_mty,din_b};
assign    wr_en_1 = din_b_vld;

C通道:

//C通道是32bit,在此处直接存入FIFO,之后在读侧进行处理
//此处的数据FIFO宽度为32bit
assign       wdata_2 = {wdata_2_sop,wdata_2_eop,wdata_2_mty,din_c};
assign       wr_en_2 = din_c_vld;

通道选择

//work_flag_start :表示选中通道信号,在FIFO_A、FIFO_B、FIFO_C中有数据时选中信号拉高,开始输出数据
//work_flag_stop  :当输出该选中的FIFO包文的EOP时,结束选择状态
assign      work_flag_start = work_flag==0 && (empty_a == 0 || empty_b == 0 || empty_c == 0);
assign      work_flag_stop = work_flag && dout_eop_tmp;
assign      dout_eop_tmp =  rd_a_eop || rd_b_eop || rd_c_eop;
//选中状态时,FIFO处于工作状态,即发送状态
//结束选中状态时,FIFO处于空闲状态
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginwork_flag <= 0;endelse if(work_flag_start)beginwork_flag <= 1;endelse if(work_flag_stop)beginwork_flag <= 0;end
endalways @(posedge clk or negedge rst_n)beginif(rst_n==0)beginflag_sel <= 0;endelse if(flag_work_start)beginif(empty_a==0)beginflag_sel <= 0;endelse if(empty_b==0)beginflag_sel <= 1;endelse if(empty_c==0)beginflag_sel <= 2;endend
end 

读侧数据处理

assign    rd_en_a = flag_work && flag_sel == 0 && empty_a == 0;
assign    rd_en_b = flag_work && flag_sel == 1 && empty_b == 0;
assign    rd_en_c = flag_work && flag_sel == 2 && empty_c == 0;assign    rd_sop_a = rd_en_a  && q_a[18];
assign    rd_sop_b = rd_en_b  && q_b[18];
assign    rd_sop_c = add_cnt1 && cnt1 == 1-1 && q_c[35];assign    rd_a_eop = rd_en_a && q_a[17];
assign    rd_b_eop = rd_en_b && q_b[17];
assign    rd_c_eop = rd_en_c && q_c[34];assign    rd_mty_a = rd_en_a && q_a[16];
assign    rd_mty_b = rd_en_b && q_b[16];
assign    rd_mty_c = rd_en_c && q_c[32];//读侧计数器
//C通道要输出两次,FIFO才读一次
//此处使用变量法的原因是由于并不一定输出的32bit数据都有效
always @(posedge clk or negedge rst_n)beginif(rst_n==0)begincnt1 <= 0;endelse if(add_cnt1)beginif(end_cnt1)begincnt1 <= 0;endelse begincnt1 <= cnt1 + 1'b1;endend
endassign   add_cnt1 = flag_work && flag_sel == 2 && empty_c == 0;
assign   end_cnt1 = add_cnt1  && cnt1 == x - 1;always @(*)beginif(q_c[33])beginx = 2 - q_c[32];endelse beginx = 2;end
end//选择通道输出数据data_d
always @(posedge clk or negedge rst_n)beginif(rst_n==0)begindata_d <= 0;endelse if(rd_en_a)begindata_d <= q_a[15:0];endelse if(rd_en_b)begindata_d <= q_b[15:0];endelse if(rd_en_c)begindata_d <= q_c[31 - 16*cnt1 -:16];end
end
//dout_sop
always @(posedge clk or negedge rst_n)beginif(rst_n==0)begindout_sop <= 0;endelse begindout_sop <= rd_sop_a || rd_sop_b || rd_sop_c ;end
end//dout_eop
always @(posedge clk or negedge rst_n)beginif(rst_n==0)begindout_eop <= 0;endelse begindout_eop <= rd_eop_a || rd_eop_b || rd_eop_c ;end
end//dout_mty
always @(posedge clk or negedge rst_n)beginif(rst_n==0)begindout_mty <= 0;endelse begindout_mty <= rd_mty_a || rd_mty_b || rd_mty_c ;end
end//dout_vld
always @(posedge clk or negedge rst_n)beginif(rst_n==0)begindout_vld <= 0;endelse begindout_vld <= rd_en_a || rd_en_b || add_cnt1 ;end
end

(二)

  • 当FIFO_A中有完整的包文时,输出FIFO_A中的数据;
  • 当FIFO_A中没有数据或者没有完整的包文,而FIFO_B中有完整的包文数据时,选择FIFO_B输出;
  • FIFO_A、FIFO_B中没有完整包文而FIFO_C中有完整包文,选择FIFO_C输出。
  • A通道FIFO为8bit
  • B通道FIFO为16bit
  • C通道FIFO为32bit
  • 输出的位数为16bit

分析:8bit通道需要在计数器作用下计数两次输出一个16bit的数据;而B通道输出刚好为16bit,可以直接输出;C通道为32bit,在计数器作用下分两次输出16bit.
A通道数据写侧处理

//使用计数器控制,输入两次写一次
always @(posedge clk or negedge rst_n)beginif(rst_n==0)begincnt0 <= 0;endelse if(add_cnt1)beginif(end_cnt1)begincnt0 <= 0;endelse begincnt0 <= cnt0 + 1'b1;endend
end
assign   add_cnt0 = din_a_vld ;
assign   end_cnt0 = add_cnt0 && (cnt0 == 2-1 || din_a_eop);//wdata_a
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginwdata_a <= 0;endelse if(add_cnt0)beginwdata_a[15 -8*cnt0 -:8] <= din_a;end
end//wdata_a_sop
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginwdata_a_sop <= 0;endelse if(add_cnt0 && cnt0 == 1-1)beginwdata_a_sop <= din_a_sop;end
end
//wdata_a_eop
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginwdata_a_eop <= 0;endelse if(end_cnt0)beginwdata_a_eop <= din_a_eop;end
end
//wdata_a_mty
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginwdata_a_mty <= 0;endelse if(din_a_vld && din_a_eop)beginwdata_a_mty <= 1 - cnt0;endelse beginwdata_a_mty <= 0;end
end//计数两次写一次
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginwr_en_a <= 0;endelse beginwr_en_a <= end_cnt0;end
end
//存入FIFO的数据
assign   wdata_a_din = {wdata_a_sop,wdata_a_eop,wdata_a_mty,wdata_a};//信息FIFO
always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginmsg_wr_en_a <= 0;endelse beginmsg_wr_en_a <= din_a_vld && din_a_eop;end
end
//信息FIFO的数据可以任意存储,因为只是起到一个标识作用
assign    msg_wdata_a = 1;
//由于是根据时序进行数据拼写,为了保证时序的准确性,数据FIFO和信息FIFO的写使能都采用时序

B通道写侧数据处理

//数据FIFO
assign     wr_en_b = din_b_vld;
assign     wdata_b_din = {din_b_sop,din_b_eop,din_b_mty,din_b};
//信息FIFO
assign     msg_wr_en_b = din_b_vld && din_b_eop;
assign     msg_wdata_b = 1;

C通道写侧数据处理

//数据FIFO
assign     wr_en_c = din_c_vld;
assign     wdata_c_din = {din_c_sop,din_b_eop,din_c_mty,din_c};
//信息FIFO
assign     msg_wr_en_c = din_c_vld && din_c_eop;
assign     msg_wdata_c = 1;

工作状态和选择信号的构造

assign    work_flag_start = work_flag == 0 && (msg_empty_a == 0 || msg_empty_b == 0 || msg_empty_c == 0);
assign    work_flag_stop  = work_flag && dout_eop_tmp ;
assign    dout_eop_tmp    = dout_eop_tmp_a || dout_eop_tmp_b || dout_eop_tmp_c ;always @(posedge clk or negedge rst_n)beginif(rst_n==0)beginwork_flag <= 0;endelse if(work_flag_start)beginwork_flag <= 1'b1;endelse if(work_flag_stop)beginwork_flag <= 1'b0;end
endalways @(posedge clk or negedge rst_n)beginif(rst_n==0)beginflag_sel <= 0;endelse if(work_flag_start)beginif(msg_empty_a == 0)beginflag_sel <= 0;endelse if(msg_empty_b == 0)beginflag_sel <= 1;endelse if(msg_empty_c == 0)beginflag_sel <= 2;endend
end

读侧各个信号设计

//各个信息FIFO的读使能
assign     msg_rd_en_a = dout_eop_tmp_a && rd_en_a;
assign     msg_rd_en_b = dout_eop_tmp_b && rd_en_b;
assign     msg_rd_en_c = dout_eop_tmp_c && rd_en_c;assign     dout_eop_tmp_a = q_a[17];
assign     dout_eop_tmp_b = q_b[17];
assign     dout_eop_tmp_c = q_c[33];assign     dout_sop_tmp_a = q_a[18];
assign     dout_sop_tmp_b = q_b[18];
assign     dout_sop_tmp_c = add_cnt1 && cnt1 == 1-1 && q_c[34];assign     dout_mty_tmp_a = q_a[16];
assign     dout_mty_tmp_b = q_b[16];
assign     dout_mty_tmp_c = q_c[32];//数据FIFO的读使能
assign     rd_en_a = flag_work && flag_sel == 0 && empty_a == 0;
assign     rd_en_b = flag_work && flag_sel == 1 && empty_b == 0;
assign     rd_en_c = end_cnt1;//C通道将32bit数据分两次输出
always @(posedge clk or negedge rst_n)beginif(rst_n)begincnt1 <= 0;endelse if(add_cnt1)beginif(end_cnt1)begincnt1 <= 0;endelse begincnt1 <= cnt1 + 1'b1;endend
end
assign   add_cnt1 = flag_work && flag_sel == 2 && empty_c == 0;
assign   end_cnt1 = add_cnt1 && cnt1 == x - 1;always @(*)bgeinif(q_c[33])beginx = 2 - dout_mty_tmp_c;endelse beginx = 2;end
end// dout
always @(posedge clk or negedge rst_n)beginif(rst_n==0)begindata_d <= 0;endelse if(rd_en_a)begindata_d <= q_a[15:0];endelse if(rd_en_b)begindata_d <= q_b[15:0];endelse if(add_cnt1)begindata_d <= q_c[31 -16*cnt1 -:16];end
end
//dout_sop
always @(posedge clk or negedge rst_n)beginif(rst_n==0)begindout_sop <= 0;endelse begindout_sop <= dout_sop_tmp_a || dout_sop_tmp_b || dout_sop_tmp_c;end
end//dout_eop
always @(posedge clk or negedge rst_n)beginif(rst_n==0)begindout_eop <= 0;endelse begindout_eop <= dout_eop_tmp;end
end
//dout_mty
always @(posedge clk or negedge rst_n)beginif(rst_n==0)begindout_mty <= 0;endelse begindout_mty <= dout_mty_tmp_a || dout_mty_tmp_b || dout_mty_tmp_c;end
end
//dout_vld
always @(posedge clk or negedge rst_n)beginif(rst_n==0)begindout_vld <= 0;endelse begindout_vld <= rd_en_a || rd_en_b || add_cnt1;end
end

FIFO的发送条件总结相关推荐

  1. Linux先发送条件变量,浅谈Linux条件变量的使用

    Linux线程同步之间存在多种机制,条件变量是一种类似操作系统里提到的生产者-消费者算法的同步机制,允许线程以无竞争的方式等待特定条件的发生. 示例伪代码: void* Thread1(void){ ...

  2. Linux先发送条件变量,linux 条件变量 浅谈Linux条件变量的使用

    想了解浅谈Linux条件变量的使用的相关内容吗,在本文为您仔细讲解linux 条件变量的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:linux,条件变量,下面大家一起来学习吧. Linu ...

  3. 单片机串口发送数据很慢?这种方法帮助你提高!

    大家好,我是张巧龙,本文介绍如何使用带FIFO的串口来减少接收中断次数,通过一种自定义通讯协议格式,给出帧打包方法:之后介绍一种特殊的串口数据发送方法,可在避免使用串口发送中断的情况下,提高系统的响应 ...

  4. 串口驱动中使用FIFO

    FIFO是什么? FIFO( First Input First Output) 简单说就是指先进先出.它是一种数据存储或传输模式,可以硬件实现也可以软件实现,大多数用来缓存数据,减少操作次数,提高传 ...

  5. S3C2440串口FIFO模式的中断机制和处理策略

    转载于: https://blog.csdn.net/Stephen_yu/article/details/19199399 引言 基于S3C2440的串口非FIFO模式的应用文献多有介绍,但少有详细 ...

  6. Kafka Sender线程如何发送数据

    文章目录 1.内存缓冲中的Batch,如何被判定可发送出去 2.标识那些元数据未拉取成功的 3.检查筛选出来的Broker是否可以发送数据 3.1 元数据是否已经就位 3.2 是否可以发送请求 3.3 ...

  7. Linux多线程实践(8) --Posix条件变量解决生产者消费者问题

    Posix条件变量 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_co ...

  8. 拆解 Linux 网络包发送过程

    半年前我以源码的方式描述了网络包的接收过程.之后不断有粉丝提醒我还没聊发送过程呢.好,安排! 在开始今天的文章之前,我先来请大家思考几个小问题. 问1:我们在查看内核发送数据消耗的 CPU 时,是应该 ...

  9. 10没有基于策略的qos_WebRTC QoS | NACK 格式与发送策略

    本文是 WebRTC QoS 第 1 篇 导读 10.20.100.1000.10000 策略 1,10 次 策略 2,20 毫秒 策略 3,100 毫秒 策略 4,1000 个(丢失包数量) 策略 ...

  10. TMS320F28335的SCI通信-FIFO中断通信实验

    这两天在调28335的SCI通信,现在把实验过程跟大家分享:1.实验过程:通过串口调试助手1向DSP的SCIA接口发送一段代码,DSP接收到数据之后通过SCIB接口发送到串口软件2.同样串口软件通过S ...

最新文章

  1. 小白webpack进行nodejs 前端打包配置
  2. [T-ARA][그녀를 보면][看着那个女人的话]
  3. android实现电话功能实验报告,安卓开发实验报告-20210407005833.docx-原创力文档
  4. 2010全面兼容IE6/IE7/IE8/FF的CSS HACK写法
  5. mysql 主从一致性_mysql 主从一致性保证
  6. Python怎么学?一定要掌握学习方法
  7. excel操作练习_你见过最好的Excel教程有哪些?
  8. java 一切object_javaObject类
  9. 使用.NET Core 3进行Linux编程:第3章
  10. cds5516舵机控制程序_[电力世界]中的应用程序CDS
  11. python 广告分析算法_[Python]研究广告渠道的特征数据与结果数据的相关性, 并对渠道作出评分模型...
  12. AngularJS的 $resource服务 关于CRUD操作
  13. java.io读写文本
  14. 某大型银行某系统性能调优过程跟踪记录
  15. 百度网盘、迅雷下载.torrent种子文件
  16. mysql触发器更新前触发_mysql触发器实例:更新前触发
  17. C++ 获取鼠标点击位置
  18. POJO和po,vo,bo
  19. element table实现前端分页
  20. windows系统升级

热门文章

  1. css字竖排垂直居中显示,CSS--字体|垂直居中|background
  2. HTML中绑定点击事件的方式
  3. excel设置下拉菜单多选_如何设置多选Excel下拉菜单
  4. win10下移动pagefiles.sys文件到D盘
  5. php计算指数函数,指数函数运算法则公式有哪些
  6. 【Photoshop 教程系列第 3 篇】如何在 PS 中修改图片的分辨率和大小(一步一步详细说明)
  7. 联发科MTK工程模式(中文对照版本)和测试模式指令
  8. python爬取起点中文网_Python3爬取起点中文网阅读量信息,解决文字反爬~~~附源代码...
  9. 汇编 fsub ,fmul,fdiv,fild,CVTTPS2PI 指令
  10. 创建选区快捷键是什么_ps选区的快捷键是什么