[RISCV] 发现一个可以看RISC-V CPU行为的开源项目

news2025/1/10 10:09:17

最近在浏览某大型程序员交友 网站的时候发现一个好玩的项目,介绍如下:
A small program that handles mie, msi, mti and trap interrupts and updates some global variables on interrupts.
重点是他下面还放了一张图:
在这里插入图片描述
能看到RISCV CSR的行为太酷啦!!!

下面一起setup一下,万一以后项目能用到呢。
写这篇博客的时候,我已经go through了一遍,所以下面我会用一种顶层设计的方法来介绍怎么setup。


$ sudo apt install gcc g++ build-essential pip

Spike RISC-V ISA Simulator

$ git clone https://github.com/five-embeddev/riscv-isa-sim.git -b vcd_trace
$ git submodule update --init
$ sudo apt-get install device-tree-compiler
$ mkdir build
$ cd build
$ ../configure --prefix=/tmp/riscv-isa-sim/__install
$ make
$ [sudo] make install

你可以在/tmp/riscv-isa-sim/__install/bin下找到spike

/tmp/riscv-isa-sim/__install/bin$ ./spike
Spike RISC-V ISA Simulator 1.1.1-dev

usage: spike [host options] <target program> [target options]
Host Options:
  -p<n>                 Simulate <n> processors [default 1]
  -m<n>                 Provide <n> MiB of target memory [default 2048]
  -m<a:m,b:n,...>       Provide memory regions of size m and n bytes
                          at base addresses a and b (with 4 KiB alignment)
  -d                    Interactive debug mode
  -g                    Track histogram of PCs
  -l                    Generate a log of execution
  -h, --help            Print this help message
  -H                    Start halted, allowing a debugger to connect
  --log=<name>          File name for option -l
  --debug-cmd=<name>    Read commands from file (use with -d)
  --isa=<name>          RISC-V ISA string [default RV64IMAFDC]
  --priv=<m|mu|msu>     RISC-V privilege modes supported [default MSU]
  --varch=<name>        RISC-V Vector uArch string [default vlen:128,elen:64]
  --pc=<address>        Override ELF entry point
  --hartids=<a,b,...>   Explicitly specify hartids, default is 0,1,...
  --ic=<S>:<W>:<B>      Instantiate a cache model with S sets,
  --dc=<S>:<W>:<B>        W ways, and B-byte blocks (with S and
  --l2=<S>:<W>:<B>        B both powers of 2).
  --device=<P,B,A>      Attach MMIO plugin device from an --extlib library
                          P -- Name of the MMIO plugin
                          B -- Base memory address of the device
                          A -- String arguments to pass to the plugin
                          This flag can be used multiple times.
                          The extlib flag for the library must come first.
  --log-cache-miss      Generate a log of cache miss
  --extension=<name>    Specify RoCC Extension
                          This flag can be used multiple times.
  --extlib=<name>       Shared library to load
                        This flag can be used multiple times.
  --rbb-port=<port>     Listen on <port> for remote bitbang connection
  --dump-dts            Print device tree string and exit
  --disable-dtb         Don't write the device tree blob into memory
  --kernel=<path>       Load kernel flat image into memory
  --initrd=<path>       Load kernel initrd into memory
  --bootargs=<args>     Provide custom bootargs for kernel [default: console=hvc0 earlycon=sbi]
  --real-time-clint     Increment clint time at real-time rate
  --dm-progsize=<words> Progsize for the debug module [default 2]
  --dm-sba=<bits>       Debug system bus access supports up to <bits> wide accesses [default 0]
  --dm-auth             Debug module requires debugger to authenticate
  --dmi-rti=<n>         Number of Run-Test/Idle cycles required for a DMI access [default 0]
  --dm-abstract-rti=<n> Number of Run-Test/Idle cycles required for an abstract command to execute [default 0]
  --dm-no-hasel         Debug module supports hasel
  --dm-no-abstract-csr  Debug module won't support abstract to authenticate
  --dm-no-halt-groups   Debug module won't support halt groups
  --dm-no-impebreak     Debug module won't support implicit ebreak in program buffer
  --vcd-log=<file>      Log VCD to this file.
  --max-cycles=<cycle count>      Limit simulation to this number of cycles.

gtkwave

$ sudo apt install meson gperf flex desktop-file-utils libgtk-3-dev libbz2-dev libjudy-dev libgirepository1.0-dev

升级meson到 > 1.0,ubuntu自带的是0.61.2版本,不能满足项目的编译要求

$ pip install --upgrade meson

Building GTKWave

$ git clone https://github.com/gtkwave/gtkwave.git
$ cd gtkwave
$ meson setup build
$ meson compile -C build

你可以在/tmp/gtkwave/build/src/helpers/下找到fst2vcd,在/tmp/gtkwave/build/src/下找到gtkwave,将在下面的riscv-scratchpad用到。

riscv-scratchpad

$ git clone https://github.com/five-embeddev/riscv-scratchpad.git
$ cd riscv-scratchpad/baremetal-vcd-trace
$ make -j$(nproc)
# 把run_sim.sh里SPIKE=改到你刚才编译出来spike的路径,比如:SPIKE=/tmp/riscv-isa-sim/__install/bin/spike
$ source ./run_sim.sh

这里执行完的log如下

Warning: the memory at  [0x20010000, 0x2007A11F] has been realigned
to the 4 KiB page size: [0x20010000, 0x2007AFFF]
warning: tohost and fromhost symbols not in ELF; can't communicate with target
echo on
trace timestamp
Tracing timestamp, 8bytes @0x80000028
trace count_123
Tracing count_123, 1bytes @0x80000020
trace wakeup_count
Tracing wakeup_count, 8bytes @0x80000018
trace mei_count
Tracing mei_count, 4bytes @0x80000000
trace mti_count
Tracing mti_count, 4bytes @0x80000008
trace msi_count
Tracing msi_count, 4bytes @0x80000004
trace ecall_count
Tracing ecall_count, 8bytes @0x80000010
until pc 0 main
Run until pc == 0x20010100
TRACE: mei_count @ 0x80000000 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: msi_count @ 0x80000004 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: mti_count @ 0x80000008 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x0 & 0xffffffff00000000
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x0 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x0-> 0x0 & 0xff
TRACE: timestamp @ 0x80000028 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: timestamp @ 0x80000028 + 0x4= 0x0-> 0x0 & 0xffffffff00000000
pc 0
0x20010100
run 1000
TRACE: count_123 @ 0x80000020 + 0x0= 0x1-> 0x1 & 0xff
MEI = 0
MEI = 1
MEI = 0
MEI = 0
TRACE: mti_count @ 0x80000008 + 0x0= 0x1-> 0x1 & 0xffffffff
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
TRACE: timestamp @ 0x80000028 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: timestamp @ 0x80000028 + 0x4= 0x0-> 0x0 & 0xffffffff00000000
MEI = 0
MEI = 0
TRACE: timestamp @ 0x80000028 + 0x0= 0x0-> 0x0 & 0xffffffff
TRACE: timestamp @ 0x80000028 + 0x4= 0x0-> 0x0 & 0xffffffff00000000
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
MEI = 0
TRACE: count_123 @ 0x80000020 + 0x0= 0x2-> 0x2 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x1-> 0x1 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x1 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x1-> 0x1 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x1 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x2-> 0x2 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x2 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x2-> 0x2 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x2 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x3-> 0x3 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x3 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x3-> 0x3 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x3 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x4-> 0x4 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x4 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x4-> 0x4 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x4 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x5-> 0x5 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x5 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x5-> 0x5 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x5 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x6-> 0x6 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x6 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x6-> 0x6 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x6 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x7-> 0x7 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x7 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x7-> 0x7 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x7 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x8-> 0x8 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x8 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x8-> 0x8 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x8 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x9-> 0x9 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x9 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x9-> 0x9 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x9 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0xa-> 0xa & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0xa & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0xa-> 0xa & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0xa & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0xb-> 0xb & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0xb & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0xb-> 0xb & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0xb & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0xc-> 0xc & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0xc & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0xc-> 0xc & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0xc & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0xd-> 0xd & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0xd & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0xd-> 0xd & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0xd & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0xe-> 0xe & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0xe & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0xe-> 0xe & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0xe & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0xf-> 0xf & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0xf & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0xf-> 0xf & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0xf & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x10-> 0x10 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x10 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x10-> 0x10 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x10 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x11-> 0x11 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x11 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x11-> 0x11 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x11 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x12-> 0x12 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x12 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x12-> 0x12 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x12 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
pc 0
0x20010152
mem timestamp
0x00000000
mem count_123
0x00000003
mem wakeup_count
0x00000012
mem mei_count
0x00000000
mem mti_count
0x00000001
mem msi_count
0x00000000
mem ecall_count
0x00000012
interrupt 0 raise mei
MEI = 1
run 100
TRACE: mei_count @ 0x80000000 + 0x0= 0x1-> 0x1 & 0xffffffff
TRACE: mei_count @ 0x80000000 + 0x0= 0x2-> 0x2 & 0xffffffff
TRACE: mei_count @ 0x80000000 + 0x0= 0x3-> 0x3 & 0xffffffff
TRACE: mei_count @ 0x80000000 + 0x0= 0x4-> 0x4 & 0xffffffff
TRACE: mei_count @ 0x80000000 + 0x0= 0x5-> 0x5 & 0xffffffff
TRACE: mei_count @ 0x80000000 + 0x0= 0x6-> 0x6 & 0xffffffff
TRACE: mei_count @ 0x80000000 + 0x0= 0x7-> 0x7 & 0xffffffff
TRACE: mei_count @ 0x80000000 + 0x0= 0x8-> 0x8 & 0xffffffff
interrupt 0 clear mei
MEI = 0
pc 0
0x20010270
mem timestamp
0x00000000
mem count_123
0x00000003
mem wakeup_count
0x00000012
mem mei_count
0x00000008
mem mti_count
0x00000001
mem msi_count
0x00000000
mem ecall_count
0x00000012
run 1000
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x13-> 0x13 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x13 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x13-> 0x13 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x13 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x14-> 0x14 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x14 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x14-> 0x14 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x14 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x15-> 0x15 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x15 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x15-> 0x15 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x15 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x16-> 0x16 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x16 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x16-> 0x16 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x16 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x17-> 0x17 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x17 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x17-> 0x17 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x17 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x18-> 0x18 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x18 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x18-> 0x18 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x18 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x19-> 0x19 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x19 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x19-> 0x19 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x19 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x1a-> 0x1a & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x1a & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x1a-> 0x1a & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x1a & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x1b-> 0x1b & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x1b & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x1b-> 0x1b & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x1b & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x1c-> 0x1c & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x1c & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x1c-> 0x1c & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x1c & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x1d-> 0x1d & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x1d & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x1d-> 0x1d & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x1d & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x1e-> 0x1e & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x1e & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x1e-> 0x1e & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x1e & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x1f-> 0x1f & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x1f & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x1f-> 0x1f & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x1f & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x20-> 0x20 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x20 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x20-> 0x20 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x20 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x21-> 0x21 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x21 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x21-> 0x21 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x21 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x22-> 0x22 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x22 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x22-> 0x22 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x22 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x23-> 0x23 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x23 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x23-> 0x23 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x23 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x24-> 0x24 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x24 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x24-> 0x24 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x24 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x25-> 0x25 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x25 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x25-> 0x25 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x25 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x26-> 0x26 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x26 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x26-> 0x26 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x26 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x27-> 0x27 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x27 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x27-> 0x27 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x27 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x28-> 0x28 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x28 & 0xffffffff00000000
mem timestamp
0x00000000
mem count_123
0x00000003
mem wakeup_count
0x00000028
mem mei_count
0x00000008
mem mti_count
0x00000001
mem msi_count
0x00000000
mem ecall_count
0x00000027
run 5000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x28-> 0x28 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x28 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x29-> 0x29 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x29 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x29-> 0x29 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x29 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x2a-> 0x2a & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x2a & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x2a-> 0x2a & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x2a & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x2b-> 0x2b & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x2b & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x2b-> 0x2b & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x2b & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x2c-> 0x2c & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x2c & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x2c-> 0x2c & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x2c & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x2d-> 0x2d & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x2d & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x2d-> 0x2d & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x2d & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x2e-> 0x2e & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x2e & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x2e-> 0x2e & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x2e & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x2f-> 0x2f & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x2f & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x2f-> 0x2f & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x2f & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x30-> 0x30 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x30 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x30-> 0x30 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x30 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x31-> 0x31 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x31 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x31-> 0x31 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x31 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x32-> 0x32 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x32 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x32-> 0x32 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x32 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x33-> 0x33 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x33 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x33-> 0x33 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x33 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x34-> 0x34 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x34 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x34-> 0x34 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x34 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x35-> 0x35 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x35 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x35-> 0x35 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x35 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x36-> 0x36 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x36 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x36-> 0x36 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x36 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x37-> 0x37 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x37 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x37-> 0x37 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x37 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x38-> 0x38 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x38 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x38-> 0x38 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x38 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x39-> 0x39 & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x39 & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x39-> 0x39 & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x39 & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x3a-> 0x3a & 0xffffffff
TRACE: wakeup_count @ 0x80000018 + 0x4= 0x0-> 0x3a & 0xffffffff00000000
TRACE: ecall_count @ 0x80000010 + 0x0= 0x3a-> 0x3a & 0xffffffff
TRACE: ecall_count @ 0x80000010 + 0x4= 0x0-> 0x3a & 0xffffffff00000000
TRACE: count_123 @ 0x80000020 + 0x0= 0x3-> 0x3 & 0xff
TRACE: wakeup_count @ 0x80000018 + 0x0= 0x3b-> 0x3b &</

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

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

相关文章

IT外包服务内容有哪些?

在信息技术迅猛发展的今天&#xff0c;越来越多的企业为了提高效率、降低成本以及更专注于核心业务&#xff0c;选择将信息技术工作外包给专业的IT服务公司。IT外包包含很多不同的服务&#xff0c;以下是对主要服务内容的简要概述。 1. 网络建设与维护 网络是现代企业信息系统…

文章润色软件,免费的几款润色工具推荐

高质量的文章对任意一个平台都是至关重要的。然而&#xff0c;即便思路清晰&#xff0c;内容丰富&#xff0c;若文章表达不够准确、连贯&#xff0c;其传达的信息可能会失去效果。本文将深入探讨文章润色的方法、文章润色的工具以及一些实用的技巧&#xff0c;帮助大家提升文章…

CleanMyMac X2024最新版本mac优化软件好用吗?

为了维护mac系统健康&#xff0c;优化系统功能&#xff0c;我们需要定期给电脑进行清理。那么作为mac清理软件CleanMyMac X软件具备哪些独特性和实用性呢&#xff1f;今天就给大家说明一下。 CleanMyMac X全新版下载如下: https://wm.makeding.com/iclk/?zoneid49983 1、 简…

使用 React 和 ECharts 创建地球模拟扩散和飞线效果

在本博客中&#xff0c;我们将学习如何使用 React 和 ECharts 创建一个酷炫的地球模拟扩散效果。我们将使用 ECharts 作为可视化库&#xff0c;以及 React 来构建我们的应用。地球贴图在文章的结尾。 最终效果 准备工作 首先&#xff0c;确保你已经安装了 React&#xff0c;并…

什么是TDR(威胁检测与响应)

网络安全是被动和主动方法的混合体。过去&#xff0c;企业往往局限于被动的方法&#xff0c;随着合规性和安全策略越来越受到重视&#xff0c;主动方法也越来越受到关注。与其他行业相比&#xff0c;网络安全是高度动态的&#xff0c;网络安全团队采用任何可以帮助他们优化的新…

无缝集成|一文读懂Salesforce外部服务(External Services)

外部服务(External Services)是一种Salesforce集成方法&#xff0c;无需代码即可将外部Web服务无缝连接到Salesforce组织。 外部服务通过使用OpenAPI等行业标准以声明方式将外部API和计算集成到Salesforce中&#xff0c;从而促进跨多个平台和服务的集成体验。帮助客户在信用评…

数据结构算法-希尔排序

引言 在一个普通的下午&#xff0c;小明和小森决定一起玩“谁是老板”的扑克牌游戏。这次他们玩的可不仅仅是娱乐&#xff0c;更是要用扑克牌来决定谁是真正的“大老板”。 然而&#xff0c;小明的牌就像刚从乱麻中取出来的那样&#xff0c;毫无头绪。小森的牌也像是被小丑掷…

超使用的十个JavaScript技巧

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 JavaScript 作为最流行的语言之一&#xff0c;其语法灵活且每年都在不断吸纳新特性&#xff0c;即使是一个从业多年的老手&#xff0c; 偶尔也会有一些被…

CentOS7 部署PostgreSQL

参考文档&#xff1a;https://www.postgresql.org/download/linux/redhat/ 1. 配置yum源 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm2. 安装PostgreSQL13 yum install -y postgresql13-server3…

网络安全领域的12个大语言模型用例

网络安全是人工智能最大的细分市场&#xff0c;过去几年网络安全厂商纷纷宣称整合了人工智能技术&#xff08;当然也有很多仅仅是炒作&#xff09;&#xff0c;其中大部分是基于基线和统计异常的机器学习。 网络安全是人工智能最大的细分市场&#xff0c;过去几年网络安全厂商…

synchronized关键字-监视器锁(monitor lock)

这就是我们上一篇中代码提到的加锁的主要方式,本质上是调用系统api进行加锁,系统api本质是靠cpu特定指令加锁. synchronize的特性 互斥性 synchronized会起到互斥效果,某个线程执行到某个对象的synchronized中时,,其它线程如果也执行到同一个对象synchronized就会阻塞等待(锁…

快速安装Axure RP Extension for Chrome插件

打开原型文件的html&#xff0c;会跳转到这个页面&#xff0c;怎么破&#xff1f; 我们点开产品设计的原型图如果没有下载Axure插件是打不开&#xff0c;而我们国内网通常又不能再google商店搜索对应插件&#xff0c;下面教大家如何快速安装 1、打开原型文件->resources-&g…

云服务器哪家便宜?亚马逊云科技价格与性能全面解析

前言 近年来&#xff0c;随着企业数字化转型的推进&#xff0c;云服务器选择成为业界热议的话题。在众多云服务提供商中&#xff0c;亚马逊云科技备受关注&#xff0c;其云服务器在价格与性能方面的表现备受期待。为了帮助您更全面了解&#xff0c;本文将以第三方观点&#xf…

S120和PLC通讯设置

一、DP 总线通讯功能简述 PROFIBUS-DP 来实现 S7-300 与 SINAMICS S120 之间的数据交换&#xff0c;用 S7-300 来控制 S120 的运转&#xff0c;及读写所需的参数。 S7-300 与 SINAMICS S120 之间的 DP 通讯是借助于系统功能块 SFC14/SFC15 进行周期性数据通讯。 周期性数…

C# OpenCvSharp DNN 深度神经网络下的风格迁移模型

目录 介绍 效果 项目 代码 下载 C# OpenCvSharp DNN 深度神经网络下的风格迁移模型 介绍 深度神经网络下的风格迁移模型&#xff0c;适用于OpenCv、EmguCv。 斯坦福大学李飞飞团队的风格迁移模型是一种基于深度学习的图像处理技术&#xff0c;可以将一张图像的风格转移…

使用有道词典复制网页上的字

1. 今天发现一个新大陆&#xff0c;同事教的&#xff0c;有道词典可以复制网页上的字&#xff0c;也可以复制PDF文件等一些限制不可复制的字&#xff0c;原来不可复制的字&#xff0c;现在用有道都可以复制了&#xff0c;不需要用油猴下载脚本了。写给老婆这种纯电脑小白的。其…

paddleocr文字识别变迁

数据挖掘 v3 UIM&#xff1a;无标注数据挖掘方案 UIM&#xff08;Unlabeled Images Mining&#xff09;是一种非常简单的无标注数据挖掘方案。核心思想是利用高精度的文本识别大模型对无标注数据进行预测&#xff0c;获取伪标签&#xff0c;并且选择预测置信度高的样本作为训…

分布式I/O模块,为您的数据收集与控制提供强大支持

分布式I/O模块可用于数据收集和各种控制的应用。分布式I/O模块具有可靠度高、价格优惠、设置容易、网络布线方便等特性&#xff0c;适用于分散地区的应用&#xff0c;可以为您节省系统整合的时间和费用。以往都是采用控制电缆和PLC连接。如果采用了分布式I/O模块&#xff0c;就…

界面控件DevExpress WPF导航组件,助力升级应用程序用户体验!(上)

DevExpress WPF的Side Navigation&#xff08;侧边导航&#xff09;、TreeView、导航面板组件能帮助开发者在WPF项目中添加Windows样式的资源管理器栏或Outlook NavBar&#xff08;导航栏&#xff09;&#xff0c;DevExpress WPF NavBar和Accordion控件包含了许多开发人员友好的…

Win10无法删除文件需要管理员权限的解决方法

在Win10电脑中&#xff0c;用户想要删除不需要的文件&#xff0c;却收到了需要管理员权限才能删除&#xff0c;导致用户自己无法将文件删除掉。下面小编给大家带来Win10系统删除文件需要权限的解决方法&#xff0c;解决后用户在Win10电脑上就能删除任意文件了。 Win10无法删除文…