Maison > développement back-end > Golang > Wasm TinyGo sur PSP

Wasm TinyGo sur PSP

Susan Sarandon
Libérer: 2024-12-29 03:23:10
original
722 Les gens l'ont consulté

Je vais d'abord joindre le référentiel GitHub : wasm3-tinygo-psp.

Sujet principal

Depuis quelques temps déjà, je souhaitais faire tourner Golang sur PSP.

Cependant, la compilation native sur la PSP est impossible (probablement).

Certes, Golang prend en charge GOARCH=mipsle, mais cela suppose la présence d'un système d'exploitation. Si vous essayez d’y parvenir, vous devrez probablement emprunter un chemin très difficile et épineux.

Alors, j'ai choisi une autre voie. En d'autres termes, l'approche consiste à le convertir en WASM à l'aide de TinyGo.

Maintenant, jetons un œil au code réel.

package main

import "unsafe"

//go:wasmimport debug println
func println(ptr unsafe.Pointer, len int32)

//export start
func start() {
    main()
}

func main() {
    message := "Hello, WebAssembly, from Golang!"
    println(unsafe.Pointer(unsafe.StringData(message)), int32(len(message)))
}
Copier après la connexion

Essentiellement, nous appelons simplement les fonctions fournies par le runtime. C'est juste un exemple de Hello World.

À propos de l'exécution

Il existait également une option permettant d'utiliser Rust et wasmi pour le runtime, mais bien que cela fonctionnait sur des émulateurs comme PPSSPP, des erreurs se produisaient sur le matériel réel (comme le montre la capture d'écran ci-dessous).

Wasm TinyGo on PSP

Je soupçonne que cela peut être lié au mode noyau, mais comme je n'ai finalement pas pu le résoudre, j'ai adopté une approche différente.

En fin de compte, la combinaison de C et Wasm3 a fonctionné avec succès.

Wasm TinyGo on PSP

Concernant println, qui a été mentionné dans le code précédent, il est défini côté exécution comme suit.

#define printf pspDebugScreenPrintf

static const void* host_debug_println(IM3Runtime runtime, IM3ImportContext ctx, uint64_t *stack, void *mem)
{
    uint32_t ptr = (uint32_t) stack[0];
    uint32_t length = (uint32_t) stack[1];

    uint8_t* bytes = (uint8_t*)mem + ptr;

    char buffer[256];
    if (length >= sizeof(buffer)) {
        length = sizeof(buffer)-1;
    }
    memcpy(buffer, bytes, length);
    buffer[length] = '';

    printf("%s\n", buffer);

    return NULL;
}
Copier après la connexion

Puisqu'il ne s'agit que d'une démo, c'est tout pour le moment. Cependant, si vous enveloppez également d'autres fonctions et les rendez appelables depuis WASM, vous devriez être en mesure de développer des applications à part entière.

Défis rencontrés

Compilation croisée Wasm3

Il était nécessaire de compiler Wasm3 à l'aide de la chaîne d'outils PSP.

J'ai créé un référentiel forké pour permettre à tout le monde de configurer facilement l'environnement, alors jetez un œil pour référence : wasm3-for-psp.

Options de construction TinyGo

Au final, je me suis retrouvé avec la commande tinygo build -o hello.wasm -target=wasm -no-debug main.go, mais il m'a fallu pas mal de temps pour arriver à une commande aussi simple. J'ai encore beaucoup à apprendre.

Fonction principale d'exportation

Si vous utilisez -target=wasi, TinyGo exporte la fonction principale sous _start. Mais dans ce cas, j'ai dû définir et exporter une fonction de démarrage distincte.

Et puis...

Cette fois, j'ai utilisé TinyGo pour compiler du code Golang dans WASM, mais si d'autres langages peuvent également être compilés dans WASM, je pense qu'ils peuvent être exécutés en utilisant une méthode similaire. Je suis passionné par Golang, donc je serais heureux si quelqu'un pouvait l'essayer.

C'est tout. Merci d'avoir lu.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal