Emscripten 字符串传值

CC文件(C++)C文件(C),由于使用了string所以用CC文件代码如下

#include <stdio.h>
#include <string>
#include <emscripten/emscripten.h>
int main(int argc, char ** argv) {
    printf("Hello World\n");
}
#ifdef __cplusplus
extern "C" {
#endif
char * EMSCRIPTEN_KEEPALIVE myFunction (int i,char * argv) {
  printf("%d\n",i);
  return argv;
}
#ifdef __cplusplus
}
#endif

编译:emcc decrypt-wasm.cc -s WASM=1 -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall']"

注意这里导出了一个胶水函数:ccall,默认会生成a.out.js

Heml、JavaScript代码:

<!DOCTYPE html>
<html>
<head>
  <title></title> 
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <script type="text/javascript" src="a.out.js"></script>
  <script type="text/javascript">
    Module['onRuntimeInitialized'] = onRuntimeInitialized;
    function onRuntimeInitialized() {
      var result = Module.ccall('myFunction', // name of C function 
                                 String, // return type
                                 ['number','string'], // argument types
                                 [11,'1111']); // arguments
      console.log(UTF8ToString(result));
    }
  </script> 
</head>
<body>
</body>
</html>

效果

屏幕快照 2020-03-29 下午5.01.47.png

新版本的EMCC已经更改了一些获取返回值的方式,可以查看a.out.js导出的胶水代码,里面有一些函数返回值或者其它的处理。

传递数组

C

typedef struct 
{ 
uint32_t number;
    char* pass;
} Exxxxx;
Exxxxx * EMSCRIPTEN_KEEPALIVE cccc (int rands,char * argv) {
    Exxxxx *result = (Exxxxx *)malloc(sizeof(Exxxxx)); 
    return result;
}

JavaScript

function aaaa(_num,_str){
     var result = Module.ccall('cccc',
                                 Array, 
                                 ['number','string'], 
                                 [_num,_str]); 
          let __useless = Module.HEAPU32[result / 4],__key = UTF8ToString(Module.HEAPU32[result / 4+1] );
     return [__useless,__key];   
}


C&Rust编译wasm

不论是C或者Rust编译Wasm都可以在https://developer.mozilla.org/zh-CN/docs/WebAssembly找到很好的说明。如果你是用webpack或者rollup来进行打包JavaScript代码的话,可能你需要处理一些额外的事情,比如如何生成arrayBuffer。在尝试了一些webpack和rollup一些自带的加载器的时候出现了一些无法描述的问题,如是查看官方文档,注意到一些说明:https://developer.mozilla.org/zh-CN/docs/WebAssembly/Loading_and_running

未完待续:关注微信小程序获取访问密码 (文章ID:1738)或小程序在线阅读

从VideoJs理解Blob

Mozilla说明

Blob 对象表示一个不可变、原始数据的类文件对象。Blob 表示的不一定是JavaScript原生格式的数据。File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。      要从其他非blob对象和数据构造一个 Blob,请使用 Blob() 构造函数。要创建一个 blob 数据的子集 blob,请使用 slice() 方法。要获取用户文件系统上的文件对应的 Blob 对象,请参阅 File 文档。接受 Blob 对象的API也被列在 File 文档中。

更多的解释:https://developer.mozilla.org/zh-CN/docs/Web/API/Blob

未完待续:关注微信小程序获取访问密码 (文章ID:1732)或小程序在线阅读

VCC AVCC AREF

VCC:又叫DVCC(数字电压源),在MCU看来是数电源,因为MCU本身就是处理数字信号的。所以进入它的电源是数字电源。而在外围走的VCC可以看做是模电压源。

AVCC:模电压源。

AREF:数模转换器ADC的参考基准电压源,由于ADC转换器实际指示相对电压源的大小参考,所以它需要一个基准的电压源做参考对比大小。所以有一个基准的电压源AREF。

VCC和AVCC的连接方式需要看手册,一般是连接在一起,然后中间串联一个低通滤波器,一般可以是电感或者0欧姆的电阻,毕竟是过直流阻交流,所以电容就不合适了。然后AVCC不单单是为ADC供电源,有时候也会为端口供电,所以如果它不接电源的话,某些端口的电压就会比较低。因为是拉取的VCC的电源,如果VCC供电的一些端口做输出电压,那么AVCC供电的端口如果不接AVCCC那就会电压很低。