【T690 之十一】基于方寸EVB2开发板,结合 Eclipse+gdb+gdbserver 调试 CCAT 的流程总结

目录

  • 1. 准备工作
    • 1.1 Eclipse
    • 1.2 工程编译
    • 1.3 烧写固件
  • 2. 创建工程
    • 2.1 搭建调试工程
    • 2.2 配置Dbug调试信息
  • 3. 调试
  • 4. 手动调试过程
  • 4. 总结

备注:
1,假设您已对方寸微电子的T690系列芯片的使用方式都有了一定的了解,可以根据此文的配置进行Linux用户态代码的调试;
2,若您对方寸微电子的T690芯片不了解,但想进一步了解它,那您可以在gitee上获取相关资料,gitee的网址为:https://gitee.com/tihchip;
3,本文中关于gdb、gdbserver的使用方式都是通用的,不仅局限于调试基于T690的工程,希望该文章能对您起到积极的作用;

1. 准备工作

1.1 Eclipse

本文中使用的Eclipse为芯来的 NucleiStudio_IDE_202212,关于Eclipse安装方式不在此累述。
下载地址:https://www.nucleisys.com/download.php
在这里插入图片描述

1.2 工程编译

  对于一个全新的测试的话,需要编译一个全新的文件系统(rootfs),在编译文件系统时已经默认编译了 OpenSBI、U-Boot、Kernel、OpenSSL、CCAT-Engine、CCAT等,但是为了更好的了解使用这些工程,也可以独自编译它们。
  下面采用 yocto 的方式编译文件系统等。

  1. 编译文件系统(rootfs)

注:在编译文件系统之前,必须首先修改U-Boot 及 Kernel 的配置项,参考章节 “编译U-Boot” 及 “编译Kernel” 中的说明

root@t690mp-evb2-va: MACHINE=t690mp-evb2-va bitbake tih-full-cli-debug-image -c cleanall
root@t690mp-evb2-va: MACHINE=t690mp-evb2-va bitbake tih-full-cli-debug-image
root@t690mp-evb2-va: mkdir /share/samba/public/shared/jack/rootfs_gmssl
root@t690mp-evb2-va: cp /localhdd/jack/tmp-glibc/deploy/images/t690mp-evb2-va/tih-full-cli-debug-image-t690mp-evb2-va.tar.gz /share/samba/public/shared/jack/rootfs_gmssl
root@t690mp-evb2-va: cd /share/samba/public/shared/jack/rootfs_gmssl
root@t690mp-evb2-va: tar -vxzf tih-full-cli-debug-image-t690mp-evb2-va.tar.gz

(1)tih-full-cli-debug-image :表示编译带有调试信息的文件系统,tih-full-cli-image表示编译不带调试信息的文件系统。我们进行gdb调试时,需要编译带有调试信息的文件系统;
(2)在 /share/samba/public/shared/jack/ 目录下创建一个名为 rootfs_gmssl 的文件夹(需要保证该文件夹时nfs的挂载路径才行),并将生成的文件系统复制到此文件夹下,解压后,如下所示:
在这里插入图片描述

  1. 编译OpenSBI
root@t690mp-evb2-va: MACHINE=t690mp-evb2-va bitbake opensbi -c cleanall
root@t690mp-evb2-va: MACHINE=t690mp-evb2-va bitbake opensbi 
root@t690mp-evb2-va: cp -rf /localhdd/jack/tmp-glibc/deploy/images/t690mp-evb2-va/fw_jump.bin /share/samba/public/shared/jack/
  1. 编译U-Boot
    在这里插入图片描述
root@t690mp-evb2-va: MACHINE=t690mp-evb2-va bitbake u-boot -c cleanall
root@t690mp-evb2-va: MACHINE=t690mp-evb2-va bitbake u-boot
root@t690mp-evb2-va: cp /localhdd/jack/tmp-glibc/deploy/images/t690mp-evb2-va/u-boot.bin /share/samba/public/shared/jack/
  1. 编译Kernel
    修改设备树,配置文件系统的挂载路径如下:
    在这里插入图片描述
root@t690mp-evb2-va: MACHINE=t690mp-evb2-va bitbake linux-mainline -c cleanall
root@t690mp-evb2-va: MACHINE=t690mp-evb2-va bitbake linux-mainline
root@t690mp-evb2-va: cp /localhdd/jack/tmp-glibc/deploy/images/t690mp-evb2-va/fitImage /share/samba/public/shared/jack/rootfs_gmssl/boot/
  1. 编译GMSSL 或 OpenSSL

备注:若使用yocto编译GMSSL,必须采用迂回的路线,即将GMSSL的bb文件中的内容全部替换到OpenSSL的bb文件中去,通过编译OpenSSL的方式实现对GMSSL的编译。

root@t690mp-evb2-va: MACHINE=t690mp-evb2-va bitbake openssl -c cleanall
root@t690mp-evb2-va: MACHINE=t690mp-evb2-va bitbake openssl
root@t690mp-evb2-va: cp -rf /localhdd/jack/tmp-glibc/work/riscv64-tih-linux/openssl/1.1.1q-r0/image/* /share/samba/public/shared/jack/rootfs_gmssl/
root@t690mp-evb2-va: cp -rf /localhdd/jack/tmp-glibc/work/riscv64-tih-linux/openssl/1.1.1q-r0/packages-split/openssl-dbg/* /share/samba/public/shared/jack/rootfs_gmssl/
  1. 编译CCAT
root@t690mp-evb2-va: MACHINE=t690mp-evb2-va bitbake ccat -c cleanall
root@t690mp-evb2-va: MACHINE=t690mp-evb2-va bitbake ccat
root@t690mp-evb2-va: cp -rf /localhdd/jack/tmp-glibc/work/t690mp_evb2_va-tih-linux/ccat/1.0-r0/image/* /share/samba/public/shared/jack/rootfs_gmssl/
root@t690mp-evb2-va: cp -rf /localhdd/jack/tmp-glibc/work/t690mp_evb2_va-tih-linux/ccat/1.0-r0/packages-split/ccat-dbg/* /share/samba/public/shared/jack/rootfs_gmssl/
  1. 编译CCAT-Engine
root@t690mp-evb2-va: MACHINE=t690mp-evb2-va bitbake ccat-engine -c cleanall
root@t690mp-evb2-va: MACHINE=t690mp-evb2-va bitbake ccat-engine
root@t690mp-evb2-va: cp -rf /localhdd/jack/tmp-glibc/work/riscv64-tih-linux/ccat-engine/1.0-r0/image/* /share/samba/public/shared/jack/rootfs_gmssl/
root@t690mp-evb2-va: cp -rf /localhdd/jack/tmp-glibc/work/riscv64-tih-linux/ccat-engine/1.0-r0/packages-split/ccat-engine-dbg/* /share/samba/public/shared/jack/rootfs_gmssl/

1.3 烧写固件

参考方寸微电子提供的快速启动文档《TIH64V690 SDK Quick Start.pdf》
下载地址:https://e.gitee.com/tihchip_priv/repos/tihchip/doc/sources
在这里插入图片描述

2. 创建工程

2.1 搭建调试工程

创建并导入待调试的工程的目的是:方便跟踪、查看、并修改源码(切记:这里导入的是源码工作的链接文件,而不是源文件)

  1. 点击:File/New/Project
    在这里插入图片描述
    在这里插入图片描述
  2. 导入工程(ccat、ccat_engine、openssl)
    在这里插入图片描述
    在这里插入图片描述
    依次导入CCAT、CCAT_Engine、OpenSSL的源码工程链接。

2.2 配置Dbug调试信息

  在“debug工程”右键选择“Debug As \ Debug Configurations”,进入如下配置界面。按照下面图示进行配置:

  1. 配置可执行程序(testapp)的路径
/* 当前测试case的可执行程序路径如下: */
/localhdd/jack/tmp-glibc/work/riscv64-tih-linux/ccat-engine/1.0-r0/ccat-engine-1.0/testapp

在这里插入图片描述

  1. 配置GDB及GDB调试信息

备注:此处配置的工具链必须与开发板上的工具链保持一致,建议直接使用我们导出的工具链

工具链的位置:/localhdd/jack/tih_toolchain/sysroots/x86_64-tih_sdk-linux/usr/bin/riscv64-tih-linux/riscv64-tih-linux-gdb
ccat.gdbinit:记录了GDB的命令,启动GDB时会解析该命令,该文件的内容如下:

/* 设置共享库的搜索路径 */
set solib-absolute-prefix /share/samba/public/shared/jack/rootfs_gmssl//* 设置ccat源码的替换搜索路径 */
set substitute-path /usr/src/debug/ccat/1.0-r0/ccat/ /localhdd/jack/tmp-glibc/work/t690mp_evb2_va-tih-linux/ccat/1.0-r0/ccat//* 设置ccat-engine源码的替换搜索路径 */
set substitute-path /usr/src/debug/ccat-engine/1.0-r0/ccat-engine-1.0/ /localhdd/jack/tmp-glibc/work/riscv64-tih-linux/ccat-engine/1.0-r0/ccat-engine-1.0//* 设置OpenSSL源码的替换搜索路径 */
set substitute-path /usr/src/debug/openssl/1.1.1q-r0/openssl-1.1.1q/ /localhdd/jack/tmp-glibc/work/riscv64-tih-linux/openssl/1.1.1q-r0/git/

在这里插入图片描述
在这里插入图片描述

  1. 设置共享库的搜索路径

在这里插入图片描述

  1. 设置IP及端口号
    在这里插入图片描述

3. 调试

  1. 开发板启动成功之后,启动 qat_service 服务(命令:/etc/init.d/qat_service start
root@t690mp-evb2-va:~# /etc/init.d/qat_service start
usdm_drv: loading out-of-tree module taints kernel.
usdm_drv: Loading USDM Module Version 0.7.1 ...
usdm_drv: IOCTLs: c0507100, c0507101, 7102, c0047104
tih_ccat_platform tih_ccat_platform.0: c1xxx - adf_probe
tih_ccat_platform tih_ccat_platform.0: create asym rings - section:KERNEL - name:Cy0BankNumber - bank[0]
tih_ccat_platform tih_ccat_platform.0: create  sym rings - section:KERNEL - name:Cy0BankNumber - bank[0]
tih_ccat_platform tih_ccat_platform.0: create asym rings - section:KERNEL - name:Cy1BankNumber - bank[1]
tih_ccat_platform tih_ccat_platform.0: create  sym rings - section:KERNEL - name:Cy1BankNumber - bank[1]
Restarting all dQevices.AT: Stopping all acceleration devices.Processing /etc/c1xxx_dev0.conf
tih_ccat_platform tih_ccat_platform.0: init device with bundle[0] information
tih_ccat_platform tih_ccat_platform.0: init bundle[0] ring - ring number:4
tih_ccat_platform tih_ccat_platform.0: init the bundle[0] with instance:CRYPTO
tih_ccat_platform tih_ccat_platform.0: init the bundle[0] with instance:COMP
tih_ccat_platform tih_ccat_platform.0: init device with bundle[1] information
tih_ccat_platform tih_ccat_platform.0: init bundle[1] ring - ring number:4
tih_ccat_platform tih_ccat_platform.0: init the bundle[1] with instance:CRYPTO
tih_ccat_platform tih_ccat_platform.0: init the bundle[1] with instance:COMP
tih_ccat_platform tih_ccat_platform.0: Process section GENERAL
tih_ccat_platform tih_ccat_platform.0: Process section KERNEL
tih_ccat_platform tih_ccat_platform.0: Process section SSL
tih_ccat_platform tih_ccat_platform.0: add derived section:SSL_INT_0 to the adf cfg
tih_ccat_platform tih_ccat_platform.0: copy section:SSL to the derived section:SSL_INT_0
tih_ccat_platform tih_ccat_platform.0: Set InterruptCoalescingEnabled value with error -14
tih_ccat_platform tih_ccat_platform.0: Set InterruptCoalescingTimerNs value with error -14
tih_ccat_platform tih_ccat_platform.0: Set InterruptCoalescingNumResponses value with error -14
tih_ccat_platform tih_ccat_platform.0: Clean up section GENERAL
tih_ccat_platform tih_ccat_platform.0: Clean up section KERNEL
tih_ccat_platform tih_ccat_platform.0: Clean up section SSL
tih_ccat_platform tih_ccat_platform.0: Clean up section Accelerator0
tih_ccat_platform tih_ccat_platform.0: Starting acceleration device ccat_dev0.
tih_ccat_platform tih_ccat_platform.0: bundle(uio)=0, hw_bundle_number(bank)=0
uio dts irq number matched
tih_ccat_platform tih_ccat_platform.0: bundle(uio)=1, hw_bundle_number(bank)=1
uio dts irq number matched
Checking status of all devices.
There is 1 QAT acceleration device(s) in the system:ccat_dev0 - type: c1xxx,  instance_id: 0,  #num_logical_accel:1 #banks_per_accle:2,  device sysname: tih_ccat_platform.0,  #accel: 11 #engines: 120,  state: up
  1. 查询开发板的IP地址(命令:ifconfig),如下当前开发板的IP地址为:192.168.100.126
root@t690mp-evb2-va:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500  metric 1inet 192.168.100.126  netmask 255.255.255.0  broadcast 192.168.100.255inet6 fe80::2c61:41ff:fe8b:df4e  prefixlen 64  scopeid 0x20<link>inet6 fdfc:4fec:614e:0:2c61:41ff:fe8b:df4e  prefixlen 64  scopeid 0x0<global>ether 2e:61:41:8b:df:4e  txqueuelen 1000  (Ethernet)RX packets 27875  bytes 19035304 (18.1 MiB)RX errors 0  dropped 236  overruns 0  frame 0TX packets 6772  bytes 1078732 (1.0 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0device interrupt 113  memory 0x5000000-50ffffflo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536  metric 1inet 127.0.0.1  netmask 255.0.0.0inet6 ::1  prefixlen 128  scopeid 0x10<host>loop  txqueuelen 1000  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  1. 在开发板(串口终端)上运行gdbserver,启动gdbserver服务,如下所示,此时开发板一直侦听端口1234
    命令gdbserver 192.168.100.126:1234 testapp -v aes128_ecb
    说明
      1)192.168.100.126 :终端的IP地址
      2)1234:端口号(随意设置,只要与gdb端保持一致即可)
      3)testapp:待调试的可执行程序
      4)-v aes128_ecb:可执行程序的参数
root@t690mp-evb2-va:~# gdbserver 192.168.100.126:1234 testapp -v aes128_ecb
Process testapp created; pid = 475
Listening on port 1234
  1. 主机端修改配置信息,配置开发板的IP地址,如下:
    在这里插入图片描述
  2. 主机端,启动调试,如下图所示:
    在这里插入图片描述
  3. 主机端启动成功之后,开发板串口的打印信息如下:
    在这里插入图片描述
    至此,说明整个连接已通,可以愉快的调试代码了。

4. 手动调试过程

  章节3中介绍了,怎么使用Eclipse调试的方式,也可以使用纯手动的方式进行调试,这里也记录一下这种调试过程(假设板子都已经正常运行,此处仅描述 gdb 的过程)。

  1. 在串口终端执行gdbsever命令 gdbserver 192.168.100.49:1234 testapp -engine ccatengine -v sm2
    在这里插入图片描述
  2. 服务器端,开启一个新的终端,执行命令:/localhdd/jack/tih_toolchain/sysroots/x86_64-tih_sdk-linux/usr/bin/riscv64-tih-linux/riscv64-tih-linux-gdb /localhdd/jack/tmp-glibc/work/riscv64-tih-linux/ccat-engine/1.0-r0/ccat-engine-1.0/testapp
  3. 输入命令:target remote 192.168.100.49:1234
  4. 修改查询共享库的路径:set solib-absolute-prefix /share/samba/public/shared/jack/rootfs_gmssl/
  5. 设置CCAT源码的路径:set substitute-path /usr/src/debug/ccat/1.0-r0/ccat/ /localhdd/jack/tmp-glibc/work/t690mp_evb2_va-tih-linux/ccat/1.0-r0/ccat/
  6. 设置Engine源码的路径:set substitute-path /usr/src/debug/ccat-engine/1.0-r0/ccat-engine-1.0/ /home/jack/svn_project/t690/sdk/trunk/linux/pkg/tih/lib/ccat_engine/
  7. 设置GMSSL源码的路径:
    set substitute-path /usr/src/debug/openssl/1.1.1q-r0/openssl-1.1.1q/ /localhdd/jack/tmp-glibc/work/riscv64-tih-linux/openssl/1.1.1q-r0/git/
  8. 设置断点 b main
  9. 后面就可以使用gdb的命令进行愉快的调试了。整过过程执行代码如下所示:
jack@fw02:~$ /localhdd/jack/tih_toolchain/sysroots/x86_64-tih_sdk-linux/usr/bin/riscv64-tih-linux/riscv64-tih-linux-gdb /localhdd/jack/tmp-glibc/work/riscv64-tih-linux/ccat-engine/1.0-r0/ccat-engine-1.0/testapp
GNU gdb (GDB) 10.2
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "--host=x86_64-tih_sdk-linux --target=riscv64-tih-linux".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:<http://www.gnu.org/software/gdb/documentation/>.For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /localhdd/jack/tmp-glibc/work/riscv64-tih-linux/ccat-engine/1.0-r0/ccat-engine-1.0/testapp...
(gdb) target remote 192.168.100.49:1234
Remote debugging using 192.168.100.49:1234
Reading /lib/ld-linux-riscv64-lp64d.so.1 from remote target...
warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead.
Reading /lib/ld-linux-riscv64-lp64d.so.1 from remote target...
Reading symbols from target:/lib/ld-linux-riscv64-lp64d.so.1...
Reading /lib/ld-2.31.so from remote target...
Reading /lib/.debug/ld-2.31.so from remote target...
Reading /lib/.debug/ld-2.31.so from remote target...
Reading symbols from target:/lib/.debug/ld-2.31.so...
0x0000001555557020 in _start () from target:/lib/ld-linux-riscv64-lp64d.so.1
(gdb) set solib-absolute-prefix /share/samba/public/shared/jack/rootfs_gmssl/
warning: .dynamic section for "/share/samba/public/shared/jack/rootfs_gmssl/lib/ld-linux-riscv64-lp64d.so.1" is not at the expected address (wrong library or version mismatch?)
Reading symbols from /share/samba/public/shared/jack/rootfs_gmssl/lib/ld-linux-riscv64-lp64d.so.1...
Reading symbols from /share/samba/public/shared/jack/rootfs_gmssl/lib/.debug/ld-2.31.so...
Reading symbols from /share/samba/public/shared/jack/rootfs_gmssl/lib/ld-linux-riscv64-lp64d.so.1...
Reading symbols from /share/samba/public/shared/jack/rootfs_gmssl/lib/.debug/ld-2.31.so...
(gdb) set substitute-path /usr/src/debug/ccat/1.0-r0/ccat/ /localhdd/jack/tmp-glibc/work/t690mp_evb2_va-tih-linux/ccat/1.0-r0/ccat/
(gdb) set substitute-path /usr/src/debug/ccat-engine/1.0-r0/ccat-engine-1.0/ /home/jack/svn_project/t690/sdk/trunk/linux/pkg/tih/lib/ccat_engine/
(gdb) set substitute-path /usr/src/debug/openssl/1.1.1q-r0/openssl-1.1.1q/ /localhdd/jack/tmp-glibc/work/riscv64-tih-linux/openssl/1.1.1q-r0/git/
(gdb) 
(gdb) 
(gdb) 
(gdb) b main
Breakpoint 1 at 0x2aaaaafbc0: file test/main.c, line 1557.
(gdb) c
Continuing.Breakpoint 1, main (argc=5, argv=0x3ffffffd28) at test/main.c:1557
1557	{
(gdb) n
1559	    tls_version = default_tls_string;
(gdb) 
1560	    digest_kdf = default_digest_string;
(gdb) 
1564	    for (i = 1; i < argc; i++) {
(gdb) r
The "remote" target does not support "run".  Try "help target" or "continue".
(gdb) c
Continuing.
[Inferior 1 (process 503) exited normally]
(gdb) q
jack@fw02:~$ 

4. 总结

  1. gdb与gdbserver必须使用同一个版本的。
  2. 在使用Eclipse进行调试时,当配置文件中指定了共享库的搜索路径之后,在ccat.gdbinit中可以不再指定共享库的搜索路径了。但是若在该文件中指定共享库的搜索路径,则启动调试到调试环境就绪所消耗的时间要比在配置选项中指定共享库所消耗的时间少的多。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/144640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI暂停新的ChatGPT Plus注册 | OpenAI 的 GPT Builder 创建您的 GPTs

OpenAI DevDay 才过去仅仅一周时间&#xff0c;伴随着开发者大会上发布的一系列重磅升级和新特性&#xff0c;无疑这样的进化速度让广大网友炸锅了&#xff0c;其火热程度可见一斑。 就在四个小时前&#xff0c;OpenAI的CEO Sam Altma突然宣布&#xff0c;ChatGPT Plus账号暂停…

桂院校园导航 静态项目 二次开发教程 1.3

Gitee代码仓库&#xff1a;桂院校园导航小程序 GitHub代码仓库&#xff1a;GLU-Campus-Guide 升级日志 1.3 优化了小程序的数据存储方式&#xff0c;对部分页面进行了调整&#xff0c;调整了功能和代码。 引入weui组件库&#xff0c;使地点的呈现方式更加美观 序号内容详情…

leetcode - 串联所有单词的子串 - 最小覆盖子串 - x 的平方根

I30. 串联所有单词的子串 - 力扣&#xff08;LeetCode&#xff09; 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 words ["ab&qu…

通过Python设置及读取PDF属性,轻松管理PDF文档

PDF文档属性是嵌入在PDF文档中的一些与文档有关的信息&#xff0c;如作者、制作软件、标题、主题等。PDF属性分为默认属性和自定义属性两种&#xff0c;其中默认属性是一些固定的文档信息&#xff0c;部分信息自动生成&#xff08;如文件大小、页数、页面大小等信息&#xff09…

基于Qt 多线程(继承 QObject 的线程)

​ 继承 QThread 类是创建线程的一种方法,另一种就是继承QObject 类。继承 QObject 类更加灵活。它通过 QObject::moveToThread()方法,将一个 QObeject的类转移到一个线程里执行。恩,不理解的话,我们下面也画个图捋一下。 通过上面的图不难理解,首先我们写一个类继承 QObj…

单脉冲测角-和差比幅法

和差比幅法单脉冲测角 单脉冲测角的类型阵列接收模型和差波束构造方法和差比幅测角仿真 单脉冲测角的类型 传统的单脉冲测向方法主要有3种&#xff0c;分别是半阵法、加权法和和差比幅法。其实这3种方法都需要形成和波束和差波束&#xff0c;只是波束形成的方法不同&#xff0…

CSS Form表单布局

效果图 <Tab IsCard"true"><TabItem Text"表单信息-DIV版本"><div class"row"><div class"col"><label for"field1">工程名称:</label><input class"form-control" type&…

SQL练习---619.出现一次的最大数字

题目 分析 首先确定表的来源只有一个表数字表&#xff0c;再者判断他是不是单一数字&#xff0c;&#xff08;想到的是直接按数字分组&#xff0c;通过count函数来判断是否为单一数子&#xff09;&#xff0c;然后求最大值。 题解 select Max(num) as num from MyNumbers wh…

爬虫项目(12):正则、多线程抓取腾讯动漫,Flask展示数据

文章目录 书籍推荐正则抓取腾讯动漫数据Flask展示数据 书籍推荐 如果你对Python网络爬虫感兴趣&#xff0c;强烈推荐你阅读《Python网络爬虫入门到实战》。这本书详细介绍了Python网络爬虫的基础知识和高级技巧&#xff0c;是每位爬虫开发者的必读之作。详细介绍见&#x1f44…

CSS花边001:无衬线字体和有衬线字体

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

【算法总结】归并排序专题(刷题有感)

思考 一定要注意归并排序的含义&#xff0c;思考归并的意义。 主要分为两个步骤&#xff1a; 拆分 每次对半分(mid l r >> 1)输入&#xff1a;raw整块&#xff0c;输出&#xff1a;raw左块 raw右块 合并 每次都要对raw左块、 raw右块按照某种规则进行合并输入&#xf…

《变形监测与数据处理》笔记/期末复习资料(择期补充更新)

变形&#xff1a; 变形是物体在外来因素作用下产生的形状、大小及位置的变化&#xff08;随时间域和空间域的变化&#xff09;&#xff0c;它是自然界普遍存在的现象。 变形体&#xff1a; 一般包括工程建筑物、构筑物、大型机械设备以及其他自然和人工对象等。 变形体和变形…

手把手教你搭建属于自己的快递小程序

在数字化时代&#xff0c;小程序已经成为各行各业连接用户、提供服务、创造价值的重要工具。其中&#xff0c;快递寄件小程序因其实用性和广泛的需求&#xff0c;成为很多企业和开发者关注的焦点。本文将详细介绍如何快速创建快递寄件小程序&#xff0c;以及如何利用它实现盈利…

振南技术干货集:比萨斜塔要倒了,倾斜传感器快来!(1)

注解目录 1、倾斜传感器的那些基础干货 1.1 典型应用场景 &#xff08;危楼、边坡、古建筑都是对倾斜敏感的。&#xff09; 1.2 倾斜传感器的原理 1.2.1 滚珠式倾斜开关 1.2.2 加速度式倾斜传感器 1)直接输出倾角 2)加速度计算倾角 3)倾角精度的提高 &#xff08;如果…

MyBatis-Plus 系列

目录&#xff1a; 一、 Spring Boot 整合 MyBatis Plus 二、MyBatisPlus 多数据源配置 三、MybatisPlus —注解汇总 四、MyBatis Plus—CRUD 接口 五、MyBatis-Plus 条件构造器 六、MyBatis-Plus 代码生成器 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09…

#[量化投资-学习笔记018]Python+TDengine从零开始搭建量化分析平台-正态分布与收益率

正态分布(Normal Distribution)又叫高斯分布、常态分布。通常用来描述随机变量的概率分布。 自然界的数据分布通常是符合正态分布规律的&#xff0c;比如说人的身高、体重。但是非自然界数据就不一定了。尤其是经过人为加工过的数据。 金融领域大量使用正态分布来计算收益率和…

《白帽子讲web安全》笔记

第八章 文件上传漏洞 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力 文件上传后导致的常见安全问题一般有&#xff1a; ❍ 上传文件是Web脚本语言&#xff0c;服务器的Web容器解释并执行了用户上传的脚本&#xf…

【Apache Doris】审计日志插件 | 快速体验

【Apache Doris】审计日志插件 | 快速体验 一、 环境信息1.1 硬件信息1.2 软件信息 二、 审计日志插件介绍三、 快速 体验3.1 AuditLoader 配置3.1.1 下载 Audit Loader 插件3.1.2 解压安装包3.1.3 修改 plugin.conf 3.2 创建库表3.3 初始化3.4 验证 一、 环境信息 1.1 硬件信…

vscode文件夹折叠问题

今天发现一个vscode的文件夹显示的问题&#xff0c;首先是这样的&#xff0c;就是我的文件夹里又一个子文件夹&#xff0c;子文件夹里有一些文件&#xff0c;但是我发现无法折叠起这个子文件夹&#xff0c;总是显示全部的文件&#xff0c;这让我备份很难&#xff0c;具体参考 h…

C51--PC通过串口(中断)点亮LED

B4中的&#xff1a;REN允许 / 禁止串行接收控制位 REN 1为允许串行接收状态。 接收数据必须开启。所以SCON&#xff1a;0101 0000 &#xff1b;即0x50 如何知道数据已经接收 RI位&#xff1a;当收到数据后 RI 1&#xff08;由硬件置一&#xff09; 硬件置一后必须用软件…