提交 e0a46336 编写于 作者: Y Your Name

update documents

上级 9ebaf734
......@@ -32,7 +32,20 @@ taskBus 的核心理念是 “定IO标准不定具体工具,定连接结构不
大多数现代语言支持创建子进程, 并且可以通过 "管道重定向" 技术接管子进程的标准管道。Taskbus 技术即基于此特性,从各个子进程的stdout读取数据,并转发给需要的子进程(stdin)。
### 3.1 输入输出
我们有两种开发方式:迅捷模式与标准模式。
- 迅捷模式适合那种有一路输入,和一到两路输出的情形。基于简单的管道原理就可以进行迅捷模式的模块开发。我们唯一需要做的,就是把基于键盘可见字符的输入变成基于二进制数据的读写。
- 开发出的程序可以脱离平台独立运行
- 原理与命令行管道级联一致。即 A.exe|B.exe|C.exe
- 适合构造逐级传递的线性吞吐模式。
- 标准模式适合比较复杂的逻辑, 如存在回溯和分支的逻辑。
- 需要适当的设计吞吐数据的格式。
- 支持多路输入输出
- 在平台的管理一下实现图状数据吞吐。
### 3.1 迅捷模式
#### 3.1.1 标准输入输出管道
一个实现XOR操作的教科书C程序,一般类似这样:
......@@ -63,10 +76,74 @@ Taskbus 模块的输入输出与上述程序非常类似,唯一的区别是使
fwrite(a,sizeof(int),4,stdout);
```
### 3.2 专题与通路
#### 3.1.2 fm 解调广播的例子
实现fm解调,只需要50行代码
```cpp
#include <stdio.h>
#include <math.h>
#include <io.h>
#include <fcntl.h>
#define Pi 3.14159265354
//仿matlab Angle
double angle(int x, int y)
{
double angle = 0;
//计算角度
if (x==0)
angle = (y>0)? Pi/2:-Pi/2;
else if (x >0 )
angle = atan(y*1.0/x);
else if (y >=0)
angle = atan(y*1.0/x)+Pi;
else
angle = atan(y*1.0/x)-Pi;
return angle;
}
int main()
{
short buf[128][2];
int nPts = 0;
int last_i = 0, last_q = 0;
//老师加的两行。用于在windows下吞吐二进制数据。
setmode(fileno(stdout), O_BINARY);
setmode(fileno(stdin), O_BINARY);
//算法
while ((nPts = fread(buf,4,128,stdin)))
{
short out[128];
for (int j=0;j<nPts;++j)
{
//d(phase)/d(t) = freq
int curr_i = buf[j][0];
int curr_q = buf[j][1];
int diff_i = last_i * curr_i + last_q * curr_q;
int diff_q = last_q * curr_i - last_i * curr_q;
last_i = curr_i;
last_q = curr_q;
out[j] = angle(diff_i,diff_q)/Pi*4096;
}
//输出到stdout
fwrite(out,2,nPts,stdout);
fflush(stdout);
}
return 0;
}
```
#### 3.1.3 嵌入平台
通过封装器模块 wrapper_stdio 可以直接嵌入平台中。当然,你还可以嵌入grep,aplay等标准控制台程序。
### 3.2 标准模式
#### 3.2.1 专题与通路
一个子进程只有一对输入输出管道。通过设置专题与通路,可以仅用一路管道分享多路内容。
#### 3.2.1 专题
##### 3.2.1.1 专题
专题(Subject)指示一类数据。如声卡采集的波形,以及从文件中读取的字节流。
在图形界面上,专题显示为管脚。每个专题有一个便于记忆的名字;在运行时,taskBus平台会根据连线关系,为每个专题设置一个整数ID。ID相同的输入、输出管脚会被连接起来。
......@@ -77,14 +154,14 @@ Taskbus 模块的输入输出与上述程序非常类似,唯一的区别是使
**注意:** 不同的管脚可以生产同一ID的专题,也可以监听一个相同的专题。对生产者,这样做的行为是一致的。对消费者,如何处理专题ID相同的情况,取决于模块实现者。
#### 3.2.2 通路
##### 3.2.1.2 通路
通路(PATH)在一类专题中,区分一条独立的自然时序。下面的例子中,两路声卡采集的数据汇入同一个FFT变换器。对于变换器来说,需要区分出两条自然时序,才能不导致混淆。
![Paths UI](images/Paths.png)
上图中的声卡模块采用自身的进程ID(2、6)作为通路号,这样非常便捷地标定了数据的来源。
### 3.3 带有专题和通路的IO
#### 3.2.2 带有专题和通路的IO
鉴于上面的介绍,我们在前文代码中稍加修改,即可实现基于stdio的通信。
......@@ -134,7 +211,7 @@ int main(int argc, char *argv[])
```
上述代码缺少上下文,但清晰的示意了taskBus最基本的通信原理。不同模块之间,正是通过这样的方法进行沟通的。
### 3.4 模块功能发布
#### 3.2.3 模块功能发布
由开发者独立开发的模块,需要使用JSON文件发布自己的功能。这样,平台就知道模块支持的专题类型、参数选项。
一个典型的功能描述文件必须包括三部分,分别是:
1. 参数表
......@@ -211,7 +288,7 @@ int main(int argc, char *argv[])
![example_module UI](images/example_module.png)
### 3.5 命令行参数
#### 3.2.4 命令行参数
taskBus 平台根据JSON文件启动进程。在启动各个功能模块时,taskBus 通过命令行参数送入所有的信息。命令行参数有如下几类。
| 类别|参数 | 意义 | 解释 |
......@@ -229,7 +306,7 @@ user@local$ example_helloworld.exe --instance=6 --function=example_bitxor --mask
![Paths UI](images/commandline_zh_CN.png)
### 3.6 第一个Hello-world 模块的代码
### 3.2.5 第一个Hello-world 模块的代码
我们把HelloWold模块的代码粘贴到这里,使用C++,可以非常方便的实现上述功能。
- 该代码没有使用任何标准C++之外的特性
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册