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

最近在浏览某大型程序员交友 网站的时候发现一个好玩的项目,介绍如下:
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 &</

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sourcepawn脚本入门(二)命令与事件监听

&#x1f34e;Sourcepawn脚本入门(二)命令与事件监听 &#xff08;控制台&#xff09;命令是常用的插件形式&#xff0c;eg. noclip …等都是常用的命令&#xff0c;在游戏中使用也很容易,souremod可以注册自己的命令。 事件的监听则需要考虑到不同的起源游戏支持的事件不同&am…

中文BERT模型预训练参数总结以及转化为pytorch的方法

1.目前针对中文的bert预训练模型有三家&#xff1a; 谷歌发布的chinese_L-12_H-768_A-12 还有哈工大的chinese-bert-wwm / chinese-bert-wwm-ext 以及HuggingFace上的bert-base-chinese(由清华大学基于谷歌的BERT在中文数据集上训练开发的模型&#xff0c;上传在HuggingFace) …

彻底删除VsCode配置和安装过的插件与缓存

前言 当你准备对 Visual Studio Code&#xff08;VSCode&#xff09;进行重新安装时&#xff0c;可能遇到一个常见问题&#xff1a;重新安装后&#xff0c;新的安装似乎仍然保留了旧的配置信息&#xff0c;这可能会导致一些麻烦。这种情况通常是由于卸载不彻底所致&#xff0c…

【LVS实战】04 LVS+Keepalived实现负载均衡高可用

一、介绍 Keepalived 是一个用于 Linux 平台的高可用性软件。它实现了虚拟路由器冗余协议 (VRRP) 和健康检查功能&#xff0c;可以用于确保在多台服务器之间提供服务的高可用性。Keepalived 可以检测服务器的故障&#xff0c;并在主服务器宕机时&#xff0c;自动将备份服务器提…

外卖系统源码开发:打造高效智能化餐饮解决方案

在当今数字化时代&#xff0c;外卖系统成为了餐饮业中不可或缺的一部分。为了满足日益增长的外卖需求&#xff0c;我们将深入探讨外卖系统源码开发的关键技术和创新应用。 1. 技术栈选择 在开始外卖系统源码的开发之前&#xff0c;我们首先需要选择适用的技术栈。一个典型的…

【langchain实战】开源项目-RasaGPT

1、概述 RasaGpt是一个建立在 Rasa 和 Langchain 之上的没有显示界面的LMM聊天机器人平台。它是一个Rasa和Telegram这种利用像Langchain这样的LMM库进行索引、检索和上下文注入的样板及参考实现。 开源地址&#xff1a; GitHub - paulpierre/RasaGPT: &#x1f4ac; RasaGPT is…

揭秘:软件测试中Web请求的完整流程!

在软件开发的过程中&#xff0c;测试是一个至关重要的环节。而在现代互联网应用中&#xff0c;Web请求是很常见的一个测试需求。本文将介绍Web请求的完整测试流程&#xff0c;帮助读者更好地理解软件测试的关键步骤。 一、测试准备阶段 在进行Web请求测试之前&#xff0c;测试团…

【CMake入门】第二节——CMake常用指令介绍

系列文章&#xff1a; 【CMake入门】第一节——CMake的安装与简单样例 CMake常用指令介绍 cmake_minimum_required 指定要求最小的cmake版本&#xff0c;如果版本小于该要求&#xff0c;程序终止 project(test) 设置当前项目名称为test CMAKE_BUILD_TYPE 用于设置CMake构…

招商银行薪福:一站式API连接电商平台,实现CRM与客服系统集成

招商银行薪福通的API集成优势 招商银行的SaaS产品薪福通在电商行业迅速崭露头角&#xff0c;它通过一站式API连接&#xff0c;极大地简化了电商平台与CRM及客服系统的集成过程。企业无需深入研究API开发细节&#xff0c;也不必担心代码复杂性&#xff0c;就能实现系统间的高效…

LeetCode力扣每日一题(Java):14、最长公共前缀

一、题目 二、解题思路 1、我的思路 乍一看我的代码量还是比较少&#xff0c;但是提交上去发现时间效率和空间效率都不占优势 讲讲我的思路&#xff1a;首先通过for循环找出数组中长度最短的字符串&#xff0c;并用min储存最短字符串的长度&#xff0c;最长公共前缀不可能比…

SAP MM 中的业务伙伴确定配置

这篇博客文章将概述 SAP MM 供应商帐户组中的合作伙伴确定是什么以及如何在 S/4 系统中配置它。 本文将指导您完成分步过程&#xff0c;并为您提供有关在供应商主数据中使用合作伙伴确定的完整想法。 合作伙伴角色 供应商在 SAP 中扮演着不同类型的角色&#xff0c;让我们通…

基于JavaSwing实现的学生管理系统(课程设计必备)

基于JavaSwing实现的学生管理系统&#xff0c;最全的Java基础学生管理系统&#xff0c;Java课程设计必备 系统一共包括学生信息管理&#xff0c;考勤签到管理&#xff0c;学生成绩管理&#xff0c;学生选课管理系统。不仅有基础功能&#xff0c;还有图表统计等功能。功能是非常…

记录 | chrome下载提速

chrome浏览器下载提速的方法&#xff1a; 谷歌浏览器一直都带有多线程下载模式&#xff0c;只不过默认关闭了&#xff0c;打开后下载速度会提升很多&#xff0c;只要在新标签页输入 chrome://flags/#enable-parallel-downloading &#xff0c;点enter&#xff0c;出现下图点击…

逆向修改Unity的安卓包资源并重新打包

在上一篇文章中,我已经讲过如何逆向获取unity打包出来的源代码和资源了,那么这一节我将介绍如何将解密出来的源代码进行修改并重新压缩到apk中。 其实在很多时候,我们不仅仅想要看Unity的源码,我们还要对他们的客户端源码进行修改和调整,比如替换资源,替换服务器连接地址…

智能优化算法应用:基于梯度算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于梯度算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于梯度算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.梯度算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Beam Search学习

BackGround 在生成的时候&#xff0c;模型的输出是一个时间步一个时间步依次获得的&#xff0c;而且前面时间步的结果还会影响后面时间步的结果。也就是说&#xff0c;每一个时间步&#xff0c;模型给出的都是基于历史生成结果的条件概率。 为了生成完整的句子&#xff0c;需…

Codeforces Round 913 (Div. 3) A~E

目录 A. Rook 问题分析: B. YetnotherrokenKeoard 问题分析: C. Removal of Unattractive Pairs 问题分析: D. Jumping Through Segments 问题分析: E. Good Triples 问题分析: A. Rook 问题分析: 给一个棋子将其同行同列的位置输出 #include<bits/s…

ABAP 字符串空白值保留长度或者用其他字符替代

保留空白值在字符串的长度。 DATA lv_char1 TYPE string VALUE Hello. DATA lv_char2 TYPE string VALUE World. DATA LV_CHAR3 TYPE C LENGTH 50.DATA(lv_string3) |{ lv_char1 } { lv_char2 }!|.WRITE: / lv_string3.DATA(lv_string2) lv_char1 && | { lv_char3 } …

6个实用又好用的交互原型工具!

在 UI/UX 设计中&#xff0c;原型设计是至关重要的一步。正如用户体验中的其它环节一样&#xff0c;有无数的交互原型工具可以帮助你完成原型设计。市场上有太多的交互原型工具&#xff0c;如果你不知道选择哪一种&#xff0c;那么我们将为你介绍 6 个实用又好用的交互原型工具…

获取文本框中录入得 方法,执行该方法

最近一个同事问我如何将大文本中输入得方法&#xff0c;变成一个真正得方法执行&#xff0c; 于是在控制台临时测试了一下我的想法 解释一下这个过程&#xff0c; 1、从大文本框中获取到一个字符串 var a"function(){alert(2)}" 2、将字符串转换成真正可执行的方…