小编Cha*_*ohr的帖子

如何在 Wasm 中制作协程?

我试图允许用户在 C 中调用“main”并让“main”等待 requestAnimationFrame 继续执行。即 main 可以有一个 while(1) 循环,而在 main 中,会有一个“waitForAnimationFrame”...或者允许实现像 sleep(...) 这样的函数。

我一直在挖掘 emscripten 如何实际执行此操作的内部工作原理,但它看起来不太适合我的目的。这个页面涉及了许多与我想做的事情非常接近的事情,但是当以这种方式实现时,它们似乎都没有实际工作。https://kripken.github.io/blog/wasm/2019/07/16/asyncify.html

更具体地说,似乎最好的方法是保存堆栈,然后通过 Wasm 中的虚拟函数“返回”,然后当事件在 javascript 中发生时,我可以调用一个虚拟函数但返回到正确的位置。但是,这将需要调用堆栈,它似乎不是实际的一部分STACKTOP,或者通过stackSave和可用stackRestore。最值得注意的是,无论我似乎做什么似乎都setThrew不起作用。即它只是立即返回。

我还尝试使用一些启动/停止展开功能,但由于从 Javascript 返回到 Wasm 时出现错误,因此无法在那里取得进展。

这里有什么想法吗?我真的不能像某些人想要的那样使 main 异步并期望它仍然以相同的方式工作。

编辑:好的,这是我正在测试的一些示例。

示例 1:保存/恢复堆栈

在 C 中有这两个函数:

void waittask()
{
    volatile int sentinel = 85755555;
    consolelog("waittask1");
    waitout();
    consolelog("waittask2");
}

void waitret()
{
    volatile int sentinel = 12994423;
    consolelog("waitret1");
    stacksetup(sentinel);
    stacksetup(sentinel);
    consolelog("waitret2");
}
Run Code Online (Sandbox Code Playgroud)

使用 JavaScript 函数:


            stacksetup : function() {
                console.log( "STACK SETUP" ); …
Run Code Online (Sandbox Code Playgroud)

javascript c webassembly

7
推荐指数
0
解决办法
386
查看次数

如何在 emscripten 中将多个 wasm 文件链接在一起?(不只是C)

我正在尝试使用 emscripten 将 .c 文件和 .wat 文件链接在一起,以便我可以从 c 调用本机 WebAssembly 函数。我尝试了几种方法,但似乎都不起作用。例如,如果我尝试这样的事情:

wat文件.wat

(module
  (func $addwat (param $p1 i32) (param $p2 i32) (result i32)
    local.get $p1     
    local.get $p2 
    i32.add 
  )
  (export "addwat" (func $addwat))
)
Run Code Online (Sandbox Code Playgroud)

c文件

#include <emscripten.h>

int addwat( int a, int b );
int add2( int a, int b )
{
    return a+b;
}
int add2cwat( int a, int b )
{
    return addwat( a, b );
}
Run Code Online (Sandbox Code Playgroud)
wat2wasm -r watfile.wat
emcc -o cfile.wasm cfile.c watfile.wasm -s EXPORTED_FUNCTIONS='["_add2","_add2cwat"]' -s …
Run Code Online (Sandbox Code Playgroud)

javascript c emscripten webassembly

7
推荐指数
0
解决办法
1122
查看次数

如何为 GCC 代码指定手动重定位?

我在嵌入式系统(xtensa 处理器)中遇到这样的情况,我需要手动覆盖一个符号,但该符号恰好位于另一个符号的中间。当我尝试使用-Wl,--wrap=symbol 它时,它不起作用,因为该符号不是它自己的东西。

我需要做的是指定(最好在 GCC .S 中,尽管 .c 也可以)代码的最终位置。尽管实际的符号将被编译器随机放置在某个位置,但我会将memcpy代码放置到正确的位置。

40101388 <replacement_user_vect>: 40101388: 13d100 wsr.excsave1 a0 4010138b: 002020 esync 4010138e: 011fc5 call0 4010258c <_UserExceptionVector_1>

我的问题是 GCC 创建具有相对跳转的程序集,假设代码位于闪存中的位置,而最终位置将固定在中断向量中。我如何告诉 GCC / GNU“将代码放在您想要的任何地方,但是,相信我,它实际上会从{这里}执行”

虽然我的代码位于 0x40101388(GCC 决定),但它最终将从 0x40100050 驻留并执行。如何通过告诉 GCC“将代码放在此处”来欺骗 GCC,但假装它位于“此处”

编辑:我能够解决这个问题,事实证明,我需要修改的函数单独保存在链接器脚本中。我可以在链接器脚本中将其切换出来。虽然我仍然很想知道答案,但我现在有一个解决方法。

c assembly gcc relocation

2
推荐指数
1
解决办法
4048
查看次数

标签 统计

c ×3

javascript ×2

webassembly ×2

assembly ×1

emscripten ×1

gcc ×1

relocation ×1