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&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那就会电压很低。

Nginx OpenResty PHP

本博客已搭建了访问地址

PHP:http://os.iwonmo.com

OpenResty:http://os.iwonmo.com/openresty

明确几个概念

Ngxin:反向代理(与之相对的是正向代理)

OpenResty:基于Nginx开发的Web平台,也可以理解为它就是Nginx只不过把Nginx增强了

PHP-FPM:PHP的进程管理器

普遍访问流程:用户 -> Ngxin -> PHP-FPM -> 数据 | 数据 -> 用户

OpenResty访问流程:用户 -> OpenResty ->数据 | 数据 -> 用户

可以看到少了PHP-FPM直接就可以把数据给用户,这样就可以去掉PHP的一些弊端。

比如高并发下PHP接受的请求多过PHP-FPM能够管理的进程会堵塞。

造成进程堵塞即使Nginx还有处理请求的能力,也得进行等待,这样Nginx的并发优势就没法体现出来。

普遍的解决方法就会不断的增加负载服务器,实际Nginx单台服务器的并发是很不错的。

但是使用PHP编写的话,就会有一些约束,这个约束来自PHP-FPM模式。

效率对比

第一张图是OpenResty,第二张图是PHP-FPM。可以发现有一个明显的激增,这个有很大概率是PHP堵塞其它请求等待。并发测试并没有太高,所以效果不是很明显,高并发下差异化会放大。