Unicorn CPU emulator framework (ARM, AArch64, M68K, Mips, Sparc, PowerPC, RiscV, X86)

Unicorn Engine

Join the chat at https://gitter.im/unicorn-engine/chat Build Status pypi downloads Fuzzing Status

Unicorn is a lightweight, multi-platform, multi-architecture CPU emulator framework based on QEMU.

Unicorn offers some unparalleled features:

  • Multi-architecture: ARM, ARM64 (ARMv8), M68K, MIPS, SPARC, and X86 (16, 32, 64-bit)
  • Clean/simple/lightweight/intuitive architecture-neutral API
  • Implemented in pure C language, with bindings for Crystal, Clojure, Visual Basic, Perl, Rust, Ruby, Python, Java, .NET, Go, Delphi/Free Pascal, Haskell, Pharo, and Lua.
  • Native support for Windows & *nix (with Mac OSX, Linux, *BSD & Solaris confirmed)
  • High performance via Just-In-Time compilation
  • Support for fine-grained instrumentation at various levels
  • Thread-safety by design
  • Distributed under free software license GPLv2

Further information is available at http://www.unicorn-engine.org

License

This project is released under the GPL license.

Compilation & Docs

See docs/COMPILE.md file for how to compile and install Unicorn.

More documentation is available in docs/README.md.

Contact

Contact us via mailing list, email or twitter for any questions.

Contribute

If you want to contribute, please pick up something from our Github issues.

We also maintain a list of more challenged problems in a TODO list.

CREDITS.TXT records important contributors of our project.

Owner
Unicorn Engine
Multi-arch multi-platform CPU emulator framework
Unicorn Engine
Comments
  • IMUL mem/Ib DWORD; OPC_IMUL_GvEvIb;

    IMUL mem/Ib DWORD; OPC_IMUL_GvEvIb; "imul eax, [ecx+0x41], 0x10"

    In Intel IMUL opcode described in one method using different descriptions:

    • 6B / r ib IMUL r32, imm8 doubleword register = doubleword register * sign-extended immediate byte
    • imul Gv, Ev, I
    • OPC_IMUL_GvEvIb
    • imul eax, [ecx+0x41], 0x10
    • 6b414110 imul eax,DWORD PTR [ecx+0x41],0x10

    When encountering an IMUL opcode of i386 architecture, specifically when using with an immediate 8-bit multiplier, the emulator engine does not properly multiply the number 0x5151494a by 0x10 and get the expected 0x151494a0 result.

    Interesting thing, is that a standalone IMUL instruction works, but this stack-based AlphaMixed code snippet (derived from Metasploit) failed.

    Will submit working proof-of-failure code soon.

  • Python 3.5 dynamic library load error

    Python 3.5 dynamic library load error

    I've been battling with running the python bindings on python 3.5.

    I keep getting a ImportError: ERROR: fail to load the dynamic library. however I have checked that all libraries are present in .\unicorn\lib

        Directory: C:\Python\Lib\site-packages\unicorn\lib
    
    
    Mode                LastWriteTime         Length Name
    ----                -------------         ------ ----
    -a----       2016/09/24   7:23 PM         122036 libgcc_s_dw2-1.dll
    -a----       2016/09/24   3:17 PM          83742 libgcc_s_seh-1.dll
    -a----       2016/10/13   7:02 PM        1124259 libglib-2.0-0.dll
    -a----       2015/06/29   1:25 PM        1050543 libiconv-2.dll
    -a----       2016/03/31   8:50 AM         132717 libintl-8.dll
    -a----       2016/10/09   5:46 PM          56978 libwinpthread-1.dll
    -a----       2016/10/31   9:10 PM       26335738 unicorn.dll
    

    The library does load the directories correctly

    [-] path: 'C:\Python\lib\site-packages\unicorn\lib'
            [+] lib_file: C:\Python\lib\site-packages\unicorn\lib\libwinpthread-1.dll
            [+] lib_file: C:\Python\lib\site-packages\unicorn\lib\libgcc_s_seh-1.dll
            [+] lib_file: C:\Python\lib\site-packages\unicorn\lib\libgcc_s_dw2-1.dll
    [-] path: 'C:\Python\lib\site-packages\unicorn\lib'
            [+] lib_file: C:\Python\lib\site-packages\unicorn\lib\libwinpthread-1.dll
            [+] lib_file: C:\Python\lib\site-packages\unicorn\lib\libgcc_s_seh-1.dll
            [+] lib_file: C:\Python\lib\site-packages\unicorn\lib\libgcc_s_dw2-1.dll
    [-] path: ''
            [+] lib_file: libwinpthread-1.dll
            [+] lib_file: libgcc_s_seh-1.dll
            [+] lib_file: libgcc_s_dw2-1.dll
            [+] lib_file: libiconv-2.dll
            [+] lib_file: libintl-8.dll
            [+] lib_file: libglib-2.0-0.dll
    [-] path: 'C:\Python\Lib\site-packages'
            [+] lib_file: C:\Python\Lib\site-packages\libwinpthread-1.dll
            [+] lib_file: C:\Python\Lib\site-packages\libgcc_s_seh-1.dll
            [+] lib_file: C:\Python\Lib\site-packages\libgcc_s_dw2-1.dll
            [+] lib_file: C:\Python\Lib\site-packages\libiconv-2.dll
            [+] lib_file: C:\Python\Lib\site-packages\libintl-8.dll
            [+] lib_file: C:\Python\Lib\site-packages\libglib-2.0-0.dll
    [-] path: 'C:\Python\Lib\site-packages\unicorn\lib'
            [+] lib_file: C:\Python\Lib\site-packages\unicorn\lib\libwinpthread-1.dll
            [+] lib_file: C:\Python\Lib\site-packages\unicorn\lib\libgcc_s_seh-1.dll
            [+] lib_file: C:\Python\Lib\site-packages\unicorn\lib\libgcc_s_dw2-1.dll
    [-] path: '/usr/lib64'
            [+] lib_file: /usr/lib64\libwinpthread-1.dll
            [+] lib_file: /usr/lib64\libgcc_s_seh-1.dll
            [+] lib_file: /usr/lib64\libgcc_s_dw2-1.dll
            [+] lib_file: /usr/lib64\libiconv-2.dll
            [+] lib_file: /usr/lib64\libintl-8.dll
            [+] lib_file: /usr/lib64\libglib-2.0-0.dll
    Traceback (most recent call last):
      File "shellcode.py", line 5, in <module>
        from unicorn import *
      File "C:\Python\lib\site-packages\unicorn\__init__.py", line 4, in <module>
        from .unicorn import Uc, uc_version, uc_arch_supported, version_bind, debug, UcError, __version__
      File "C:\Python\lib\site-packages\unicorn\unicorn.py", line 75, in <module>
        raise ImportError("ERROR: fail to load the dynamic library.")
    ImportError: ERROR: fail to load the dynamic library.
    

    Note: the extra path was a hard-coded one for debugging.

    I have no idea what the issue is here. You can see the hap-hazard file loading from a little debug print() I did :/

    Its also worth noting that I have attempt the "official" 0.9 release from the website as well as my own build. Same issue regardless.

  • update bindings to support uc_context_save() & uc_context_restore()

    update bindings to support uc_context_save() & uc_context_restore()

    attention: @sashs, @enkomio, @adrianherrera, @cseagle, @xorstream, @lunixbochs.

    recently we have new APIs uc_context_save() & uc_context_restore(). at the moment, only Python binding supports these API.

    thus we need to update other bindings: .Net, Go, Haskell, Java, msvc & ruby.

    thanks!

  • M1 Max jit_write_protect issue

    M1 Max jit_write_protect issue

    Moved to Unicorn 2 for M1 support. Getting this ~50% of the time

    MIPS CPU, with Go bindings if it matters. Perhaps someone has an idea.

    Process 34232 stopped
    * thread #10, stop reason = EXC_BAD_ACCESS (code=2, address=0x280000098)
        frame #0: 0x0000000101040a14 libunicorn.2.dylib`tb_gen_code_mips + 304
    libunicorn.2.dylib`tb_gen_code_mips:
    ->  0x101040a14 <+304>: str    x8, [x9, #0x18]
        0x101040a18 <+308>: ldur   w8, [x29, #-0x14]
        0x101040a1c <+312>: ldur   x9, [x29, #-0x38]
        0x101040a20 <+316>: str    w8, [x9]
    Target 0: (mipsevm.test) stopped.
    (lldb) bt
    * thread #10, stop reason = EXC_BAD_ACCESS (code=2, address=0x280000098)
      * frame #0: 0x0000000101040a14 libunicorn.2.dylib`tb_gen_code_mips + 304
        frame #1: 0x000000010102b74c libunicorn.2.dylib`tb_find + 92
        frame #2: 0x000000010102b1b0 libunicorn.2.dylib`cpu_exec_mips + 244
        frame #3: 0x0000000100fd8ce0 libunicorn.2.dylib`tcg_cpu_exec + 76
        frame #4: 0x0000000100fd8c0c libunicorn.2.dylib`resume_all_vcpus_mips + 96
        frame #5: 0x0000000100fd8dfc libunicorn.2.dylib`vm_start_mips + 24
        frame #6: 0x0000000100fc676c libunicorn.2.dylib`uc_emu_start + 352
        frame #7: 0x00000001002f7f04 mipsevm.test`_cgo_81152a5834e5_Cfunc_uc_emu_start + 44
    

    Speed isn't that important to me, is there any way to disable threading?

  • Add ability to mark memory area read only. Add new API uc_mem_map_ex t…

    Add ability to mark memory area read only. Add new API uc_mem_map_ex t…

    Add ability to mark memory area read only. Add new API uc_mem_map_ex to allow permissions to be passed. Change MemoryBlock to track created MemoryRegions. Add regress/ro_mem_test.c

    This also solves the memory leak issue on uc->ram because now all MemoryRegion allocations are tracked in the uc->mapped_blocks array.

  • remove glib dependency by providing compatible replacements

    remove glib dependency by providing compatible replacements

    Added glib compatible replacements for all glib functions used in unicorn. Removed glib dependencies in Makefiles. I threw the list and hash table implementations together and have paid no attention to their performance. Feel free to replace the hash table implementation with something that performs better. Need help testing. All samples and unit tests run with same results as master on the following platforms: win32 (using mingw), OS X 64, Linux 32, Linux 64. Have not done much testing beyond that.

  • New feature: registers can be bulk saved/restored in an opaque blob

    New feature: registers can be bulk saved/restored in an opaque blob

    This is a feature that is required for UC integration in angr. We need to be able to efficiently roll back the state at a whim when we encounter symbolic data that cannot be processed by unicorn.

    Originally, our internal code was just including the appropriate private header files and performing this operation manually, but as we're gearing up for distribution, this won't do. So, new feature!

    I've done nothing but the bare minimum to demonstrate that it works and is useful since I don't know if this is a feature you'd appreciate having.

  • IBM Z (aka SystemZ / SysZ / s390x) architecture support

    IBM Z (aka SystemZ / SysZ / s390x) architecture support

    Hi,

    I was wondering what would it take to support IBM Z in unicorn-engine? QEMU 2.1.2 seems to have sufficient support for it, so I assume the main missing things are these?

    • UC_* defines
    • machine definition
    • hooks
    • build system support

    Also, based on https://github.com/unicorn-engine/unicorn/issues/1438, do I get it right that such contribution would have to wait until unicorn 2 is out, or would it make sense to also do this for 1.x?

    Best regards, Ilya

  • Run Unit Test in Travis builds

    Run Unit Test in Travis builds

    osx in Travis has brew available without sudo, easy to install cmocka

    For linux and appveyor, I created a small script to download and compile cmocka.

    Unit test test_tb_x86_64_32_imul_Gv_Ev_Ib now failing on all platforms

    TODO: see if clang works in cygwin for builds, currently following up with cmocka

    What about changing the tests/unit to pass and adding it to the build process? Maybe bindings too?

  • PPC support

    PPC support

    I've made only few tests so far: basic arithmetic, and strlen(). No stack-related tests, no tests for resource leaks on multiple runs, no tests for hooks. Also it is limited to e500v2 and built only in ubuntu/amd64/gcc environment. So this is surely work in progress. However the changes to the common part of unicorn are few and easy to review and most likely they are not going to introduce any problem with non-ppc platforms. So if you accept the changes you are going to have an otherwise stable engine with experimental unstable ppc support.

  • roadmap to Qemu 2.5 syncing

    roadmap to Qemu 2.5 syncing

    i wanted to straightly upgrade to Qemu 2.5, but there is a lot of code changed from Qemu 2.2.1, which Unicorn is based on.

    therefore, i will break this down in few phases to make it more manageable, and also easier to track bugs introduced by this task:

    • upgrade to 2.3.1
    • upgrade to 2.4.1
    • upgrade to 2.5

    expect more update on this work later.

  • Tests fail on Mac M1

    Tests fail on Mac M1

    I moved from Intel Mac (all tests passing) to new Mac M1 and now I have these tests failing:

    ➜  build git:(master) ✗ ./test_x86
    Test test_x86_in...                             [ OK ]
    Test test_x86_out...                            [ OK ]
    Test test_x86_mem_hook_all...                   [ OK ]
    Test test_x86_inc_dec_pxor...                   [ OK ]
    Test test_x86_relative_jump...                  [ OK ]
    Test test_x86_loop...                           [ OK ]
    Test test_x86_invalid_mem_read...               [ OK ]
    Test test_x86_invalid_mem_write...              [ OK ]
    Test test_x86_invalid_jump...                   [ OK ]
    Test test_x86_64_syscall...                     [ OK ]
    Test test_x86_16_add...                         [ OK ]
    Test test_x86_reg_save...                       [ OK ]
    Test test_x86_invalid_mem_read_stop_in_cb...    [ OK ]
    Test test_x86_x87_fnstenv...                    [ OK ]
    Test test_x86_mmio...                           [ OK ]
    Test test_x86_missing_code...                   [ OK ]
    Test test_x86_smc_xor...                        [ OK ]
    Test test_x86_mmio_uc_mem_rw...                 [ OK ]
    Test test_x86_sysenter...                       [ OK ]
    Test test_x86_hook_cpuid...                     [ OK ]
    Test test_x86_486_cpuid...                      [ OK ]
    Test test_x86_clear_tb_cache...                 [ OK ]
    Test test_x86_clear_empty_tb...                 [ OK ]
    Test test_x86_hook_tcg_op...                    [ OK ]
    Test test_x86_cmpxchg...                        [ OK ]
    Test test_x86_nested_emu_start...                 Test interrupted by signal 10.
    Test test_x86_nested_emu_stop...                  Test interrupted by signal 10.
    Test test_x86_64_nested_emu_start_error...        Test interrupted by signal 10.
    Test test_x86_eflags_reserved_bit...            [ OK ]
    Test test_x86_nested_uc_emu_start_exits...        Test interrupted by signal 10.
    FAILED: 4 of 30 unit tests have failed.
    ➜  build git:(master) ✗ ./test_mem 
    Test test_map_correct...                        [ OK ]
    Test test_map_wrapping...                       [ OK ]
    Test test_mem_protect...                        [ OK ]
    Test test_splitting_mem_unmap...                [ OK ]
    Test test_splitting_mmio_unmap...               [ OK ]
    Test test_mem_protect_map_ptr...                [ FAILED ]
      test_mem.c:142: Check val == mem... failed
    Test test_map_at_the_end...                     [ OK ]
    Test test_map_wrap...                           [ OK ]
    Test test_map_big_memory...                     Assertion failed: (size != 0), function find_ram_offset, file exec.c, line 967.
      Test interrupted by SIGABRT.
    FAILED: 2 of 9 unit tests have failed.
    

    Debugging them:

    • test_x86: all errors are related to pthread_jit_write_protect_np setting, I'm working on a fix.
    • test_mem:
      • FAILED test comes from uc_mem_read function, is not reading expected data.
      • Still debugging interrupted test, I'll update this comment if I have more info.

    I am using macOS Monterrey 12.2.1 with Apple M1 Pro chip.

  • Can't get correct PC if hook is added inside a hook

    Can't get correct PC if hook is added inside a hook

    Code Hook:

    from unicorn import *
    from unicorn.x86_const import *
    
    # memory address where emulation starts
    ADDRESS = 0x1000000
    SIZE =  1024 * 1024
    
    def hook_code1(uc, address, size, user_data):
        print("We want to get next insn after 0x%x" % address)
        uc.hook_add(UC_HOOK_CODE, hook_code2)
    
    def hook_code2(uc, address, size, user_data):
        print("The next insn we get at 0x%x" % address)
        uc.emu_stop()
    
    print("Emulate i386 code")
    try:
        # Initialize emulator in X86-32bit mode
        uc = Uc(UC_ARCH_X86, UC_MODE_32)
    
        # map 2MB memory for this emulation
        uc.mem_map(ADDRESS, SIZE)
    
        # write machine code to be emulated to memory
        uc.mem_write(ADDRESS, b'\x90'*SIZE)
    
        uc.hook_add(UC_HOOK_CODE, hook_code1, None, ADDRESS, ADDRESS)
    
        # emulate code in infinite time & unlimited instructions
        uc.emu_start(ADDRESS, ADDRESS + SIZE)
    
        print("Emulation done")
    
    except UcError as e:
        print("ERROR: %s" % e)
    

    We get:

    Emulate i386 code
    We want to get next insn after 0x1000000
    The next insn we get at 0x1000200
    Emulation done
    

    Mem Hook:

    from unicorn import *
    from unicorn.x86_const import *
    
    # memory address where emulation starts
    ADDRESS = 0x1000000
    SIZE = 1024 * 1024
    
    def hook_code(uc, address, size, user_data):
        print("We want to get the next memory write address")
        uc.hook_add(UC_HOOK_MEM_WRITE, hook_mem)
    
    def hook_mem(uc, access, address, size, value, user_data):
        print("We catch a mem write at 0x%x" % uc.reg_read(UC_X86_REG_EIP))
        uc.emu_stop()
    
    print("Emulate i386 code")
    try:
        # Initialize emulator in X86-32bit mode
        uc = Uc(UC_ARCH_X86, UC_MODE_32)
    
        # map 2MB memory for this emulation
        uc.mem_map(ADDRESS, SIZE)
    
        # write machine code to be emulated to memory
        uc.mem_write(ADDRESS, b'\x90'*0x1f8 + b'\x00'*(SIZE - 0x1f8))
    
        # initialize machine registers
        uc.reg_write(UC_X86_REG_EAX, ADDRESS+1)
    
        uc.hook_add(UC_HOOK_CODE, hook_code, None, ADDRESS+16, ADDRESS+16)
    
        # emulate code in infinite time & unlimited instructions
        uc.emu_start(ADDRESS+8, ADDRESS + SIZE)
    
        print("Emulation done")
    
    except UcError as e:
        print("ERROR: %s" % e)
    

    We get:

    Emulate i386 code
    We want to get the next memory write address
    We catch a mem write at 0x1000010
    Emulation done
    
  • Add type annotations to Python bindings

    Add type annotations to Python bindings

    Editors such as PyCharm and VS Code can provide much better real-time autocomplete and type checking for users of Unicorn if the Python bindings had type annotations applied to them:

    • https://docs.python.org/3/library/typing.html

    In addition, users could use command line tools such as Mypy to statically type check their Unicorn applications from the terminal and within CI.

  • Issues and tests for jump hook address

    Issues and tests for jump hook address

    Hello, in x86 hooks for unmapped memory get an address with a 1-bit offset. The two tests added show that:

    • The movabs instruction gets executed correctly as the value is set in rax
    • The jmp instruction gets executed correctly as the value is set in rip
    • The address obtained in the hook is incorrect (uncommenting the printf shows the address with a 1-bit offset)
    • The same behavior is correct in ARM64 and RISC-V Hope this can help!
  • error with go binding

    error with go binding

    I want to use unicorn in go1.18.1. Howerever,I tried the sample.go and followed the Readme. Error occured when go build. # github.com/unicorn-engine/unicorn/bindings/go/unicorn D:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lunicorn collect2.exe: error: ld returned 1 exit status I also tried it with go 1.15.13 in linux,but there is the same error # github.com/unicorn-engine/unicorn/bindings/go/unicorn /usr/bin/ld: cannot find -lunicorn /usr/bin/ld: cannot find -lunicorn collect2: error: ld returned 1 exit status. I googled it but can't find the solution,can you help me ?

PHP Encoder, protect PHP scripts in PHP 8 and PHP 7, High Performance, Compitable with X86_64, MIPS, ARM platform and Ubuntu/Centos/OpenWRT system.

What's FRICC2? FRICC2 is a PHP Script encryption tool. When you are developing a commercial software using PHP, the script can be distributed as encry

May 6, 2022
kianv a simple implementation of a rv32im riscv cpu and soc in verilog with firmware that runs raytracer, mandelbrot, etc.....
kianv a simple implementation of a rv32im riscv cpu and soc in verilog with firmware that runs raytracer, mandelbrot, etc.....

A very simple riscv cpu/soc one single file implementation created in my spare time! But it is full rv32im CPU :) I have wrote all from scratch to lea

May 10, 2022
Elven relativism -- relocation and execution of aarch64 ELF relocatable objects (REL)
Elven relativism -- relocation and execution of aarch64 ELF relocatable objects (REL)

elvenrel Elven Relativism -- relocation and execution of aarch64 ELF relocatable objects (REL) on Linux and macOS. Program loads a multitude of ELF RE

Nov 28, 2021
xv6 port to aarch64 virt board

xv6 is a re-implementation of Dennis Ritchie's and Ken Thompson's Unix Version 6 (v6). xv6 loosely follows the structure and style of v6, but is impl

Apr 7, 2022
An experimental operating system for x86 and ARM
An experimental operating system for x86 and ARM

Odyssey - an experimental operating system for x86 and ARM

Mar 22, 2022
A port of the Linux x86 IOLI crackme challenges to x86-64

This is a port of the original Linux x86 IOLI crackme binaries to x86-64. The original set of IOLI crackmes can be found here: https://github.com/Maij

Mar 19, 2022
repo to house various LLVM based SIHFT passes for RISCV 32/64 soft error resilience

compas-ft-riscv COMPAS: Compiler-assisted Software-implemented Hardware Fault Tolerance implemented in LLVM passes for the RISC-V backend Repo to hous

Jan 10, 2022
a small C library for x86 CPU detection and feature extraction

libcpuid libcpuid provides CPU identification for the x86 (and x86_64). For details about the programming API, you might want to take a look at the pr

May 15, 2022
MINCE is an Emacs-like text editor from Mark of the Unicorn, Inc.

MINCE Is Not Complete[ly] EMACS Overview MINCE is an Emacs-like text editor from Mark of the Unicorn, Inc. Versions were available for many oper

May 9, 2022
IDA Debugger Module to Dynamically Synchronize Memory and Registers with third-party Backends (Tenet, Unicorn, GDB, etc.)
IDA Debugger Module to Dynamically Synchronize Memory and Registers with third-party Backends (Tenet, Unicorn, GDB, etc.)

IDA Debug Bridge IDA Debugger Module to Dynamically Synchronize Memory and Registers with third-party Backends (Tenet, Unicorn, GDB, etc.) By synchron

Mar 12, 2022
Qnicorn: a cutting edge version of unicorn-engine.org
Qnicorn: a cutting edge version of unicorn-engine.org

Qnicorn Engine Qnicorn is a cutting edge and community-driven version of unicorn-engine. Qnicorn offers the features below: All features that Unicorn2

Mar 2, 2022
x86 emulator on Raspberry Pi Pico
x86 emulator on Raspberry Pi Pico

picox86 x86 emulator on Raspberry Pi Pico https://user-images.githubusercontent.com/10139098/110543817-13299080-812b-11eb-9c88-674cdae919fc.mp4 PCB fr

Apr 7, 2022
x86 emulator written in C++
x86 emulator written in C++

X86_EMULATOR_2 Build make Run ./x86 -i haribote.img Language and Library C++11, SDL2.0 How to use mouse on x86 emulator Grab mouse on x86 emulator cli

Feb 23, 2022
TinyE8 - Ben Eater's 8 Bit CPU Emulator
 TinyE8 - Ben Eater's 8 Bit CPU Emulator

TinyE8 - Ben Eater's 8 Bit CPU Emulator TinyE8 emulates Ben Eater's 8 bit breadboard CPU. Implemented all the Instructions except JC and JZ, I need to

Mar 31, 2022
A place to collaborate on code for the Embedded.fm book club. Currently reading "STM32 ARM Programming for Embedded Systems".

Welcome to the Book Club Code site! This is a place for the Embedded.fm book club to collaborate and learn together. Repo Structure Guide Top-level fo

Jan 13, 2022
A lightweight ARM reverse engineering tool.

eydis A lightweight (basic and slow) ARM reverse engineering tool. I. Requierements macOS/Linux, Basics compiling tools, The SQLite3 + readline framew

Feb 16, 2022
Prometheus exporter for ARM® Hardware components using HWCPipe.

ARM® HWCPipe Exporter ARM® HWCPipe Exporter is a Prometheus exporter written in Java and C++ that retrieves metrics from Android devices running on AR

Mar 18, 2022
ARM DevSummit workshop with Portenta H7

ARM DevSummit 2021 - Edge Impulse Portenta workshop Edge Impulse enables developers to create the next generation of intelligent device solutions with

Oct 19, 2021
Dummy-Robot my super mini robot arm robot items
Dummy-Robot my super mini robot arm robot items

Dummy-Robot 我的超迷你机械臂机器人项目。 资料待整理 已添加3D模型设计源文件。 已添加夹爪硬件设计文件和LED灯环PCB 已添加无线空间定位控制器PCB文件 已添加无线示教器Peak软硬件工程(作为submodule) 已添加REF的硬件设计文件 已添加DummyStudio上位机 已

May 11, 2022