一、xC概念
xC作为一种多核语言,是在C语言的基础上进行的扩展。扩展的部分有基于任务的并行机制、通信机制、精确的时钟、I/O以及安全的存储空间管理功能。xC与C语言之间可以交叉编程,只不过,xC不支持goto、位域、函数指针等功能。编译平台为xTIME Studio ,由XMOS官网免费提供。
二、xC语法
这里只是介绍与C语言不同的部分,其他大部分特征与C语言相同。
- <:用于给端口赋值、发送数据;:>接收数据。
- 通过par{}语句建立平行任务。
par ( size_t i = 0; i < 4; i ++) task (i); 等价于 par { task (0) ; task (1) ; task (2) ; task (3) ; }
- 任务可以对事件做出中断响应,其关键字为select{case xxx: break; . . .},其语法类似于C语言中的switch语句。该结构同一时间只能执行一个event。
- xC只支持整数算术类型,所以要用到小数就直接化成分数的形式比如0.25就是1/4,需要同时传递两个整数。
三、调用关系
- xC调用C中的函数时候,需要在xC中申明其函数:
extern "c" { extern int f(); // 这个函数是在某个C文件中定义的 } void g() { par { f(); f(); } }
- 当从C调用到xC时,xC中的一些新类型在C中不可用,但是可以使用在编译链接时能够转换为xC类型的C类型。 例如,可以将一个xC中的chanend传递给一个C中接受int或unsigned int参数的函数。xTIMEcomposer套件中包含的xccompat.h头文件包含有用的宏和typedef,它们在其他语言中可自动扩展为正确的类型。
四、多核的运行机制
多任务在main函数中以平行的方式定义:
int main ( void ) {
par {
task1 (... 参数 ...) ;
task2 (... 参数 ...) ;
task3 (... 参数 ...) ;
}
}
其中task1、task2等函数名可以任意命名,一般这些任务函数无返回值,其基本结构如下:
void task1 (... 参数 ...) {
... 初始化代码...
while (1) {
... 主循环 ...
}
}
1. 任务间的通信方式
a.显式通信:
(1)一般的通信方式:task1准备通信→task2进入查询task1状态→task2接受task1传递过来的数据→传递完成→task1和task2各自运行各自的程序。
(2)共享存储空间:task之间不能通过共享公共变量来通信(比如全局变量),所以那些互锁、互斥、信号量之类的就不能使用了。所以,当task1和task3之间需要同步信号或者通信,就需要一个“中介任务”——task2,task2中有一段data,可以同时让task1和task3访问,这种访问方式和共享内存一样快。
(3)异步通信:通过buffer可以实现异步通信,task1将要通信的数据放入buffer中,无阻塞的执行其它工作去了,task2需要的时候从buffer中提取数据即可。实现的具体方法有两种:内部通知机制,task1向task2发出notifications(“通知”)后,干其他事去了,一旦task2收到通知,会给task1一个回馈;“中介任务”方式,使用task3作为一个管理FIFO的任务,task1、task2都与task3通信。
b.基于事件的通信