当前位置: 首页 > news >正文

IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

目录

1 脚本名称

2 脚本路径

3 脚本参数说明

4 脚本操作说明

5 脚本代码


1 脚本名称

ccode_standard

2 脚本路径

/scripts/bin/ccode_standard

3 脚本参数说明

次序

参数名

说明

1

address

(./rfdig;.;..;./boot)

指定脚本执行路径(可以为脚本所在路径的任意相对路径)

help

脚本使用帮助,打印说明信息

2

all

运行脚本后,脚本会解析全部rbus.cfg,并对参数1指定的目录中的.c文件进行寄存器配置代码标准化修改

module_name_seca.cfg

运行脚本后,脚本会解析参数2指定的rbus.cfg,并对参数1指定的目录中的.c文件进行寄存器配置代码标准化修改

示例

命令:ccode_standard  help

输出ccode_standard使用帮助信息

命令:ccode_standard  ./rfdig  rfdig_seca.cfg

对当前路径下的rfdig文件夹及其子文件夹下所有的.c文件中,有关rfdig_seca.cfg中的寄存器配置代码进行标准化修改;

命令:ccode_standard  .  crg_seca.cfg

对当前路径下的所有文件夹及其子文件夹下的所有.c文件中,所有有关crg_seca.cfg中的寄存器配置代码进行标准化修改;

命令:ccode_standard  .  all

对当前路径下的所有文件夹及其子文件夹下的所有.c文件中,所有模块的寄存器配置代码进行标准化修改;

说明

配置文件module_name_seca.cfg是被验模块寄存器的详细配置文件;脚本索引该文件的具体路径为:

$PROJ_SRC/design/scripts/rbus_scripts/rbus_cfg/

使用该脚本前请先gen_rbus;

4 脚本操作说明

        该脚本用于将如下所示的代码标准化,加速ST用例调整,该脚本可以反复多次调用,不会产生异常问题:

  1. 使用脚本前,首先gen_rbus,source,产生脚本需要解析的rbus.cfg文件,以及环境变量$ENV{PROJ_SRC};
  2. 根据脚本存放路径,指定脚本工作目录,如下例所示,脚本存放于case目录,我想修改rfdig文件夹下的.c文件,参考rfdig_seca.cfg;执行:ccode_standard  ./rfdig  rfdig_seca.cfg  >  1.log
  3. 如图所示,脚本只替换了有关rfdig的寄存器,iomux,crg等没有替换:

  4. 如下例所示,脚本存放于case目录,我想修改rfdig/rfdig_tc017文件夹下的.c文件,参考所有rbus.cfg文件;
  5. 执行:ccode_standard  ./rfdig/rfdig_m33_tc017  all  >  1.log

  6. 如图所示,脚本不仅替换了有关rfdig的寄存器,iomux,crg等都有替换:

  7.  

5 脚本代码

#! /usr/bin/perl -w#==========================================================
# PERL MODULE 
#==========================================================use Cwd;
use File::Path;
use File::Find;#==========================================================
# PERL FUNCTION GetOptions (get command parameters)
#==========================================================
$g_work_dir  = $ARGV[0];
$g_seca_fl   = $ARGV[1];#our $work_dir  = 'rfdig_m33_tc017';#==========================================================
# SCRIPT MAIN  
#==========================================================our @seca_fl_list;
our @seca_name;
our @seca_type;
our @seca_width;
our @seca_init_value;
our @seca_with_field;
our @seca_field_list_bgn;
our @seca_field_list_end;
our @seca_field_name;
our @seca_field_width;
our @seca_field_bgn_idx;
our @seca_field_end_idx;our $ccode_standard_mark = 0;Main();sub RegMem{@seca_name           = ();@seca_type           = ();@seca_width          = ();@seca_init_value     = ();@seca_with_field     = ();@seca_field_list_bgn = ();@seca_field_list_end = ();@seca_field_name     = ();@seca_field_width    = ();@seca_field_bgn_idx  = ();@seca_field_end_idx  = ();if (open(SECA_ID,"$g_seca_fl") or die "cannot open $g_seca_fl, no such file") {@seca_array = <SECA_ID>;my $i       = 0;my $j       = 0;my $rbus_ok = 0;foreach $seca_line (@seca_array) {$seca_line =~ s/[\n\r]*//g;if ($seca_line =~ m/^\s*field_(\S+)\s+\[(\S+)\]\s*$/) {if($rbus_ok eq 1) {$seca_with_field[$i-1]     = 1 ;$seca_field_list_bgn[$i-1] = $j;$rbus_ok                   = 0 ;}$seca_field_list_end[$i-1] = $j;my $field_name_tmp   = "\L$1";my $field_name_size  = push(@seca_field_name ,$field_name_tmp);my $field_port_tmp   = $2;if ($field_port_tmp =~ m/(\d+):(\d+)/) {push(@seca_field_bgn_idx,int($2));push(@seca_field_end_idx,int($1));push(@seca_field_width,(int($1)-int($2)+1));} else {push(@seca_field_bgn_idx,int($field_port_tmp));push(@seca_field_end_idx,int($field_port_tmp));push(@seca_field_width,1);}#print ("seca_with_field[",$i-1,"]     = ",$seca_with_field[$i-1]     ,"\n");#print ("seca_field_list_bgn[",$i-1,"] = ",$seca_field_list_bgn[$i-1] ,"\n");#print ("seca_field_list_end[",$i-1,"] = ",$seca_field_list_end[$i-1] ,"\n");#print ("seca_field_name[",$j,"]       = ",$seca_field_name[$j]       ,"\n");#print ("seca_field_width[",$j,"]      = ",$seca_field_width[$j]      ,"\n");#print ("seca_field_bgn_idx[",$j,"]    = ",$seca_field_bgn_idx[$j]    ,"\n");#print ("seca_field_end_idx[",$j,"]    = ",$seca_field_end_idx[$j]    ,"\n");$j = $j + 1;}if ($seca_line =~ m/^\s*rbus_(\S+)\s+(\S+)\s+(\w+)\s+(\d+)('\w+)\s+(\S+)\s*$/) {#print ("before match string: ",$`,     "\n");#print ("match string       : ",$&,     "\n");#print ("after  match string: ",$',     "\n");#print ("seca_postfix       : ",$1,     "\n");#print ("seca_type          : ",$2,     "\n");#print ("seca_scope         : ",$3,     "\n");#print ("seca_width         : ",int($4),"\n");#print ("seca_init_value    : ",$5,     "\n");#print ("seca_prefix        : ",$6,     "\n");#print ("seca_name          : ","$6_$1","\n");$seca_name[$i]             = "\L$6_$1";$seca_type[$i]             = $2;$seca_width[$i]            = int($4);$seca_init_value[$i]       = $5;$seca_with_field[$i] = 0;$i = $i+1;$rbus_ok = 1;}}}
}sub GenMacroDefine{#print "c file is              : $_[0]\n";#print "c macro_define file is : $_[1]\n";$ccode_standard_mark = 0;open(ORIEN_FILE,">>$_[1]");if (open(SOURCE_FILE,"$_[0]")) {@context = <SOURCE_FILE>;foreach $line (@context) {for ( $i = 0; $i < @seca_name; $i = $i +1) {if ($seca_with_field[$i] eq 1) {if ($line =~ m/^\s*(\w+)\[($seca_name[$i])\]\s*=\s*0x(\w+)\s*;.*$/) {$ccode_standard_mark = 1;print ORIEN_FILE "\n"."//"."$line";my $seca_field_list_num  = $seca_field_list_end[$i] - $seca_field_list_bgn[$i] + 1;for ($j = 0; $j < $seca_field_list_num; $j = $j+1) {my $seca_field_width_tmp = $seca_field_width[$seca_field_list_bgn[$i]+$j];my $seca_field_name_tmp  = "$seca_name[$i]"."_"."$seca_field_name[$seca_field_list_bgn[$i]+$j]";my $seca_field_mask_tmp  = "$seca_field_name_tmp"."_mask ((1<<$seca_field_width[$seca_field_list_bgn[$i]+$j])-1)";my $seca_field_shift_tmp = "$seca_field_name_tmp"."_shift $seca_field_bgn_idx[$seca_field_list_bgn[$i]+$j]";my $seca_field_bit_tmp   = "$seca_field_name_tmp"."_bit (1<<$seca_field_bgn_idx[$seca_field_list_bgn[$i]+$j])";if($seca_field_width_tmp eq 1){print ORIEN_FILE "#define $seca_field_bit_tmp\n";} else {print ORIEN_FILE "#define $seca_field_mask_tmp\n";print ORIEN_FILE "#define $seca_field_shift_tmp\n";}}}}}}close SOURCE_FILE;}close ORIEN_FILE;system ("awk '!a[\$0]++' $_[1] > $_[1]_tmp \&\& mv -f $_[1]_tmp $_[1]");
}sub AddMacroDefine{#print "old c file is : $_[0]\n";#print "new c file is : $_[1]\n";#print "add   file is : $_[2]\n";my $add_ready = 0;open(ORIEN_FILE,">$_[1]");if (open(SOURCE_FILE,"$_[0]")) {@context = <SOURCE_FILE>;foreach $line (@context) {if($line =~ m/^#include \"$_[2]\"$/) {} else {print ORIEN_FILE "$line";}if ($add_ready eq 0) {if ($line =~ m/^\s*\#include\s*\"\S+_define.c\"\s*$/) {print ORIEN_FILE "\#include "."\"$_[2]\"\n";$add_ready = 1;}}}close SOURCE_FILE;}close ORIEN_FILE;
}sub GenSubContent{#print "old c file is : $_[0]\n";#print "new c file is : $_[1]\n";open(ORIEN_FILE,">>$_[1]");if (open(SOURCE_FILE,"$_[0]")) {@context = <SOURCE_FILE>;foreach $line (@context) {my $line_match = 0;for ( $i = 0; $i < @seca_name; $i = $i + 1) {if ($seca_with_field[$i] eq 1) {if ($line =~ m/^(\s*)(\w+\[$seca_name[$i]\])\s*=\s*0x(\w+)\s*;.*$/) {my $reg_value = hex($3);if ($reg_value != 0) {$line_match = 1;print ORIEN_FILE "//"."$line";my $seca_field_list_num = $seca_field_list_end[$i] - $seca_field_list_bgn[$i] + 1;for ($j = 0; $j < $seca_field_list_num; $j = $j+1) {my $seca_field_name_tmp    = "$seca_name[$i]"."_"."$seca_field_name[$seca_field_list_bgn[$i]+$j]";my $seca_field_mask_tmp    = "$seca_field_name_tmp"."_mask";my $seca_field_value       = (($reg_value) >> ($seca_field_bgn_idx[$seca_field_list_bgn[$i]+$j])) & ((1<<$seca_field_width[$seca_field_list_bgn[$i]+$j])-1);my $seca_field_width_tmp   = $seca_field_width[$seca_field_list_bgn[$i]+$j];my $seca_field_shift_tmp   = "$seca_field_name_tmp"."_shift";my $seca_field_bit_tmp     = "$seca_field_name_tmp"."_bit";#print ("seca_field_mask_value = ",((1<<$seca_field_width[$seca_field_list_bgn[$i]+$j])-1),";");#print ("reg_value = ",$reg_value,";");#print ("seca_field_value = $seca_field_value\n");if($j eq 0){if ($j eq ($seca_field_list_num - 1)) {if($seca_field_width_tmp eq 1) {printf ORIEN_FILE ("%s%-40s ((%-50s * 0x%-8x)    %-51s) ;\n","$1","$2 =","$seca_field_bit_tmp",$seca_field_value,"                     ");} else {printf ORIEN_FILE ("%s%-40s ((%-50s & 0x%-8x) << %-51s) ;\n","$1","$2 =","$seca_field_mask_tmp",$seca_field_value,"$seca_field_shift_tmp");}} else {if($seca_field_width_tmp eq 1) {printf ORIEN_FILE ("%s%-40s ((%-50s * 0x%-8x)    %-51s) |\n","$1","$2 =","$seca_field_bit_tmp",$seca_field_value,"                     ");} else {printf ORIEN_FILE ("%s%-40s ((%-50s & 0x%-8x) << %-51s) |\n","$1","$2 =","$seca_field_mask_tmp",$seca_field_value,"$seca_field_shift_tmp");}}} elsif($j eq ($seca_field_list_num - 1)) {                                                                                              if($seca_field_width_tmp eq 1) {printf ORIEN_FILE ("%s%-40s ((%-50s * 0x%-8x)    %-51s) ;\n","$1","    ","$seca_field_bit_tmp",$seca_field_value,"                     ");} else {printf ORIEN_FILE ("%s%-40s ((%-50s & 0x%-8x) << %-51s) ;\n","$1","    ","$seca_field_mask_tmp",$seca_field_value,"$seca_field_shift_tmp");}} else {                                                                                                                                 if($seca_field_width_tmp eq 1) {printf ORIEN_FILE ("%s%-40s ((%-50s * 0x%-8x)    %-51s) |\n","$1","    ","$seca_field_bit_tmp",$seca_field_value,"                     ");} else {printf ORIEN_FILE ("%s%-40s ((%-50s & 0x%-8x) << %-51s) |\n","$1","    ","$seca_field_mask_tmp",$seca_field_value,"$seca_field_shift_tmp");}}}}}}}if ($line_match eq 0) {print ORIEN_FILE "$line";}}close SOURCE_FILE;}close ORIEN_FILE;
}sub CopyFile{#print "source file name is $_[0]\n";#print "orien  file name is $_[1]\n";open(ORIEN_FILE,">$_[1]");if (open(SOURCE_FILE,"$_[0]")) {@context = <SOURCE_FILE>;foreach $line (@context) {print ORIEN_FILE "$line";}close SOURCE_FILE;}close ORIEN_FILE;
}sub FindConfigFile{if (-f $File::Find::name) {if ($_ =~ m/^(\w+_sec[a-z]\.cfg)$/) {#print "find file is $1 \n";push(@seca_fl_list,$1); }}
}sub FindWanted{if (-f $File::Find::name) {if ($_ =~ m/(\S+)\.c$/) {print "process file: $File::Find::name \n";GenMacroDefine("$_","$1"."_macro_define.h");unlink "$1"."_macro_define.h";if($ccode_standard_mark eq 1) {unlink "$_".".tmp";GenSubContent("$_","$_".".tmp");#AddMacroDefine("$_".".tmp","$_","$1"."_macro_define.h");system ("mv -f $_.tmp $_");unlink "$_".".tmp";}}}
}sub Main{my $cur_dir  = getcwd;my $proj_src = $ENV{PROJ_SRC};my $seca_dir = "$ENV{PROJ_SRC}/design/scripts/rbus_scripts/rbus_cfg/";if($g_seca_fl eq "all") {chdir($seca_dir) or die "$seca_dir was not found!!! please gen_rbus firstly.";find(\&FindConfigFile,"$seca_dir");} else {push(@seca_fl_list,$g_seca_fl);}#for ($i = 0; $i < @seca_fl_list; $i = $i+1) {#    print "seca_fl_list[$i] = $seca_fl_list[$i] \n";#}for ($z = 0; $z < @seca_fl_list; $z = $z + 1) {print "read config_file : $seca_fl_list[$z]\n";$g_seca_fl = "$seca_dir"."$seca_fl_list[$z]";RegMem();chdir($cur_dir) or die "$cur_dir does not exist!!!";find(\&FindWanted,"$cur_dir/$g_work_dir");}
}

相关文章:

IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 1 脚本名称 ccode_standard 2 脚本路径 /scripts/bin/ccode_standard 3 脚本参数说明 次序 参数名 说明 1 address (./rfdig&#xff1b;.&#xff1b;..&#xff1b;./boot) 指定脚本执行路…...

Qt单个字符判断

1.相关说明 字符的Unicode编码、单个字符的判断 2.界面绘制 3.相关主要代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui;…...

通过OpenIddict设计一个授权服务器02-创建asp.net项目

在这一部分中&#xff0c;我们将创建一个ASPNET核心项目&#xff0c;作为我们授权服务器的最低设置。我们将使用MVC来提供页面&#xff0c;并将身份验证添加到项目中&#xff0c;包括一个基本的登录表单。 创建一个空的asp.net core项目 正如前一篇文章中所说&#xff0c;授权…...

2.6、云负载均衡产品详述

一、定义 弹性负载均衡(Elastic Load Balance&#xff0c;简称ELB)可将来自公网的访问流量分发到后端云主机&#xff0c;可选多种负载均衡策略&#xff0c;并支持自动检测云主机健康状况&#xff0c;消除单点故障&#xff0c;保障应用系统的高可用。 二、产品架构 1&am…...

黑马程序员 Docker笔记

本篇学习笔记文档对应B站视频&#xff1a; 同学们&#xff0c;在前两天我们学习了Linux操作系统的常见命令以及如何在Linux上部署一个单体项目。大家想一想自己最大的感受是什么&#xff1f; 我相信&#xff0c;除了个别天赋异禀的同学以外&#xff0c;大多数同学都会有相同的…...

游戏素材永不缺,免费在线AI工具Scenario功能齐全,简单易用

Scenario是一个在线的AI驱动的工具&#xff0c;主要用于游戏艺术创作。它提供了一套全面的功能&#xff0c;旨在帮助游戏开发者创建与其独特风格和艺术方向相符的独特、高质量的游戏艺术。Scenario的突出特点之一是它的微调能力&#xff0c;允许用户根据独特的风格和艺术方向训…...

ChatGPT和文心一言哪个好用?

#ChatGPT 和文心一言哪个更好用&#xff1f;# 在当今信息爆炸的时代&#xff0c;人们对于文本生成和创作工具的需求越来越高。在这个背景下&#xff0c;ChatGPT和文心一言作为备受瞩目的工具&#xff0c;各自拥有独特的功能和用途。在本文中&#xff0c;我们将深入探讨这两个工…...

纯c++简易的迷宫小游戏

一个用c写的黑框框迷宫 适合新手入门学习 也适合大学生小作业 下面附上代码 总体思路 初始化游戏界面&#xff1a;设置迷宫的大小&#xff08;WIDTH和HEIGH&#xff09;&#xff0c;生成迷宫地图&#xff08;map&#xff09;&#xff0c;包括墙壁、空地、起点和终点。显示…...

基于python舆情分析可视化系统+情感分析+爬虫+机器学习(源码)✅

大数据毕业设计&#xff1a;Python招聘数据采集分析可视化系统✅ 毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&…...

2024年1月16日Arxiv热门NLP大模型论文:Multi-Candidate Speculative Decoding

大幅提速NLP任务&#xff0c;无需牺牲准确性&#xff01;南京大学提出新算法&#xff0c;大幅提升AI文本生成效率飞跃 引言&#xff1a;探索大型语言模型的高效文本生成 在自然语言处理&#xff08;NLP&#xff09;的领域中&#xff0c;大型语言模型&#xff08;LLMs&#xf…...

AI对决:ChatGPT与文心一言的比较

文章目录 引言ChatGPT与文心一言的比较Chatgpt的看法文心一言的看法Copilot的观点chatgpt4.0的回答 模型的自我评价自我评价 ChatGPT的优势在这里插入图片描述 文心一言的优势AI技术发展趋势总结 引言 在过去的几年里&#xff0c;人工智能&#xff08;AI&#xff09;技术取得了…...

uni-app引用矢量库图标

矢量库引用 导入黑色图标 1.生成连接&#xff0c;下载样式 2.导入项目&#xff08;字体样式&#xff09; 3.引入css样式 4.替换font-face 5.使用图标&#xff08;字体图标&#xff0c;只有黑色&#xff09; 导入彩色图标 1.安装插件 npm install -g iconfont-tools2.…...

Android的setContentView流程

一.Activity里面的mWindow是啥 在ActivityThread的performLaunchActivity方法里面&#xff1a; private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {ActivityInfo aInfo r.activityInfo;if (r.packageInfo null) {r.packageInfo getP…...

【加速排坑】docker设置国内image镜像源

第零步&#xff0c;查看阿里最新的镜像源&#xff1a;https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 第一步&#xff1a;在/etc/docker/daemon.json中添加镜像源 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-m…...

el-table嵌套两层el-dropdown-menu导致样式错乱

问题&#xff1a; 解决方式&#xff1a; <el-table-column label"操作" fixed"right" width"132" align"center"><template slot-scope"scope"><div v-if"scope.row._index ! 合计"><el-d…...

自动化测试:fixture学得好,Pytest测试框架用到老

在pytest中&#xff0c;fixture是一种非常有用的特性&#xff0c;它允许我们在测试函数中注入数据或状态&#xff0c;以便进行测试。而参数化则是fixture的一个特性&#xff0c;它允许我们将不同的数据传递给fixture&#xff0c;从而进行多次测试。 本文将介绍如何在pytest中使…...

Linux上常用网络操作

主机名配置 hostname 查看主机名 hostname xxx 修改主机名 重启后无效 如果想要永久生效&#xff0c;可以修改/etc/sysconfig/network文件 IP地址配置 ifconfig 查看(修改)ip地址(重启后无效) ifconfig eth0 192.168.12.22 修改ip地址 如果想要永久生效,修改 /etc/sysco…...

POI:对Excel的基本读操作 整理2

1 简单读取操作 public class ExcelRead {String PATH "D:\\Idea-projects\\POI\\POI_projects";// 读取的一系列方法// ...... } 因为07版本和03版本操作流程大差不差&#xff0c;所以这边就以03版本为例 Testpublic void testRead03() throws IOException {//获取…...

LeetCode每周五题_2024/01/15~01/19

文章目录 82. 删除排序链表中的重复元素 II题目题解 2744. 最大字符串配对数目题目题解 82. 删除排序链表中的重复元素 II 82. 删除排序链表中的重复元素 II 题目 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字…...

免费chartGPT网站汇总

https://s.suolj.com - &#xff08;支持文心、科大讯飞、智谱等国内大语言模型&#xff0c;Midjourney绘画、语音对讲、聊天插件&#xff09;国内可以直连&#xff0c;响应速度很快 很稳定 https://seboai.github.io - 国内可以直连&#xff0c;响应速度很快 很稳定 http://gp…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...