概述
基站侧线程池
如图所示,上面为时间线,下面为基站线程池流程,在线程池始化中会启动多个线程执行while()循环并阻塞,等待信号激活。基站侧主要有四个线程,每个slot都会严格顺序的执行这四个线程ru_thread,rx_func,tx_func,tx_ru。但不同slot间的线程执行可能并行,比如slot0的tx_ru线程在slot0的0.5ms时间内没有执行完,在slot1的开始会和slot1的ru_thread线程并行执行。每个线程都有相应的任务队列fifo维护(本质上为列表)。
在每个slot开始会将ru_thread线程push到任务队列中,如果此时有闲置阻塞的线程就会拿到ru_thread任务并执行,并记录任务开始时间starttime。在ru_thread线程中首先调用uhd驱动的接口读取采集到的时域样点信号,做fft变换prach等操作,最后从rxfifo任务队列中pull拉下一个任务并记录ru_thread任务结束时间endtime,将拉下的rx_func函数push到线程池中执行。同理在rx_func线程执行的最后会将tx_func线程push到线程池中,tx_func最后将tx_ru线程push到线程池中。
上面提到的push是将任务push到线程池的任务列表incomingfifo中,线程会调用onethread函数执行列表中的任务。
多线程架构改进
改进后线程流程相对基站复杂一些,实现了真正的单slot并行执行(不过目前代码还有bug没有解决,默认多线程关闭,即NR_RX_NB_TH = 1),单slot最多并行执行4个线程,分别为上一个slot的收和发线程、当前slot的收和发线程。
在开始初始化时,会将三个任务放入freeblocks任务列表中,每个任务和nf列表绑定,即任务执行完会push到nf列表中,图中虚线圆圈为当nbslotprocessing大于等于2时才会执行,nbslotprocessing初始值为0,每执行完一次任务会加1。第一次循环会从freeblocks中拉取一个任务msgtopush,直接将msgtopush任务push到线程池中执行,nbslotprocessing++为1,第二次循环同样,nbslotprocessing++为2,前两次循环执行的任务在执行结束后会自动将任务push到nf列表中。第三次循环会将freeblocks的最后一个任务拉取下来,且虚线圆圈满足条件执行,将取nf列表中的一个任务放入freeblocks中,然后执行刚刚从freeblocks中取出的任务,执行结束后nbslotprocessing++。以后每次循环执行流程:从freeblocks取出一个任务,从nf中取出一个任务放入freeblocks中,执行freeblocks中取出的任务,该任务执行完成后push到nf中。
该流程最多两线程并行执行,因为如果某次循环中对nf列表执行pull操作时阻塞,代表前两个任务都没有执行完毕。
这样每一个任务中实现了接收和发送并行执行,其中也用到了线程池,不在展开表述。
最后
以上就是神勇秀发为你收集整理的5G-OAI线程池工作原理及改进的全部内容,希望文章能够帮你解决5G-OAI线程池工作原理及改进所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复