xmos 编程语言编程手册XC.pdf
《xmos 编程语言编程手册XC.pdf》由会员分享,可在线阅读,更多相关《xmos 编程语言编程手册XC.pdf(150页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、XMOS 装置上之 XC 程序设计语言Douglas WattXMOS 装置上之 XC 程序设计语言Douglas Watt 着林琬珍 译作者致力此书的准备,但未表示或隐射任何的保证,以及对于错误或是省略部分并无权责;相关于或是出现不恰当使用这些资讯或源码有关的直接、间接、无意或是随之而来的损害,作者对此无假定的责任。对于这些资讯以及程序是或是将会是可任意自由使用并无此声明,再次重申,作者对相关于此的任何宣称并无责任。版权所有,翻印必究。Copyright 2009 by XMOS Limited.版权所有。在没有经过出版商书面允许之下,此出版品的任何部分皆不能被重制、存放在一个检索系统或是以
2、任何形式传送,也不能以任何方法传送,无论是电子式、机械式、复印、录制或其他方式。商标:XMOS 与 XMOS 标志是 XMOS Limited 在英国和其他国家的注册商标,并且在没有书面允许下,不能使用;所有其他商标是其各自拥有者的财产。那些在这本书中出现的名称,而 XMOS 有意识到商标宣称,这些名称被以大写字母为首或以皆为大写字母印制。本书的编排,作者是使用 LaTEX 以及手动编排的方式完成排版,其中使用的字体为 HeiS ASC、SongASC、Minion Pro、Latin Modern 以及 Computer Modern。XMOS 也以电子格式出版其书籍,一些印制版的内容并没有
3、在电子书中出现。关于 XMOS 产品的资讯,浏览我们的网页:。因为网路的动态本质,任何此书中包含的网址或是连结可能于出版后变更,或者不再有效。CPI Antony Rowe,United Kingdom 印刷装订ISBN:978-1-907361-32-6ISBN:978-1-907361-03-6(原文版)XMOS Limited 出版XMOS 前言XMOS 晶片架构能使介面、数位信号处理以及控制函数的组合操作得以软件方式实现,一个 XMOS 装置是由一个或是多个 XCore 组成,每一个皆包括事件驱动多线程处理器,并且有高度整合输入/输出以及晶片内存记忆体来达到实时效能为目的的架构,每个处
4、理器都由硬件支援并行运行多个线程的功能,并且有特定的指令控制输入和输出。线程 0 核心 0 核心 1 通道端点通道端点线程 1线程 2 线程 3线程 4线程 6线程 5 线程 7记忆体记忆体线程 0线程 1 线程 2线程 3线程 4线程 5线程 7切换器连接到其他装置脚位脚位埠埠线程 6 这是决定性的架构,每个线程皆被保证可以获得一部分的处理效能;线程可以用来运行计算,处理实时的输入/输出操作以及多个事件的回应;利用单一的指令,可以使这些输入/输出脚位进行取样或是驱动,而数据传送速度则可以用计时器或是时序控制。高ivXMOS 前言效能的切换器使处理器间的沟通以及使多个装置的系统建构变得简单;在
5、同一个处理器上的线程间沟通是没有时延,而处理器之间,时延对已知的通讯模式是明确地呈现,硬件完整的描述在另外文件1中说明。程序设计模式程序可以使用 XC、C 以及 C+合并编写,XC 具有 C 延伸的特性,可以简化并发运行、输入/输出以及时间的控制,这些延伸出的特性直接对应到 XCore 硬件资源,例如线程、通道以及埠,这可避免大量调用库函数。XC 的构造是有效率的 编译成简短指令序列,也是安全的 不受到可能的死锁、竞速现象以及记忆体侵犯这些问题的威胁,这使得程序容易撰写和理解以及除错,本书对于 XC 程序语言有详细完整的介绍。工具架构XMOS 工具是基于标准的嵌入式开发流程以及业界标准平台上发
6、展的,工具的使用因此变得更直觉简单。.XC.C.CPP.XN XMOS DEVELOPMENT ENVIRONMENT 编译器指令集合二进制码除错器模拟器板子应用程序硬件XMOS 前言v在开发的所有阶段,工具都支援语言本身以及架构上并发和实时的能力:边译器会静态地分析所产生的二进制文件,以提供在源码中所给定的时间资讯,这使得程序在不同时间特性的多个装置上,更具可携性。编译器工具会产生单一的二进制的文件,文件中包含所有装置的指令以及数据区段,模拟器和板子工具可以对这个文件进行操作,对程序设计人员而言,则省去复杂性。目的平台的资讯置放在 XN 文件中,其中包含 XMOS 装置的网路、SPI 闪存记
7、忆体、振荡器和 JTAG,XN 文件使工具能够完全地自动化系统启动和设定。板子工具可以将系统设定由特定方式启动,由开发主机电脑启动、板子上闪存记忆体或是晶片内 OTP 记忆体启动。除错器是开发主机与目的平台上所有处理器的介面,对程序设计人员而言,它呈现一组线程,并且可以一起检阅,使除错 XMOS 装置和除错一般处理器的方式相同。工具的使用说明在另外的使用手册2中。如何阅读这本书的主要章节便是一份如何在 XMOS 架构上,以 XC 程序设计语言的使用手册,附录部分有完整的 XC 规格以及在 XMOS 第一代装置 XS1 上 XC 的实作细节,使这份文件更趋完美;这份使用手册假设读者有一些程序设计
8、经验。第 1 章 概述 XC 支援的计算,包含算术表达式、控制流程建构以及函数。第 2 章 解释如何在埠上输入和输出数据以及和外部元件连接的介面,这个章节也说明如何使用计时器控制输入/输出数据传输率及使用 select 语句与多个元件衔接。第 3 章 显示如何运行并发的多任务,也就是分别的线程,并说明如何使用通道在不同的线程间通讯。第 4 章 描述如何同步输入/输出操作与时序,以及如何纪录与控制在哪个边缘输入和输出操作会有作用。viXMOS 前言第 5 章 示范使用埠的缓冲区将运算需要的输入/输出操作去藕,以改善效能。第 6 章 解释如何将数据串行至输入/输出脚位,并且说明如何解译,以及如何使
9、用埠内建的功能产生信号撷取信号。附录 A阐释标准正式的 XC 程序语言规格。附录 B提供正式的 XC 埠的输入/输出语义。附录 C说明使用 XC 语言的 XS1 实作,包含不同的输入/输出操作、埠和脚位的对应以及 XC 数据类型的大小以及对齐。XC 的运算框架和 C 语言相似,特别是其类型系统以及控制流程的构成;因此,有经验的 C 语言程序设计人员可能希望先阅读章节 2 6,其中涵盖输入/输出和并发性的建构;这些章节的编排,前面章节介绍的概念会用于后面的章节,因此,应该依照其编排顺序阅读。XMOS 架构的发展以及 XC 程序语言会持续演进,目前的实作于附录 C 中讨论,也视为将来发展方向以及技
10、术的标准化。致谢关于埠的使用范例,多数原本是由 Henk Muller 为 XS1 上埠的使用手册3所撰写,LCD 驱动程序的范例研讨以及以太网控制器则是由他和 Larry Snizek 共同开发;Richard Osborne 则是 XS1 标准程序库文件的作者,另外,Huw Geddes 费心地建立所有用到的波形图以及图表。Ali Dixon、Peter Hedinger、Russell Gallop 和许多其他的公司成员对这份文件原稿提供最仔细的校阅,他们的意见,校正以及建议使最后的文字获得重要的改善。目录1基本运算11.1Hello,World!.11.2变量、常量和表达式.21.2.
11、1常量.31.2.2表达式.41.2.3类型转换.41.3控制流程.61.3.1if-else.61.3.2switch.71.3.3循环.71.3.4break 和 continue.81.4函数.81.4.1函数引数.91.4.2选择性引数.101.4.3多重回传值函数.111.5再解译.121.6和 C 语言的比较.122输入输出132.1输出数据.142.2输入数据.152.3于输入脚位等待条件产生.152.4使用计时器控制输入/输出数据量.162.5范例研讨:UART(第一部分).182.6多重输入的反应.20viii目录2.7范例研讨:UART(第二部分).212.8参数化的 se
12、lect.233并发性273.1建立并发线程.273.2不交叉线程规则.283.2.1范例.293.3使用通道通讯.303.3.1通道不交叉性规则.323.4交易.323.5串流.343.6并行重复.343.7服务.353.8线程效能.364时序输入和输出394.1产生时序信号.394.2使用外部时序信号.414.3特定时序边缘上的输入/输出操作.424.4范例研讨:LCD 屏幕驱动程序.434.5时序行为摘要.465埠之缓冲495.1使用有缓冲区的埠.495.2同步多个埠上有时序的输入/输出.525.3缓冲行为摘要.536串行化和信号撷取556.1使用埠串行输出数据.556.2使用埠反串行化
13、输入数据.566.3伴随有效信号的数据.576.4输出数据和数据有效信号.586.5范例研讨:以太网 MII.596.5.1MII 传输.596.5.2MII 接收.626.6摘要.65目录ixAXC 程序语言规格67A.1词法约定.67A.2语法记号.70A.3识别字的意义.70A.4对象和左值.72A.5类型转换.72A.6表达式.73A.7声明.82A.8语句.91A.9外部声明.99A.10 作用域和连结.101A.11 通道通讯.101A.12 无效操作.102A.13 预处理器.102A.14 文法.102BXC 输入/输出规格111B.1有时序的输入/输出之功能模式.112B.2
14、时序、时效性以及信号撷取元件.114B.3串行化元件.116B.4缓冲元件.118B.5条件式输入:pinseq 和 pinsneq.121C XS1 上之 XC 实作123C.1XC 埠规格的支援.123C.2XS1 埠库函数:.124C.3埠和脚位对应.128C.4通道通讯方式.130C.5数据类型.130参考文献131索引133第 1 章基本运算XC 是以 C 语言为基础,并含有运算框架的指令式程序语言,XC 程序是由包含语句的函数组成,语句会依据储存在变量上的数值而动作;控制流程语句表达决定,而循环语句表示反覆运行。下面的章节中,XC 新诠释的结构或是和 C 语言不同点会在页面边界注明
15、。XC新增1.1Hello,World!学习一个新的程序语言通常第一个任务是打印出“Hello,world!”字符串,相对的 XC程序如下:#include main(void)printf(Hello,world!n);程序的第一行会告诉编译器从头文件 stdio.h 引入需要的资讯,该头文件包含 printf函数的声明,这个函数会输出一个字符串到标准输出,如开发系统中的终端机视窗便是个标准输出装置。每个程序必须包含一个 main 函数,这个函数就是程序开始运行的地方;在此例中,main 被定义为没有引数的函数,以关键字 void 表示。函数的主体是由花括号 所包住的,并且它包含所要进行操作
16、的语句,在这个例子中,main 含了单一个函数,也就是调用 printf 函数的语句,而字符串文字为调用时的引数,跳脱字符 n 表示一个换行字符。2基本运算1.2变量、常量和表达式变量表示数据在记忆体上储存的位置,所有的变量必须在使用和给值之前声明,最常见的算术类型为 char 和 int,char 是一个八个位元长的位元组整数,而 int 为 32 位元的整数型态。声明:char c;c 被声明为一个 8 位元的带号字符,可以表示-128 到 127 之间的整数值。限定符 signed 或是 unsigned 用来陈述类型的带号性,声明如下所示:unsigned char c;声明 c 为一
17、个八位元的无号字符,可以表示 0 到 255 之间的整数值。变量可以给定初始值,声明方式如下所示:int i=0,j=1;i 和 j 被声明为整数类型,并且分别被初始化为 0 和 1。限定符 const 可以用在任何变量声明,预防变量的值在初始化之后改变,声明如下所示:const int MHz=1000000;声明 MHz 是值为 1000000 的整数常量,在这之后任何企图去修改的操作皆无效。一个或多个相同类型的变量可以结合起来形成一个数组,声明方式如下所示:int data3=1,2,3;以上的代码将 data 声明为含有三个整数的数组,并且初始化为 1、2 和 3;数组的下标由 0 开
18、始,因此数组的元素为 data0、data1 和 data2,下标可以是任何表示数组中有效元素位置的整数。数组也可以由一个或多个的数组组成一个多维数组,声明方式如下:int matrix23=1,2,3,4,5,6;matrix 被声明为二维数组,第一维度表示列,第二维度表示行,形成矩阵 matrix,如下所示:(123456)下标顺序是由最高的维度先开始,例如:matrix01 的值为 2。1.2变量、常量和表达式31.2.1常量常量是一个文字形式的数值且有其数据类型,在下表栏位中的例子皆为常量:文字表示类型数值123int123123uunsigned int1230b10000int16
19、020int160 x10int160 xAuunsigned int10 xchar1200char48nchar10(换行字符)char92(反斜线)0char0(字符结束字符)”str”char 数组s,t,r,0数字序列默认是整数(int),无号的常量是由字尾 u 指定,二进制表示的整数常量是用 0b 为字首,八进制是用 0,而十六进制则是 0 x。字符常量通常写在两个单引号中,其值便是字符的数值,一些无法表示的字符是用反斜线表示的跳脱字符。文字串是写在两个双引号间,由零个或是多个字符组成的序列,文字串内部的表示包含一个空字符字尾 0,这个字符允许程序能找到字符串的结尾,也使字符串储存
20、空间的需求增加一个位元组;文字串是用来对字符数组初始化:char msg=Hello,world!n;这个例子声明 msg 为一个 15 个字符的数组,包含结束的空字符,如果数组的大小在声明的时候已经知道,则数组大小必须至少和字符串大小一样大。4基本运算1.2.2表达式表达式是运算符结合变量和常量产生一个数值,下表中的栏位皆为表达式的例子:代数表达式XC 表达式a b ca*b-c(a+b)(c+d)(a+b)*(c+d)a/b+c(a/b)+c没有小括号的表达式通常是利用运算符的优先顺序规则由左到右来评值,规则规范*运算符比+运算符有更高的优先顺序,也就是说在表中的第二个表达式需要小括号在两
21、个加号附近,使加法运算可以先被运行。表格 I 总结 XC 所支援的运算符,列在较上面的运算符有较高的优先顺序,在相同区块中的运算符有相同的优先顺序,运算符定义与 C 语言中的定义相同,完整的细节请参照 A.6。以分号结束的表达叙述为语句,大部分的语句为赋值式,如:x=a*b;或是函数的调用,如下:printf(Hello,world!n);表达式值必须是非歧义的表示,当表达式的值会根据其运算元评值的顺序而有不XC新增同,则产生歧义性,例如:i=i+;/*无效*/在这个例子中,i 的值是依据所运行的加号运算符顺序而来,一般而言,如果子表达式包含变量 V 的更改,没有其他的子表达式允许使用 V,这
22、个规则递归地用于表达式中所有会去读或写全局变量的函数。1.2.3类型转换如果运算符有不同类型的运算元,运算元会被转换成一个共同的类型;通常在运算之前,类型较“低”的会被提升为较“高”的类型,结果会是较高等级的类型,例如在表达式中:c+1二元运算符+包含 char 和 int 运算元,char 运算元被转换成 int,而表达式的结果也是 int。1.2变量、常量和表达式5表格 IXC 运算符运算符说明种类结合性+-后置递增/递减一元运算符由左到右+-前置递增/递减一元运算符由右到左+-一元加/减!逻辑否定位元逐位补数(类型)明确强制类型转换sizeof位元组大小isnull判断是否为空的参考*/
23、%乘法/除法/模数运算二元运算符由左到右+-加法/减法二元运算符由左到右位元左/右移位二元运算符由左到右小于关系二元运算符由左到右大于关系=大于或等于关系=!=关系等于/不等于二元运算符由左到右&位元 AND二元运算符由左到右位元互斥 OR二元运算符由左到右|位元内含 OR二元运算符由左到右&逻辑 AND二元运算符由左到右|逻辑 OR二元运算符由左到右c?t:f三元条件三元运算符由右到左=赋值二进制由右到左+=-=*=/=计算赋值%=&=|=计算赋值=计算赋值6基本运算一般性提升规则以及算术转换在 A.1.1有规范,对于 XS1 装置则总结如下:如果 int 可以表示所有原本类型的值,则将 c
24、har 和 short 转换成 int,否则转换成 unsigned int。如果任一个运算元是 unsigned int,则转换其他的成 unsigned int。明确的类型转换可以在表达式中使用一元类型转换运算符强制运行,如:(char)(a+i);/强制转型 32 位元整数成 8 位元字符强制类型转换时常被用于输出的语句,目的是指定要通讯的数据量(参见 3.3),类型转换的意义有如将表达式的结果以指定的类型赋值到变量;而类型转换不能用于数组以及表达式。1.3控制流程控制流程语句表达裁定语句运行顺序的决定,语句串列在由 组成的区块中依序被运行,如下所示:main(void)int x=2,
25、y=3;int z=x*y;z+;在一个区块中,所有声明必须在所有语句的最上面;一个区块是语法上等价于单一个语句,可以置放于任何语句需要的位置。1.3.1if-elseif-else 结构最多选择一个语句运行,如下所示:if(n 0)printf(Positive);else if(n 0)printf(Negative);x=0;elseprintf(Zero);对每一个以小括号包围的表达式,皆监督可能会运行的语句或是代码区块,而 else-if以及 else 语句不是必要的,这些表达式会依照他们出现的顺序被检验,并且第一个非零的表达式对应的语句将被运行,然后整个结构便结束。1.3控制流程7
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- xmos 编程语言编程手册XC 编程 语言 手册 XC
限制150内