drorgl / esp32-tinyemu Goto Github PK
View Code? Open in Web Editor NEWA fork to Fabrice Bellard's TinyEmu ported to ESP32
License: MIT License
A fork to Fabrice Bellard's TinyEmu ported to ESP32
License: MIT License
I used the premade buildroot file from the readme file. I had to tweak the name of the bin file in the root-riscv32.cfg
file to get it to do anything, but it gets to this line and then just sits:
writing jump address ram ptr: 0x0 phy: 0x0x0
I'm guessing I am missing a step somewhere.
The entire output is here (I was actually able to get it working on the my ESP32-S3, but it did the same thing on my ESP32):
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x15 (USB_UART_CHIP_RESET),boot:0x2a (SPI_FAST_FLASH_BOOT)
Saved PC:0x4203f6b6
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd0108,len:0x1324
load:0x403b6000,len:0xb34
load:0x403ba000,len:0x2e10
entry 0x403b6230
I (24) boot: ESP-IDF 4.4.1 2nd stage bootloader
I (25) boot: compile time 08:59:23
I (25) boot: chip revision: 0
I (26) boot.esp32s3: Boot SPI Speed : 80MHz
I (31) boot.esp32s3: SPI Mode : DIO
I (36) boot.esp32s3: SPI Flash Size : 8MB
I (40) boot: Enabling RNG early entropy source...
I (46) boot: Partition Table:
I (49) boot: ## Label Usage Type ST Offset Length
I (57) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (64) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (72) boot: 2 factory factory app 00 00 00010000 00100000
I (79) boot: End of partition table
I (83) esp_image: segment 0: paddr=00010020 vaddr=3c050020 size=0a8d8h ( 43224) map
I (99) esp_image: segment 1: paddr=0001a900 vaddr=3fc914e0 size=01ffch ( 8188) load
I (102) esp_image: segment 2: paddr=0001c904 vaddr=40374000 size=03714h ( 14100) load
I (112) esp_image: segment 3: paddr=00020020 vaddr=42000020 size=42708h (272136) map
I (166) esp_image: segment 4: paddr=00062730 vaddr=40377714 size=09dc4h ( 40388) load
I (175) esp_image: segment 5: paddr=0006c4fc vaddr=50000200 size=00010h ( 16) load
I (181) boot: Loaded app from partition at offset 0x10000
I (181) boot: Disabling RNG early entropy source...
I (195) opi psram: vendor id : 0x0d (AP)
I (195) opi psram: dev id : 0x02 (generation 3)
I (196) opi psram: density : 0x03 (64 Mbit)
I (199) opi psram: good-die : 0x01 (Pass)
I (204) opi psram: Latency : 0x01 (Fixed)
I (209) opi psram: VCC : 0x01 (3V)
I (213) opi psram: SRF : 0x01 (Fast Refresh)
I (219) opi psram: BurstType : 0x01 (Hybrid Wrap)
I (224) opi psram: BurstLen : 0x01 (32 Byte)
I (229) opi psram: Readlatency : 0x02 (10 cycles@Fixed)
I (235) opi psram: DriveStrength: 0x00 (1/1)
W (240) PSRAM: DO NOT USE FOR MASS PRODUCTION! Timing parameters will be updated in future IDF version.
I (251) spiram: Found 64MBit SPI RAM device
I (255) spiram: SPI RAM mode: sram 80m
I (260) spiram: PSRAM initialized, cache is in normal (1-core) mode.
I (267) cpu_start: Pro cpu up.
I (270) cpu_start: Starting app cpu, entry point is 0x40375d00
I (0) cpu_start: App cpu up.
I (683) spiram: SPI SRAM memory test OK
I (693) cpu_start: Pro cpu start user code
I (693) cpu_start: cpu freq: 240000000
I (693) cpu_start: Application information:
I (696) cpu_start: Project name: esp32-tinyemu
I (701) cpu_start: App version: ee5e244-dirty
I (707) cpu_start: Compile time: Jul 23 2022 08:57:39
I (713) cpu_start: ELF file SHA256: 1f4f3d5acb5ce31e...
I (719) cpu_start: ESP-IDF: 4.4.1
I (723) heap_init: Initializing. RAM available for dynamic allocation:
I (731) heap_init: At 3FC945A8 len 0004BA58 (302 KiB): D/IRAM
I (737) heap_init: At 3FCE0000 len 0000EE34 (59 KiB): STACK/DRAM
I (744) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM
I (750) heap_init: At 600FE000 len 00002000 (8 KiB): RTCRAM
I (756) spiram: Adding pool of 8192K of external SPI memory to heap allocator
I (764) spi_flash: detected chip: gd
I (768) spi_flash: flash io: dio
I (773) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (793) spiram: Reserving pool of 32K of internal memory for DMA/internal allocations
I (793) SD: Using SPI peripheral
I (803) gpio: GPIO[13]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
I (813) sdspi_transaction: cmd=52, R1 response: command not supported
I (853) sdspi_transaction: cmd=5, R1 response: command not supported
Name: SD128
Type: SDHC/SDXC
Speed: 20 MHz
Size: 122344MB
Loading 0
Setting up UART Console
Registering RAM 0x80000000: 134217728 bytes
Registering RAM Entry 0x80000000 134217728 bytes
creating vmm /sdcard/emu/pagefile0x80000000.bin size: 134217728, page: 8192, pages: 380, total: 3112960
Registered RAM 0x80000000: 134217728 bytes at 0x0x0
Registering RAM 0x0: 65536 bytes
Registering RAM Entry 0x0 65536 bytes
creating vmm /sdcard/emu/pagefile0x0.bin size: 65536, page: 8192, pages: 200, total: 1638400
Registered RAM 0x0: 65536 bytes at 0x0x0
Registering CLINT
Registering Device at 0x2000000 786432 bytes
Registering PLIC
Registering Device at 0x40100000 4194304 bytes
Registring HTIF
Registering Device at 0x40008000 16 bytes
Registering VIRTIO Page Size
Registering Device at 0x40010000 4096 bytes
Registering VIRTIO Page Size
Registering Device at 0x40011000 4096 bytes
copied bios from bbl32.bin to 0x0 53730 bytes
copied kernel from kernel-riscv32.bin to 0x400000 3253116 bytes
building fdt
fdt dst 0x1040
writing jump address ram ptr: 0x0 phy: 0x0x0
I cloned the repo, opened it in vscode, hit upload and got this error:
* Executing task: C:\Users\domi\.platformio\penv\Scripts\platformio.exe run --target upload
Processing native (platform: native)
---------------------------------------------------------------------------------------------------------------------------------------Verbose mode can be enabled via `-v, --verbose` option
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 15 compatible libraries
Scanning dependencies...
Dependency Graph
|-- tinyemu @ 1.0.0
|-- sdmount
|-- log_c
|-- simpleconsole
|-- uartconsole
|-- virtual_directory
Building in release mode
Compiling .pio\build\native\src\temu.o
Compiling .pio\build\native\lib60a\direct_cache\direct_cache.o
Compiling .pio\build\native\lib8ce\log_c\log.o
lib\direct_cache\direct_cache.c: In function 'direct_cache_init':
lib\direct_cache\direct_cache.c:32:29: warning: assignment to 'void *' from 'size_t' {aka 'long long unsigned int'} makes pointer from
integer without a cast [-Wint-conversion]
32 | cache->cache[i].key = i + 1;
| ^
lib\direct_cache\direct_cache.c: In function 'direct_cache_remove':
lib\direct_cache\direct_cache.c:58:28: warning: assignment to 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
58 | cache->cache[cell].key = cell + 1;
| ^
Compiling .pio\build\native\libaa2\list\llist.o
Compiling .pio\build\native\libaa2\list\llist_iterator.o
Compiling .pio\build\native\libaa2\list\llist_node.o
Archiving .pio\build\native\lib8ce\liblog_c.a
Archiving .pio\build\native\libaa2\liblist.a
Archiving .pio\build\native\lib60a\libdirect_cache.a
Indexing .pio\build\native\lib8ce\liblog_c.a
Indexing .pio\build\native\lib60a\libdirect_cache.a
Indexing .pio\build\native\libaa2\liblist.a
Compiling .pio\build\native\libf7f\avltree\avltree.o
Compiling .pio\build\native\libbb7\memory_indexer\memory_indexer.o
lib\memory_indexer\memory_indexer.c: In function 'memory_indexer_init':
lib\memory_indexer\memory_indexer.c:34:53: warning: implicit declaration of function 'malloc' [-Wimplicit-function-declaration]
34 | memory_indexer_t *indexer = (memory_indexer_t *)malloc(sizeof(memory_indexer_t));
| ^~~~~~
lib\memory_indexer\memory_indexer.c:34:53: warning: incompatible implicit declaration of built-in function 'malloc'
lib\memory_indexer\memory_indexer.c:5:1: note: include '<stdlib.h>' or provide a declaration of 'malloc'
4 | #include <string.h>
+++ |+#include <stdlib.h>
5 |
lib\memory_indexer\memory_indexer.c: In function 'memory_indexer_set':
lib\memory_indexer\memory_indexer.c:44:67: warning: incompatible implicit declaration of built-in function 'malloc'
44 | struct memory_wrapper *memory_item = (struct memory_wrapper *)malloc(sizeof(struct memory_wrapper));
| ^~~~~~
lib\memory_indexer\memory_indexer.c:44:67: note: include '<stdlib.h>' or provide a declaration of 'malloc'
lib\memory_indexer\memory_indexer.c: In function 'memory_indexer_search':
lib\memory_indexer\memory_indexer.c:60:35: warning: initialization of 'struct avl_node_t *' from incompatible pointer type 'struct avl_node *' [-Wincompatible-pointer-types]
60 | struct avl_node_t *avl_node = avl_search(&indexer->avl_tree, &query.avl, cmp_func);
| ^~~~~~~~~~
lib\memory_indexer\memory_indexer.c: In function 'memory_indexer_remove':
lib\memory_indexer\memory_indexer.c:72:35: warning: initialization of 'struct avl_node_t *' from incompatible pointer type 'struct avl_node *' [-Wincompatible-pointer-types]
72 | struct avl_node_t *avl_node = avl_search(&indexer->avl_tree, &query.avl, cmp_func);
| ^~~~~~~~~~
lib\memory_indexer\memory_indexer.c:76:40: warning: passing argument 2 of 'avl_remove' from incompatible pointer type [-Wincompatible-pointer-types]
76 | avl_remove(&indexer->avl_tree, avl_node);
| ^~~~~~~~
| |
| struct avl_node_t *
In file included from lib\memory_indexer\memory_indexer.c:3:
lib\avltree/avltree.h:89:34: note: expected 'struct avl_node *' but argument is of type 'struct avl_node_t *'
89 | struct avl_node *node);
| ~~~~~~~~~~~~~~~~~^~~~
lib\memory_indexer\memory_indexer.c:77:9: warning: implicit declaration of function 'free' [-Wimplicit-function-declaration]
77 | free(wrapper);
| ^~~~
lib\memory_indexer\memory_indexer.c:77:9: warning: incompatible implicit declaration of built-in function 'free'
lib\memory_indexer\memory_indexer.c:77:9: note: include '<stdlib.h>' or provide a declaration of 'free'
lib\memory_indexer\memory_indexer.c:79:12: warning: 'return' with a value, in function returning void [-Wreturn-type]
79 | return NULL;
| ^~~~
lib\memory_indexer\memory_indexer.c:68:6: note: declared here
68 | void memory_indexer_remove(memory_indexer_t *indexer, size_t key)
| ^~~~~~~~~~~~~~~~~~~~~
lib\memory_indexer\memory_indexer.c: In function 'memory_indexer_free':
lib\memory_indexer\memory_indexer.c:85:35: warning: initialization of 'struct avl_node_t *' from incompatible pointer type 'struct avl_node *' [-Wincompatible-pointer-types]
85 | struct avl_node_t *avl_node = avl_first(&indexer->avl_tree);
| ^~~~~~~~~
lib\memory_indexer\memory_indexer.c:89:29: warning: passing argument 1 of 'avl_next' from incompatible pointer type [-Wincompatible-pointer-types]
89 | avl_node = avl_next(avl_node);
| ^~~~~~~~
| |
| struct avl_node_t *
In file included from lib\memory_indexer\memory_indexer.c:3:
lib\avltree/avltree.h:92:44: note: expected 'struct avl_node *' but argument is of type 'struct avl_node_t *'
92 | struct avl_node* avl_next(struct avl_node *node);
| ~~~~~~~~~~~~~~~~~^~~~
lib\memory_indexer\memory_indexer.c:89:18: warning: assignment to 'struct avl_node_t *' from incompatible pointer type 'struct avl_node *' [-Wincompatible-pointer-types]
89 | avl_node = avl_next(avl_node);
| ^
Compiling .pio\build\native\lib8b6\lru_cache\lru_cache.o
Compiling .pio\build\native\lib799\HimemAllocator\himem_access\emulated_himem.o
lib\lru_cache\lru_cache.c: In function 'lru_cache_flush_items':
lib\lru_cache\lru_cache.c:108:64: warning: passing argument 2 of 'memory_indexer_remove' makes integer from pointer without a cast [-Wint-conversion]
108 | memory_indexer_remove(cache->memory_indexer, cache_item->key);
| ~~~~~~~~~~^~~~~
| |
| void *
In file included from lib\lru_cache\lru_cache.c:5:
lib\memory_indexer/memory_indexer.h:12:62: note: expected 'size_t' {aka 'long long unsigned int'} but argument is of type 'void *'
12 | void memory_indexer_remove(memory_indexer_t *indexer, size_t key);
| ~~~~~~~^~~
Compiling .pio\build\native\lib799\HimemAllocator\himem_access\esp32_himem.o
Archiving .pio\build\native\libbb7\libmemory_indexer.a
Archiving .pio\build\native\libf7f\libavltree.a
Indexing .pio\build\native\libbb7\libmemory_indexer.a
Archiving .pio\build\native\lib8b6\liblru_cache.a
Compiling .pio\build\native\lib799\HimemAllocator\himem_allocator.o
Indexing .pio\build\native\libf7f\libavltree.a
In file included from src\temu.c:81:
lib\simpleconsole/simpleconsole.h: In function 'simple_console_get_size':
lib\simpleconsole/simpleconsole.h:87:20: warning: unused variable 'ws' [-Wunused-variable]
87 | struct winsize ws;
| ^~
src\temu.c: In function 'main':
src\temu.c:768:34: warning: variable 'build_preload_file' set but not used [-Wunused-but-set-variable]
768 | const char *path, *cmdline, *build_preload_file;
| ^~~~~~~~~~~~~~~~~~
Indexing .pio\build\native\lib8b6\liblru_cache.a
Compiling .pio\build\native\libb0a\page_cache\page_cache.o
Compiling .pio\build\native\lib9c7\VMM\vmm.o
lib\page_cache\page_cache.c:28:1: warning: no semicolon at end of struct or union
28 | };
| ^
lib\page_cache\page_cache.c: In function 'on_page_flush':
lib\page_cache\page_cache.c:46:26: warning: passing argument 1 of 'page_cache->on_flush' makes integer from pointer without a cast [-Wint-conversion]
46 | page_cache->on_flush(key,page_cache->flush_buffer, page_cache->flush_context);
| ^~~
| |
| void *
lib\page_cache\page_cache.c:46:26: note: expected 'size_t' {aka 'long long unsigned int'} but argument is of type 'void *'
lib\page_cache\page_cache.c: In function 'page_cache_get':
lib\page_cache\page_cache.c:73:86: warning: passing argument 2 of 'direct_cache_get' makes pointer from integer without a cast [-Wint-conversion]
73 | struct page_cache_item_t *page_item = direct_cache_get(page_cache->direct_cache, page_number);
| ^~~~~~~~~~~
| |
| size_t {aka long long unsigned int}
In file included from lib\page_cache\page_cache.c:10:
lib\direct_cache/direct_cache.h:10:53: note: expected 'void *' but argument is of type 'size_t' {aka 'long long unsigned int'}
10 | void *direct_cache_get(direct_cache_t *cache, void *key);
| ~~~~~~^~~
lib\page_cache\page_cache.c:75:58: warning: passing argument 2 of 'lru_cache_get' makes pointer from integer without a cast [-Wint-conversion]
75 | page_item = lru_cache_get(page_cache->lru_cache, page_number);
| ^~~~Compiling .pio\build\native\libdb7\virtual_directory\virtual_directory.o
~~~~~~~
| |
| size_t {aka long long unsigned int}
In file included from lib\page_cache\page_cache.c:9:
lib\lru_cache/lru_cache.h:14:43: note: expected 'void *' but argument is of type 'size_t' {aka 'long long unsigned int'}
14 | void *lru_cache_get(cache_t *cache, void *key);
| ~~~~~~^~~
Compiling .pio\build\native\lib226\tinyemu\aes.o
lib\page_cache\page_cache.c: In function 'page_cache_set':
lib\page_cache\page_cache.c:91:86: warning: passing argument 2 of 'direct_cache_get' makes pointer from integer without a cast [-Wint-conversion]
91 | struct page_cache_item_t *page_item = direct_cache_get(page_cache->direct_cache, page_number);
| ^~~~~~~~~~~
| |
| size_t {aka long long unsigned int}
In file included from lib\page_cache\page_cache.c:10:
Archiving .pio\build\native\libb0a\libpage_cache.a
lib\direct_cache/direct_cache.h:10:53: note: expected 'void *' but argument is of type 'size_t' {aka 'long long unsigned int'}
10 | void *direct_cache_get(direct_cache_t *cache, void *key);
| ~~~~~~^~~
Archiving .pio\build\native\lib799\libHimemAllocator.a
lib\page_cache\page_cache.c:93:58: warning: passing argument 2 of 'lru_cache_get' makes pointer from integer without a cast [-Wint-conversion]
Compiling .pio\build\native\lib226\tinyemu\cutils.o
93 | page_item = lru_cache_get(page_cache->lru_cache, page_number);
Indexing .pio\build\native\libb0a\libpage_cache.a
| ^~~~~~~~~Archiving .pio\build\native\libdb7\libvirtual_directory.a
~~
Indexing .pio\build\native\lib799\libHimemAllocator.a
| |
Compiling .pio\build\native\lib226\tinyemu\fs.o
| size_t {aka long long unsigned int}
Indexing .pio\build\native\libdb7\libvirtual_directory.a
In file included from lib\page_cache\page_cache.c:9:
lib\lru_cache/lru_cache.h:14:43: note: expected 'void *' but argument is of type 'size_t' {aka 'long long unsigned int'}
14 | void *lru_cache_get(cache_t *cache, void *key);
| ~~~~~~^~~
lib\page_cache\page_cache.c:116:62: warning: passing argument 2 of 'lru_cache_remove' makes pointer from integer without a cast [-Wint-conversion]
116 | lru_cache_remove(page_cache->lru_cache, page_item->page_number);
| ~~~~~~~~~^~~~~~~~~~~~~
| |
| size_t {aka long long unsigned int}
In file included from lib\page_cache\page_cache.c:9:
lib\lru_cache/lru_cache.h:18:46: note: expected 'void *' but argument is of type 'size_t' {aka 'long long unsigned int'}
18 | void lru_cache_remove(cache_t * cache, void* key);
| ~~~~~~^~~
lib\page_cache\page_cache.c:117:68: warning: passing argument 2 of 'direct_cache_remove' makes pointer from integer without a cast [-Wint-conversion]
117 | direct_cache_remove(page_cache->direct_cache, page_item->page_number);
| ~~~~~~~~~^~~~~~~~~~~~~
Compiling .pio\build\native\lib226\tinyemu\fs_utils.o
| |
Compiling .pio\build\native\lib226\tinyemu\ide.o
| size_t {aka long long unsigned int}
In file included from lib\page_cache\page_cache.c:10:
Compiling .pio\build\native\lib226\tinyemu\iomem.o
lib\direct_cache/direct_cache.h:13:55: note: expected 'void *' but argument is of type 'size_t' {aka 'long long unsigned int'}
13 | void direct_cache_remove(direct_cache_t *cache, void *key);
Compiling .pio\build\native\lib226\tinyemu\json.o
| ~~~~~~^~~
Compiling .pio\build\native\lib226\tinyemu\machine.o
lib\page_cache\page_cache.c:127:46: warning: passing argument 2 of 'lru_cache_add' makes pointer from integer without a cast [-Wint-conversion]
127 | lru_cache_add(page_cache->lru_cache, page_number, page_item);
| ^~~~~~~~~~~
| |
| size_t {aka long long unsigned int}
In file included from lib\page_cache\page_cache.c:9:
lib\lru_cache/lru_cache.h:23:42: note: expected 'void *' but argument is of type 'size_t' {aka 'long long unsigned int'}
23 | void lru_cache_add(cache_t *cache, void *key, void *value);
| ~~~~~~^~~
Compiling .pio\build\native\lib226\tinyemu\pci.o
lib\page_cache\page_cache.c:128:51: warning: passing argument 2 of 'direct_cache_set' makes pointer from integer without a cast [-Wint-conversion]
Compiling .pio\build\native\lib226\tinyemu\pckbd.o
128 | direct_cache_set(page_cache->direct_cache,page_number, page_item);
| ^~~~~~~~~~Compiling .pio\build\native\lib226\tinyemu\ps2.o
~
| |
| size_t {aka long long unsigned int}
In file included from lib\page_cache\page_cache.c:10:
lib\direct_cache/direct_cache.h:12:52: note: expected 'void *' but argument is of type 'size_t' {aka 'long long unsigned int'}
12 | void direct_cache_set(direct_cache_t *cache, void *key, void *value);
| ~~~~~~Archiving .pio\build\native\lib9c7\libVMM.a
^~~
lib\tinyemu\iomem.c: In function 'phys_mem_get_ram_ptr':
lib\tinyemu\iomem.c:289:20: warning: initialization of 'uint64_t' {aka 'long long unsigned int'} from 'uint8_t *' {aka 'unsigned char *'} makes integer from pointer without a cast [-Wint-conversion]
289 | uint64_t ptr = pr->phys_mem + /*(uintptr_t)*/offset;
| ^~
Compiling .pio\build\native\lib226\tinyemu\riscv_cpu128.o
lib\VMM\vmm.c: In function 'backing_store_write':
Indexing .pio\build\native\lib9c7\libVMM.a
lib\VMM\vmm.c:115:49: warning: passing argument 3 of 'page_cache_set' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
115 | page_cache_set(vmm->page_cache,page_number, buf);
Compiling .pio\build\native\lib226\tinyemu\riscv_cpu32.o
| ^~~
In file included from lib\VMM\vmm.h:9,
from lib\VMM\vmm.c:1:
Compiling .pio\build\native\lib226\tinyemu\riscv_cpu64.o
lib\page_cache/page_cache.h:17:73: note: expected 'void *' but argument is of type 'const uint8_t *' {aka 'const unsigned char *'}
17 | void page_cache_set(page_cache_t *page_cache, size_t page_number, void *buff);
| ~~~~~~^~~~
lib\tinyemu\ide.c: In function 'padstr':
lib\tinyemu\ide.c:244:19: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
244 | *(char *)((long)str ^ 1) = v;
| ^
lib\tinyemu\ide.c:244:10: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
Compiling .pio\build\native\lib226\tinyemu\riscv_machine.o
244 | *(char *)((long)str ^ 1) = v;
| ^
Compiling .pio\build\native\lib226\tinyemu\sha256.o
Compiling .pio\build\native\lib226\tinyemu\simplefb.o
Compiling .pio\build\native\lib226\tinyemu\softfp.o
Compiling .pio\build\native\lib226\tinyemu\splitimg.o
lib\tinyemu\riscv_machine.c:87:5: error: redefinition of 'clock_gettime'
87 | int clock_gettime(int x, struct timespec *spec) //C-file part
| ^~~~~~~~~~~~~
In file included from C:/TDM-GCC-64/x86_64-w64-mingw32/include/time.h:308,
from lib\tinyemu\riscv_machine.c:33:
C:/TDM-GCC-64/x86_64-w64-mingw32/include/pthread_time.h:115:12: note: previous definition of 'clock_gettime' was here
115 | inline int clock_gettime(__winpthreads_clockid_t clock_id, struct timespec *tp) { return __pthread_clock_gettime(clock_id, tp); }
| ^~~~~~~~~~~~~
*** [.pio\build\native\lib226\tinyemu\riscv_machine.o] Error 1
===================================================== [FAILED] Took 15.44 seconds =====================================================
Does the esp board need an SDCard?
First of all I would like to say that you have done an incredible job porting linux to esp32. Because all the other options I found only support esp32-s3.
Device: esp32-WROOM-32
I tried:
export MAKEFLAGS '-j1'
use bash shell instead fish
reinstall platformio
reinstall esp-idf
run idf.py -p /dev/ttyUSB0 flash
after pio run -e esp32 -t upload
failed
here is full log of pio run -e esp32 -t upload > esp32-tinyemu.log 2>&1
esp32-tinyemu.log
Hello:
On Windows, what compiler is used to compile?
Where can I find your cmake file?
Thank you,
Mong
the full build log was
Processing native (platform: native)
--------------------------------------------------------------------------------------------------------------------------------Verbose mode can be enabled via `-v, --verbose` option
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 15 compatible libraries
Scanning dependencies...
Dependency Graph
|-- tinyemu @ 1.0.0
| |-- VMM
| | |-- direct_cache
| | |-- log_c
| | |-- lru_cache
| | | |-- list @ 0.2.0
| | | |-- memory_indexer
| | | | |-- avltree @ 1
| | |-- page_cache
| | | |-- direct_cache
| | | |-- HimemAllocator
| | | |-- lru_cache
| | | | |-- list @ 0.2.0
| | | | |-- memory_indexer
| | | | | |-- avltree @ 1
| | |-- list @ 0.2.0
| |-- virtual_directory
|-- sdmount
| |-- virtual_directory
|-- log_c
|-- simpleconsole
| |-- tinyemu @ 1.0.0
| | |-- VMM
| | | |-- direct_cache
| | | |-- log_c
| | | |-- lru_cache
| | | | |-- list @ 0.2.0
| | | | |-- memory_indexer
| | | | | |-- avltree @ 1
| | | |-- page_cache
| | | | |-- direct_cache
| | | | |-- HimemAllocator
| | | | |-- lru_cache
| | | | | |-- list @ 0.2.0
| | | | | |-- memory_indexer
| | | | | | |-- avltree @ 1
| | | |-- list @ 0.2.0
| | |-- virtual_directory
|-- uartconsole
| |-- tinyemu @ 1.0.0
| | |-- VMM
| | | |-- direct_cache
| | | |-- log_c
| | | |-- lru_cache
| | | | |-- list @ 0.2.0
| | | | |-- memory_indexer
| | | | | |-- avltree @ 1
| | | |-- page_cache
| | | | |-- direct_cache
| | | | |-- HimemAllocator
| | | | |-- lru_cache
| | | | | |-- list @ 0.2.0
| | | | | |-- memory_indexer
| | | | | | |-- avltree @ 1
| | | |-- list @ 0.2.0
| | |-- virtual_directory
|-- virtual_directory
Building in release mode
Compiling .pio\build\native\src\temu.o
Compiling .pio\build\native\lib22a\direct_cache\direct_cache.o
Compiling .pio\build\native\libce4\log_c\log.o
lib\direct_cache\direct_cache.c: In function 'direct_cache_init':
lib\direct_cache\direct_cache.c:24:29: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
cache->cache[i].key = i + 1;
^
lib\direct_cache\direct_cache.c: In function 'direct_cache_remove':
lib\direct_cache\direct_cache.c:50:28: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
cache->cache[cell].key = cell + 1;
^
Compiling .pio\build\native\libf93\list\llist.o
Archiving .pio\build\native\lib22a\libdirect_cache.a
Indexing .pio\build\native\lib22a\libdirect_cache.a
Archiving .pio\build\native\libce4\liblog_c.a
Compiling .pio\build\native\libf93\list\llist_iterator.o
Indexing .pio\build\native\libce4\liblog_c.a
Compiling .pio\build\native\libf93\list\llist_node.o
In file included from src\temu.c:81:0:
lib\simpleconsole/simpleconsole.h: In function 'simple_console_get_size':
lib\simpleconsole/simpleconsole.h:87:20: warning: unused variable 'ws' [-Wunused-variable]
struct winsize ws;
^~
src\temu.c: In function 'block_device_init':
src\temu.c:409:17: warning: implicit declaration of function 'ftello' [-Wimplicit-function-declaration]
file_size = ftello(f);
^~~~~~
src\temu.c: In function 'main':
src\temu.c:768:34: warning: variable 'build_preload_file' set but not used [-Wunused-but-set-variable]
const char *path, *cmdline, *build_preload_file;
^~~~~~~~~~~~~~~~~~
Compiling .pio\build\native\lib979\avltree\avltree.o
Compiling .pio\build\native\lib1f2\memory_indexer\memory_indexer.o
Archiving .pio\build\native\libf93\liblist.a
Compiling .pio\build\native\lib43b\lru_cache\lru_cache.o
lib\memory_indexer\memory_indexer.c: In function 'memory_indexer_init':
lib\memory_indexer\memory_indexer.c:34:53: warning: implicit declaration of function 'malloc' [-Wimplicit-function-declaration]
memory_indexer_t *indexer = (memory_indexer_t *)malloc(sizeof(memory_indexer_t));
^~~~~~
lib\memory_indexer\memory_indexer.c:34:53: warning: incompatible implicit declaration of built-in function 'malloc'
lib\memory_indexer\memory_indexer.c:34:53: note: include '<stdlib.h>' or provide a declaration of 'malloc'
lib\memory_indexer\memory_indexer.c: In function 'memory_indexer_set':
lib\memory_indexer\memory_indexer.c:44:67: warning: incompatible implicit declaration of built-in function 'malloc'
struct memory_wrapper *memory_item = (struct memory_wrapper *)malloc(sizeof(struct memory_wrapper));
^~~~~~
lib\memory_indexer\memory_indexer.c:44:67: note: include '<stdlib.h>' or provide a declaration of 'malloc'
lib\memory_indexer\memory_indexer.c: In function 'memory_indexer_search':
lib\memory_indexer\memory_indexer.c:60:35: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types] struct avl_node_t *avl_node = avl_search(&indexer->avl_tree, &query.avl, cmp_func);
^~~~~~~~~~
lib\memory_indexer\memory_indexer.c: In function 'memory_indexer_remove':
lib\memory_indexer\memory_indexer.c:72:35: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types] struct avl_node_t *avl_node = avl_search(&indexer->avl_tree, &query.avl, cmp_func);
^~~~~~~~~~
lib\memory_indexer\memory_indexer.c:76:40: warning: passing argument 2 of 'avl_remove' from incompatible pointer type [-Wincompatible-pointer-types]
avl_remove(&indexer->avl_tree, avl_node);
^~~~~~~~
In file included from lib\memory_indexer\memory_indexer.c:3:0:
lib\avltree/avltree.h:88:6: note: expected 'struct avl_node *' but argument is of type 'struct avl_node_t *'
void avl_remove(struct avl_tree *tree,
^~~~~~~~~~
lib\memory_indexer\memory_indexer.c:77:9: warning: implicit declaration of function 'free' [-Wimplicit-function-declaration]
free(wrapper);
^~~~
lib\memory_indexer\memory_indexer.c:77:9: warning: incompatible implicit declaration of built-in function 'free'
lib\memory_indexer\memory_indexer.c:77:9: note: include '<stdlib.h>' or provide a declaration of 'free'
lib\memory_indexer\memory_indexer.c:79:12: warning: 'return' with a value, in function returning void
return NULL;
^~~~
lib\memory_indexer\memory_indexer.c:68:6: note: declared here
void memory_indexer_remove(memory_indexer_t *indexer, uint64_t key)
^~~~~~~~~~~~~~~~~~~~~
lib\memory_indexer\memory_indexer.c: In function 'memory_indexer_free':
lib\memory_indexer\memory_indexer.c:85:35: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types] struct avl_node_t *avl_node = avl_first(&indexer->avl_tree);
^~~~Indexing .pio\build\native\libf93\liblist.a
~~~~~
lib\memory_indexer\memory_indexer.c:89:29: warning: passing argument 1 of 'avl_next' from incompatible pointer type [-Wincompatible-pointer-types]
avl_node = avl_next(avl_node);
^~~~~~~~
In file included from lib\memory_indexer\memory_indexer.c:3:0:
lib\avltree/avltree.h:92:18: note: expected 'struct avl_node *' but argument is of type 'struct avl_node_t *'
struct avl_node* avl_next(struct avl_node *node);
^~~~Compiling .pio\build\native\lib6f5\HimemAllocator\himem_access\emulated_himem.o
~~~~
Archiving .pio\build\native\lib1f2\libmemory_indexer.a
lib\memory_indexer\memory_indexer.c:89:18: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
avl_node = avl_next(avl_node);
^
lib\lru_cache\lru_cache.c: In function 'lru_cache_flush_items':
lib\lru_cache\lru_cache.c:104:54: warning: passing argument 2 of 'memory_indexer_remove' makes integer from pointer without a cast [-Wint-conversion]
memory_indexer_remove(cache->memory_indexer, cache_item->key);
^~~~~~~~~Indexing .pio\build\native\lib1f2\libmemory_indexer.a
~
Archiving .pio\build\native\lib43b\liblru_cache.a
In file included from lib\lru_cache\lru_cache.c:5:0:
lib\memory_indexer/memory_indexer.h:12:6: note: expected 'uint64_t {aka long long unsigned int}' but argument is of type 'void *'
void memory_indexer_remove(memory_indexer_t *indexer, uint64_t key);
^~~~~~~~~~Indexing .pio\build\native\lib43b\liblru_cache.a
~~~~~~~~~~~
Compiling .pio\build\native\lib6f5\HimemAllocator\himem_access\esp32_himem.o
Archiving .pio\build\native\lib979\libavltree.a
Compiling .pio\build\native\lib6f5\HimemAllocator\himem_allocator.o
Indexing .pio\build\native\lib979\libavltree.a
Compiling .pio\build\native\libf1b\page_cache\page_cache.o
Compiling .pio\build\native\lib6c6\VMM\vmm.o
lib\page_cache\page_cache.c:28:1: warning: no semicolon at end of struct or union
};
^
lib\page_cache\page_cache.c: In function 'on_page_flush':
lib\page_cache\page_cache.c:46:26: warning: passing argument 1 of 'page_cache->on_flush' makes integer from pointer without a cast [-Wint-conversion]
page_cache->on_flush(key,page_cache->flush_buffer, page_cache->flush_context);
^~~
lib\page_cache\page_cache.c:46:26: note: expected 'uint64_t {aka long long unsigned int}' but argument is of type 'void *'
lib\page_cache\page_cache.c: In function 'page_cache_get':
lib\page_cache\page_cache.c:73:86: warning: passing argument 2 of 'direct_cache_get' makes pointer from integer without a cast [-Wint-conversion]
struct page_cache_item_t *page_item = direct_cache_get(page_cache->direct_cache, page_number);
^~~~~~~~~~~
In file included from lib\page_cache\page_cache.c:10:0:
lib\direct_cache/direct_cache.h:10:7: note: expected 'void *' but argument is of type 'uint64_t {aka long long unsigned int}'
void *direct_cache_get(direct_cache_t *cache, void *key);
^~~~~~~~~~~~~~~~
lib\page_cache\page_cache.c:75:58: warning: passing argument 2 of 'lru_cache_get' makes pointer from integer without a cast [-Wint-conversion]
page_item = lru_cache_get(page_cache->lru_cache, page_number);
^~~~~~~~~~~
In file included from lib\page_cache\page_cache.c:9:0:
lib\lru_cache/lru_cache.h:12:7: note: expected 'void *' but argument is of type 'uint64_t {aka long long unsigned int}'
void *lru_cache_get(cache_t *cache, void *key);
^~~~~~~~~~~~~
lib\page_cache\page_cache.c: In function 'page_cache_set':
lib\page_cache\page_cache.c:91:86: warning: passing argument 2 of 'direct_cache_get' makes pointer from integer without a cast [-Wint-conversion]
struct page_cache_item_t *page_item = direct_cache_get(page_cache->direct_cache, page_number);
^~~~~~~~~~~
In file included from lib\page_cache\page_cache.c:10:0:
lib\direct_cache/direct_cache.h:10:7: note: expected 'void *' but argument is of type 'uint64_t {aka long long unsigned int}'
void *direct_cache_get(direct_cache_t *cache, void *key);
^~~~~~~~~~~~~~~~
lib\page_cache\page_cache.c:93:58: warning: passing argument 2 of 'lru_cache_get' makes pointer from integer without a cast [-Wint-conversion]
page_item = lru_cache_get(page_cache->lru_cache, page_number);
^~~~~~~~~~~
In file included from lib\page_cache\page_cache.c:9:0:
lib\lru_cache/lru_cache.h:12:7: note: expected 'void *' but argument is of type 'uint64_t {aka long long unsigned int}'
void *lru_cache_get(cache_t *cache, void *key);
^~~~~~~~~~~~~
lib\page_cache\page_cache.c:116:53: warning: passing argument 2 of 'lru_cache_remove' makes pointer from integer without a cast
[-Wint-conversion]
lru_cache_remove(page_cache->lru_cache, page_item->page_number);
^~~~~~~~~Compiling .pio\build\native\lib49c\virtual_directory\virtual_directory.o
In file included from lib\page_cache\page_cache.c:9:0:
lib\lru_cache/lru_cache.h:16:6: note: expected 'void *' but argument is of type 'uint64_t {aka long long unsigned int}'
Archiving .pio\build\native\lib6f5\libHimemAllocator.a
void lru_cache_remove(cache_t * cache, void* key);
^~~~~~~~~~~~~~~~Indexing .pio\build\native\lib6f5\libHimemAllocator.a
lib\page_cache\page_cache.c:117:59: warning: passing argument 2 of 'direct_cache_remove' makes pointer from integer without a cast [-Wint-conversion]
Archiving .pio\build\native\libf1b\libpage_cache.a
direct_cache_remove(page_cache->direct_cache, page_item->page_number);
^~~~~~~~~
In file included from lib\page_cache\page_cache.c:10:0:
lib\direct_cache/direct_cache.h:13:6: note: expected 'void *' but argument is of type 'uint64_t {aka long long unsigned int}'
Indexing .pio\build\native\libf1b\libpage_cache.a
void direct_cache_remove(direct_cache_t *cache, void *key);
^~~~~~~~~~~~~~~~~~~
Compiling .pio\build\native\lib99c\tinyemu\aes.o
lib\page_cache\page_cache.c:127:46: warning: passing argument 2 of 'lru_cache_add' makes pointer from integer without a cast [-Wint-conversion]
lru_cache_add(page_cache->lru_cache, page_number, page_item);
^~~~~~~~~~~
In file included from lib\page_cache\page_cache.c:9:0:
lib\lru_cache/lru_cache.h:21:6: note: expected 'void *' but argument is of type 'uint64_t {aka long long unsigned int}'
void lru_cache_add(cache_t *cache, void *key, void *value);
^~~~~~~~~~~~~
lib\page_cache\page_cache.c:128:51: warning: passing argument 2 of 'direct_cache_set' makes pointer from integer without a cast
[-Wint-conversion]
direct_cache_set(page_cache->direct_cache,page_number, page_item);
^~~~~~~~~~~
In file included from lib\page_cache\page_cache.c:10:0:
lib\direct_cache/direct_cache.h:12:6: note: expected 'void *' but argument is of type 'uint64_t {aka long long unsigned int}'
void direct_cache_set(direct_cache_t *cache, void *key, void *value);
^~~~~~~~~~~~~~~~
Archiving .pio\build\native\lib49c\libvirtual_directory.a
lib\VMM\vmm.c: In function 'get_TLB':
lib\VMM\vmm.c:70:60: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
vmTable_t *value = direct_cache_get(vmm->direct_cache, (void *)page_number);
^
lib\VMM\vmm.c:76:43: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
value = lru_cache_get(vmm->lru_cache, (void *)page_number);
^
lib\VMM\vmm.c: In function 'backing_store_write':
lib\VMM\vmm.c:115:49: warning: passing argument 3 of 'page_cache_set' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
page_cache_set(vmm->page_cache,page_number, buf);
^~~
In file included from lib\VMM\vmm.h:9:0,
from lib\VMM\vmm.c:1:
lib\page_cache/page_cache.h:17:6: note: expected 'void *' but argument is of type 'const uint8_t * {aka const unsigned char *}'
void page_cache_set(page_cache_t *page_cache, uint64_t page_number, void *buff);
^~~~~~~~~~~~~~
lib\VMM\vmm.c: In function 'free_vmtable':
lib\VMM\vmm.c:164:38: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
lru_cache_remove(vmm->lru_cache, (void *)entry->page_number);
^
lib\VMM\vmm.c:165:44: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
direct_cache_remove(vmm->direct_cache, (void *)entry->page_number);
^
Compiling .pio\build\native\lib99c\tinyemu\cutils.o
lib\VMM\vmm.c: In function 'get_page':
lib\VMM\vmm.c:424:39: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
lru_cache_add(vmm->lru_cache, (void *)page_number, page);
^
lib\VMM\vmm.c:425:45: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
direct_cache_set(vmm->direct_cache, (void *)page_number, page);
^
Indexing .pio\build\native\lib49c\libvirtual_directory.a
Compiling .pio\build\native\lib99c\tinyemu\fs.o
Archiving .pio\build\native\lib6c6\libVMM.a
Compiling .pio\build\native\lib99c\tinyemu\fs_utils.o
Indexing .pio\build\native\lib6c6\libVMM.a
Compiling .pio\build\native\lib99c\tinyemu\ide.o
Compiling .pio\build\native\lib99c\tinyemu\iomem.o
Compiling .pio\build\native\lib99c\tinyemu\json.o
lib\tinyemu\iomem.c: In function 'phys_mem_get_ram_ptr':
lib\tinyemu\iomem.c:289:20: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
uint64_t ptr = pr->phys_mem + /*(uintptr_t)*/offset;
^~
lib\tinyemu\iomem.c:290:12: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
return (uint8_t*)ptr;
^
Compiling .pio\build\native\lib99c\tinyemu\machine.o
Compiling .pio\build\native\lib99c\tinyemu\pci.o
Compiling .pio\build\native\lib99c\tinyemu\pckbd.o
lib\tinyemu\machine.c: In function 'cmdline_subst':
lib\tinyemu\machine.c:157:17: warning: implicit declaration of function 'localtime_r' [-Wimplicit-function-declaration]
localtime_r(&ti, &tm);
^~~~~~~~~~~
Compiling .pio\build\native\lib99c\tinyemu\ps2.o
Compiling .pio\build\native\lib99c\tinyemu\riscv_cpu128.o
Compiling .pio\build\native\lib99c\tinyemu\riscv_cpu32.o
Compiling .pio\build\native\lib99c\tinyemu\riscv_cpu64.o
Compiling .pio\build\native\lib99c\tinyemu\riscv_machine.o
Compiling .pio\build\native\lib99c\tinyemu\sha256.o
lib\tinyemu\riscv_machine.c: In function 'rtc_get_real_time':
lib\tinyemu\riscv_machine.c:103:19: error: 'CLOCK_MONOTONIC' undeclared (first use in this function)
clock_gettime(CLOCK_MONOTONIC, &ts);
^~~~~~~~~~~~~~~
lib\tinyemu\riscv_machine.c:103:19: note: each undeclared identifier is reported only once for each function it appears in
lib\tinyemu\riscv_machine.c: In function 'copy_bios':
lib\tinyemu\riscv_machine.c:952:73: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
printf("writing jump address ram ptr: 0x%" PRIx64 " phy: 0x%p\r\n", (uint64_t)ram_ptr - (uint64_t)pr->phys_mem, pr->phys_mem);
^
lib\tinyemu\riscv_machine.c:952:94: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
printf("writing jump address ram ptr: 0x%" PRIx64 " phy: 0x%p\r\n", (uint64_t)ram_ptr - (uint64_t)pr->phys_mem, pr->phys_mem);
^
In file included from lib\tinyemu\riscv_cpu.c:51:0,
from lib\tinyemu\riscv_cpu32.c:2:
lib\tinyemu\riscv_cpu.c: In function 'riscv32_read_slow':
lib\tinyemu\riscv_cpu_priv.h:291:20: warning: 'val' may be used uninitialized in this function [-Wmaybe-uninitialized]
mem_uint_t val;\
^~~
lib\tinyemu\riscv_cpu_priv.h:291:20: note: 'val' was declared here
mem_uint_t val;\
^
lib\tinyemu\riscv_cpu_priv.h:307:1: note: in expansion of macro 'TARGET_READ_WRITE'
TARGET_READ_WRITE(8, uint8_t, 0)
^~~~~~~~~~~~~~~~~
In file included from lib\tinyemu\riscv_cpu32.c:2:0:
lib\tinyemu\riscv_cpu.c:375:27: warning: 'val' may be used uninitialized in this function [-Wmaybe-uninitialized]
ret = (v0 >> (al * 8)) | (v1 << (64 - al * 8));
~~~~^~~~~~~~~~~~
*** [.pio\build\native\lib99c\tinyemu\riscv_machine.o] Error 1
In file included from lib\tinyemu\riscv_cpu.c:51:0,
from lib\tinyemu\riscv_cpu64.c:2:
lib\tinyemu\riscv_cpu.c: In function 'riscv64_read_slow':
lib\tinyemu\riscv_cpu_priv.h:291:20: warning: 'val' may be used uninitialized in this function [-Wmaybe-uninitialized]
mem_uint_t val;\
^~~
lib\tinyemu\riscv_cpu_priv.h:291:20: note: 'val' was declared here
mem_uint_t val;\
^
lib\tinyemu\riscv_cpu_priv.h:307:1: note: in expansion of macro 'TARGET_READ_WRITE'
TARGET_READ_WRITE(8, uint8_t, 0)
^~~~~~~~~~~~~~~~~
In file included from lib\tinyemu\riscv_cpu64.c:2:0:
lib\tinyemu\riscv_cpu.c:375:27: warning: 'val' may be used uninitialized in this function [-Wmaybe-uninitialized]
ret = (v0 >> (al * 8)) | (v1 << (64 - al * 8));
~~~~^~~~~~~~~~~~
================================================= [FAILED] Took 14.07 seconds =================================================
Environment Status Duration
------------- -------- ------------
native FAILED 00:00:14.073
============================================ 1 failed, 0 succeeded in 00:00:14.073 ============================================
* The terminal process "C:\Users\shrey\.platformio\penv\Scripts\platformio.exe 'run', '--target', 'upload'" terminated with exit code: 1.
* Terminal will be reused by tasks, press any key to close it.
I have the above display / ESP32 combo, and I'm wondering how I would go about adapting the code to work on it. I understand that the SD card pins would have to be reassigned; how would I get the terminal to be outputted to the e-paper display? Is this trivial or more complicated than I am understanding?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.