Linux v2.13.6内核GPIO控制器基础映射实现

版权申诉
0 下载量 110 浏览量 更新于2024-10-03 收藏 1KB RAR 举报
资源摘要信息:"scsi_tgt_priv.rar_V2" 该压缩文件包含的是Linux内核中针对基本内存映射GPIO控制器的驱动程序源代码文件。根据描述,文件内容围绕着Linux内核版本2.13.6,并且特别关注于内存映射通用输入输出(GPIO)控制器的基础设施。内存映射GPIO是一种硬件控制方式,允许处理器通过内存地址直接控制和访问GPIO引脚,从而实现对硬件设备的控制。 从文件名称来看,主要包含了两个文件:basic_mmio_gpio.c和scsi_tgt_priv.c。 1. basic_mmio_gpio.c文件: 此文件是与内存映射GPIO控制器基本操作相关的源代码文件。它可能包含了定义如何初始化GPIO控制器、如何配置GPIO引脚、如何读取和设置GPIO引脚状态等核心功能。内存映射GPIO控制器允许操作系统或驱动程序通过内存地址来直接访问硬件设备,这通常涉及到对特定硬件地址的读写操作。在这个文件中,开发者可以找到定义GPIO控制器工作模式(如输入、输出或双向)的代码,以及在内核中注册和注销GPIO控制器的逻辑。这个控制器的实现需要处理各种硬件细节,比如引脚的电气特性、边缘触发事件和中断处理等。 2. scsi_tgt_priv.c文件: 该文件涉及到了SCSI(小型计算机系统接口)目标设备(Target)的私有部分。SCSI是一种广泛应用的计算机总线协议,用于连接计算机和设备,如硬盘、打印机、扫描仪等。在这个上下文中,文件“scsi_tgt_priv.c”可能包含了为支持SCSI设备的内存映射GPIO控制器提供的特定功能,例如配置设备作为SCSI目标时,如何通过GPIO引脚来控制SCSI总线上的数据传输和状态指示。文件名中的"_tgt"可能表明文件内容主要关注于SCSI的Target模式,这是一种允许计算机系统表现为SCSI设备的角色,如硬盘阵列控制器。 文件中可能包含以下知识点: - 内存映射GPIO控制器的初始化和配置代码。 - 如何将GPIO引脚配置为输入或输出模式。 - 如何读取和设置GPIO引脚的电平状态。 - 如何处理GPIO引脚的中断事件和边缘触发情况。 - SCSI Target模式下的设备初始化和管理。 - SCSI设备的GPIO控制逻辑,包括SCSI总线的数据传输和状态控制。 - 如何在Linux内核中注册和注销GPIO控制器。 - 与特定硬件平台相关的GPIO驱动程序代码。 从标签“v2_”来看,这可能表示该版本的代码或文档是属于第二个版本迭代的,意味着之前可能已经存在过一个版本(v1),而v2则可能包含了改进或新增的功能。 由于具体的源代码没有提供,以上是对文件内容和结构的合理推测,旨在提供足够的背景信息和概念解释,使读者能够对“scsi_tgt_priv.rar_V2”压缩文件中可能包含的Linux内核源代码有更深入的理解。

class MSMDAERNet(nn.Module): def init(self, pretrained=False, number_of_source=15, number_of_category=4): super(MSMDAERNet, self).init() self.sharedNet = pretrained_CFE(pretrained=pretrained) # for i in range(1, number_of_source): # exec('self.DSFE' + str(i) + '=DSFE()') # exec('self.cls_fc_DSC' + str(i) + '=nn.Linear(32,' + str(number_of_category) + ')') for i in range(number_of_source): exec('self.DSFE' + str(i) + '=DSFE()') exec('self.cls_fc_DSC' + str(i) + '=nn.Linear(32,' + str(number_of_category) + ')') def forward(self, data_src, number_of_source, data_tgt=0, label_src=0, mark=0): ''' description: take one source data and the target data in every forward operation. the mmd loss is calculated between the source data and the target data (both after the DSFE) the discrepency loss is calculated between all the classifiers' results (test on the target data) the cls loss is calculated between the ground truth label and the prediction of the mark-th classifier 之所以target data每一条线都要过一遍是因为要计算discrepency loss, mmd和cls都只要mark-th那条线就行 param {type}: mark: int, the order of the current source data_src: take one source data each time number_of_source: int label_Src: corresponding label data_tgt: target data return {type} ''' mmd_loss = 0 disc_loss = 0 data_tgt_DSFE = [] if self.training == True: # common feature extractor data_src_CFE = self.sharedNet(data_src) data_tgt_CFE = self.sharedNet(data_tgt) # Each domian specific feature extractor # to extract the domain specific feature of target data for i in range(number_of_source): DSFE_name = 'self.DSFE' + str(i) data_tgt_DSFE_i = eval(DSFE_name)(data_tgt_CFE) data_tgt_DSFE.append(data_tgt_DSFE_i) # Use the specific feature extractor # to extract the source data, and calculate the mmd loss DSFE_name = 'self.DSFE' + str(mark) data_src_DSFE = eval(DSFE_name)(data_src_CFE) # mmd_loss += utils.mmd(data_src_DSFE, data_tgt_DSFE[mark]) mmd_loss += utils.mmd_linear(data_src_DSFE, data_tgt_DSFE[mark]) # discrepency loss for i in range(len(data_tgt_DSFE)): if i != mark: disc_loss += torch.mean(torch.abs( F.softmax(data_tgt_DSFE[mark], dim=1) - F.softmax(data_tgt_DSFE[i], dim=1) )) # domain specific classifier and cls_loss DSC_name = 'self.cls_fc_DSC' + str(mark) pred_src = eval(DSC_name)(data_src_DSFE) cls_loss = F.nll_loss(F.log_softmax( pred_src, dim=1), label_src.squeeze()) return cls_loss, mmd_loss, disc_loss中data_tgt_DSFE的长度

154 浏览量

// 定义描述子类型及相关变量 typedef pcl::SHOT352 Descriptor; typedef pcl::PointCloud<Descriptor> DescriptorCloud; DescriptorCloud::Ptr descriptors_src(new DescriptorCloud); DescriptorCloud::Ptr descriptors_tgt(new DescriptorCloud); // 计算匹配点对及其汉明距离 pcl::Correspondences all_correspondences; pcl::registration::CorrespondenceEstimation<Descriptor, Descriptor> est; est.setInputSource(descriptors_src); est.setInputTarget(descriptors_tgt); est.determineCorrespondences(all_correspondences); // 将汉明距离按照从小到大的顺序排序 std::sort(all_correspondences.begin(), all_correspondences.end(), [](const pcl::Correspondence& a, const pcl::Correspondence& b) { return a.distance < b.distance; }); // 设置误差阈值,将小于阈值的匹配点对作为正确匹配点 const float kErrorThreshold = 20.0f; pcl::Correspondences correspondences; for (const auto& correspondence : all_correspondences) { if (correspondence.distance > kErrorThreshold) { correspondences.push_back(correspondence); } } // 逐步滤除误匹配点 while (true) { if (correspondences.empty()) { break; } const auto& correspondence = correspondences.front(); correspondences.erase(correspondences.begin()); // 检查该匹配点对是否已经被删除 if (correspondence.index_query >= static_cast<int>(cloud_src->size()) || correspondence.index_match >= static_cast<int>(cloud_tgt->size())) { continue; } // 将正确匹配的点对从点云中删除 cloud_src->erase(cloud_src->begin() + correspondence.index_query); cloud_tgt->erase(cloud_tgt->begin() + correspondence.index_match); // 重新计算匹配点对 est.setInputSource(descriptors_src); est.setInputTarget(descriptors_tgt); correspondences.clear(); est.determineCorrespondences(correspondences); }

2023-05-31 上传