Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
colorEagleStdio
taskbus
提交
45e7eece
taskbus
项目概览
colorEagleStdio
/
taskbus
通知
162
Star
11
Fork
4
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
taskbus
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
45e7eece
编写于
5月 10, 2022
作者:
Y
Your Name
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update documents
上级
9d8159d6
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
85 addition
and
8 deletion
+85
-8
documents/taskbus_zh_CN.md
documents/taskbus_zh_CN.md
+85
-8
未找到文件。
documents/taskbus_zh_CN.md
浏览文件 @
45e7eece
...
@@ -32,7 +32,20 @@ taskBus 的核心理念是 “定IO标准不定具体工具,定连接结构不
...
@@ -32,7 +32,20 @@ taskBus 的核心理念是 “定IO标准不定具体工具,定连接结构不
大多数现代语言支持创建子进程, 并且可以通过 "管道重定向" 技术接管子进程的标准管道。Taskbus 技术即基于此特性,从各个子进程的stdout读取数据,并转发给需要的子进程(stdin)。
大多数现代语言支持创建子进程, 并且可以通过 "管道重定向" 技术接管子进程的标准管道。Taskbus 技术即基于此特性,从各个子进程的stdout读取数据,并转发给需要的子进程(stdin)。
### 3.1 输入输出
我们有两种开发方式:迅捷模式与标准模式。
-
迅捷模式适合那种有一路输入,和一到两路输出的情形。基于简单的管道原理就可以进行迅捷模式的模块开发。我们唯一需要做的,就是把基于键盘可见字符的输入变成基于二进制数据的读写。
-
开发出的程序可以脱离平台独立运行
-
原理与命令行管道级联一致。即 A.exe|B.exe|C.exe
-
适合构造逐级传递的线性吞吐模式。
-
标准模式适合比较复杂的逻辑, 如存在回溯和分支的逻辑。
-
需要适当的设计吞吐数据的格式。
-
支持多路输入输出
-
在平台的管理一下实现图状数据吞吐。
### 3.1 迅捷模式
#### 3.1.1 标准输入输出管道
一个实现XOR操作的教科书C程序,一般类似这样:
一个实现XOR操作的教科书C程序,一般类似这样:
...
@@ -63,10 +76,74 @@ Taskbus 模块的输入输出与上述程序非常类似,唯一的区别是使
...
@@ -63,10 +76,74 @@ Taskbus 模块的输入输出与上述程序非常类似,唯一的区别是使
fwrite
(
a
,
sizeof
(
int
),
4
,
stdout
);
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)指示一类数据。如声卡采集的波形,以及从文件中读取的字节流。
专题(Subject)指示一类数据。如声卡采集的波形,以及从文件中读取的字节流。
在图形界面上,专题显示为管脚。每个专题有一个便于记忆的名字;在运行时,taskBus平台会根据连线关系,为每个专题设置一个整数ID。ID相同的输入、输出管脚会被连接起来。
在图形界面上,专题显示为管脚。每个专题有一个便于记忆的名字;在运行时,taskBus平台会根据连线关系,为每个专题设置一个整数ID。ID相同的输入、输出管脚会被连接起来。
...
@@ -77,14 +154,14 @@ Taskbus 模块的输入输出与上述程序非常类似,唯一的区别是使
...
@@ -77,14 +154,14 @@ Taskbus 模块的输入输出与上述程序非常类似,唯一的区别是使
**注意:**
不同的管脚可以生产同一ID的专题,也可以监听一个相同的专题。对生产者,这样做的行为是一致的。对消费者,如何处理专题ID相同的情况,取决于模块实现者。
**注意:**
不同的管脚可以生产同一ID的专题,也可以监听一个相同的专题。对生产者,这样做的行为是一致的。对消费者,如何处理专题ID相同的情况,取决于模块实现者。
####
3.2
.2 通路
####
# 3.2.1
.2 通路
通路(PATH)在一类专题中,区分一条独立的自然时序。下面的例子中,两路声卡采集的数据汇入同一个FFT变换器。对于变换器来说,需要区分出两条自然时序,才能不导致混淆。
通路(PATH)在一类专题中,区分一条独立的自然时序。下面的例子中,两路声卡采集的数据汇入同一个FFT变换器。对于变换器来说,需要区分出两条自然时序,才能不导致混淆。
![
Paths UI
](
images/Paths.png
)
![
Paths UI
](
images/Paths.png
)
上图中的声卡模块采用自身的进程ID(2、6)作为通路号,这样非常便捷地标定了数据的来源。
上图中的声卡模块采用自身的进程ID(2、6)作为通路号,这样非常便捷地标定了数据的来源。
###
3.3
带有专题和通路的IO
###
# 3.2.2
带有专题和通路的IO
鉴于上面的介绍,我们在前文代码中稍加修改,即可实现基于stdio的通信。
鉴于上面的介绍,我们在前文代码中稍加修改,即可实现基于stdio的通信。
...
@@ -134,7 +211,7 @@ int main(int argc, char *argv[])
...
@@ -134,7 +211,7 @@ int main(int argc, char *argv[])
```
```
上述代码缺少上下文,但清晰的示意了taskBus最基本的通信原理。不同模块之间,正是通过这样的方法进行沟通的。
上述代码缺少上下文,但清晰的示意了taskBus最基本的通信原理。不同模块之间,正是通过这样的方法进行沟通的。
###
3.4
模块功能发布
###
# 3.2.3
模块功能发布
由开发者独立开发的模块,需要使用JSON文件发布自己的功能。这样,平台就知道模块支持的专题类型、参数选项。
由开发者独立开发的模块,需要使用JSON文件发布自己的功能。这样,平台就知道模块支持的专题类型、参数选项。
一个典型的功能描述文件必须包括三部分,分别是:
一个典型的功能描述文件必须包括三部分,分别是:
1.
参数表
1.
参数表
...
@@ -211,7 +288,7 @@ int main(int argc, char *argv[])
...
@@ -211,7 +288,7 @@ int main(int argc, char *argv[])
![
example_module UI
](
images/example_module.png
)
![
example_module UI
](
images/example_module.png
)
###
3.5
命令行参数
###
# 3.2.4
命令行参数
taskBus 平台根据JSON文件启动进程。在启动各个功能模块时,taskBus 通过命令行参数送入所有的信息。命令行参数有如下几类。
taskBus 平台根据JSON文件启动进程。在启动各个功能模块时,taskBus 通过命令行参数送入所有的信息。命令行参数有如下几类。
| 类别|参数 | 意义 | 解释 |
| 类别|参数 | 意义 | 解释 |
...
@@ -229,7 +306,7 @@ user@local$ example_helloworld.exe --instance=6 --function=example_bitxor --mask
...
@@ -229,7 +306,7 @@ user@local$ example_helloworld.exe --instance=6 --function=example_bitxor --mask
![
Paths UI
](
images/commandline_zh_CN.png
)
![
Paths UI
](
images/commandline_zh_CN.png
)
### 3.
6
第一个Hello-world 模块的代码
### 3.
2.5
第一个Hello-world 模块的代码
我们把HelloWold模块的代码粘贴到这里,使用C++,可以非常方便的实现上述功能。
我们把HelloWold模块的代码粘贴到这里,使用C++,可以非常方便的实现上述功能。
-
该代码没有使用任何标准C++之外的特性
-
该代码没有使用任何标准C++之外的特性
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录