本篇目的
继续XMOS的程序开发-xc语言的并发机制。
开发环境
- 硬件平台使用官方评估板"xCORE VOCAL FUSION XP-VF3100-BASE"
- IDE开发环境win10 下的 xTIMEcomposer
XC和C的区别简单说明
XC对C做了扩展,多个一些C没有的东西;有些则和C有区别。但是基本上C能用的,XC上都能用,除了不支持这几点:
- goto语句
- 位域
- 函数指针
- C99风格的指定初始化
比如C支持结构这样定义
struct test
{
int a:1;
int b:31
int c;
};
但是xc不支持a和b这样的位域;
C99风格的指定初始化可以对上面的结构变量这样初始化,指定初始化c
struct test t =
{
.c = 123;
};
但是xc不支持
xc和c不一样的以及扩展的则比较多,后面的描述都是对xc特有的描述。
并发执行机制
xC最基本的,不同于C的就是并发的执行机制。
使用par结构来指定(parallel的缩写)。比如下面的程序:
#include <stdio.h>
#include <platform.h>
int main () {
par {
printf("11111111111\n");
printf("22222222222\n");
}
return 0;
}
这两台printf语句不是顺序执行,而是并发执行的,具体系统使用那个tile,那个core,由系统自动分配。
编译后执行结果如下:
22222222222
11111111111
程序改为如下:
#include <stdio.h>
#include <platform.h>
int main () {
par {
printf("11111111111\n");
printf("22222222222\n");
}
par {
printf("333333333333\n");
printf("444444444444\n");
}
return 0;
}
执行结果为:
22222222222
11111111111
444444444444
333333333333
通常并发的任务,里面都是while(1)循环的,程序改为执行两个任务如下:
#include <stdio.h>
#include <platform.h>
void task(const int id)
{
while(1){
printf("task id: %d\n", id);
}
}
int main () {
par {
task(1);
task(2);
}
par {
printf("333333333333\n");
printf("444444444444\n");
}
return 0;
}
执行结果是永久打印如下内容:
task id: 1
task id: 2
task id: 1
task id: 2
task id: 1
task id: 2
并不会执行第2个par中的内容,因为,par中的并行任务块,没执行完是不会往下执行的。
如下的par结构块
par {
task(1);
task(2);
}
可以写成
par (int i=1; i<=2; ++i) {
task(i);
}
的并行任务块,没执行完是不会往下执行的。