【OpenAirInterface5g】高层模块接口及itti实体线程创建

发布时间:2026/7/24 22:59:54
【OpenAirInterface5g】高层模块接口及itti实体线程创建 目录OAI高层结构ITTI实体线程创建实体创建线程创建线程退出实体属性OAI高层结构OAI L3主要分为RRCNGAPSCTP三部分RRC负责无线资源管理负责让gNB与UE建立连接以及信令编解码。NGAP负责gNB与AMF建立连接进行信令NGAP编解码并转发。SCTP类似于TCP提供可靠的网络传输负责AMF与gNB之间NGAP消息发送和接收。在各模块之间OAI使用了ITTI公共管理模块来负责规范实体管理线程管理队列管理内存管理等保证了各模块在资源使用上的规范性。高层模块传输接口OAI主程序分别调用itti_create_task()创建RRC、NGAP、SCTP以及PDCP主线程线程创建时可进行CPU内核绑定当前OAI程序未启用核绑定。线程创建后在各模块内使用while(1)循环调用 itti_receive_msg()从本模块消息队列中取数据解码后按流程处理发送消息时调用iiti_send_msg_to_task()将数据压入目标模块的队列。SCTP与AMF之间以SCTP连接进行消息收发。ITTI实体线程创建实体创建实体创建实际就是OAI各模块task对象的创建以及相应的线程创建每个模块一般为一个主线程以及包含可能存在的辅助线程。线程内while()循环保证了实体始终处于运行状态这一点属于常规方法。intitti_create_task(task_id_ttask_id,void*(*start_routine)(void*),void*args_p){task_list_t*ttasks[task_id];threadCreate(t-thread,start_routine,args_p,(char*)itti_get_task_name(task_id),-1,OAI_PRIORITY_RT);LOG_I(TMR,Created Posix thread %s\n,itti_get_task_name(task_id));return0;}main调用itti_create_task函数来创建实体其中task_id模块实体ID如TASK_RRC_GNBstart_routine创建的线程函数名args_p传递的参数OAI里均为NULL代码中的tasks数组为各个实体的集合包含了每个实体公共属性方便随时取用。threadCreate函数负责线程创建线程创建线程创建流程如下创建步骤见注释voidthreadCreate(pthread_t*t,void*(*func)(void*),void*param,char*name,intaffinity,intpriority){pthread_attr_tattr;intret;intsettingPriority1;//初始化线程对象的属性retpthread_attr_init(attr);AssertFatal(ret0,ret: %d, errno: %d\n,ret,errno);//设置线程为分离状态retpthread_attr_setdetachstate(attr,PTHREAD_CREATE_DETACHED);AssertFatal(ret0,ret: %d, errno: %d\n,ret,errno);//设置线程不继承父线程的调度策略retpthread_attr_setinheritsched(attr,PTHREAD_EXPLICIT_SCHED);AssertFatal(ret0,ret: %d, errno: %d\n,ret,errno);if(checkIfFedoraDistribution())if(checkIfGenericKernelOnFedora())if(checkIfInsideContainer())settingPriority0;/*SCHED_OAI其宏定义为#define SCHED_OAI SCHED_RR即线程采用轮询式调度 各模块可以根据需要确定自己的优先级*/if(settingPriority){retpthread_attr_setschedpolicy(attr,SCHED_OAI);AssertFatal(ret0,ret: %d, errno: %d\n,ret,errno);if(prioritysched_get_priority_min(SCHED_OAI)||prioritysched_get_priority_max(SCHED_FIFO)){LOG_E(TMR,Prio not possible: %d, min is %d, max: %d, forced in the range\n,priority,sched_get_priority_min(SCHED_OAI),sched_get_priority_max(SCHED_OAI));if(prioritysched_get_priority_min(SCHED_OAI))prioritysched_get_priority_min(SCHED_OAI);if(prioritysched_get_priority_max(SCHED_OAI))prioritysched_get_priority_max(SCHED_OAI);}AssertFatal(prioritysched_get_priority_max(SCHED_OAI),);structsched_paramsparam{0};sparam.sched_prioritypriority;//设置线程优先级retpthread_attr_setschedparam(attr,sparam);AssertFatal(ret0,ret: %d, errno: %d\n,ret,errno);}//利用前面设置的属性变量创建线程retpthread_create(t,attr,func,param);AssertFatal(ret0,ret: %d, errno: %d\n,ret,errno);//设置线程名pthread_setname_np(*t,name);if(affinity!-1){cpu_set_tcpuset;CPU_ZERO(cpuset);CPU_SET(affinity,cpuset);AssertFatal(pthread_setaffinity_np(*t,sizeof(cpu_set_t),cpuset)0,Error setting processor affinity);}//销毁线程属性变量pthread_attr_destroy(attr);}线程退出负责退出当前线程常规函数。voiditti_exit_task(void){pthread_exit(NULL);}实体属性实体属性定义如下typedefstructtask_list_s{task_info_tadmin;pthread_tthread;pthread_mutex_tqueue_cond_lock;std::vectorMessageDef*message_queue;std::maplong,timer_elm_ttimer_map;uint64_tnext_timerUINT64_MAX;structepoll_event*eventsNULL;intnb_fd_epoll0;intnb_events0;intepoll_fd-1;intsem_fd-1;}task_list_t;admin实体信息包括调度优先级队列长度实体名称线程函数thread线程IDqueue_cond_lock队列锁message_queue消息队列每个模块均有自己的消息队列负责存储其他模块发送过来的消息timer_map定时器next_timer到期时间