柔性C

P2上FlexC的快速入门指南

概述

C编程语言广泛应用于各种计算机的编程,从嵌入式系统到超级计算机。它是一种级别相对较低的语言,但比汇编语言更易于使用。因为它非常流行,所以有很多学习C的好资源,无论是在线的还是书中的。

视差P2没有官方支持C,但有许多第三方解决方案允许用C编程P2。本指南将向您介绍如何开始使用FlexC,FlexProp编程语言套件中的C编译器。FlexProp是一个社区开发和支持的编译器,它允许用C、BASIC、Spin 1、Spin 2和汇编语言编程P2。

本文档假定您已经熟悉C语言。如果你不是,那么网上有很多优秀的资源可供学习C。我们将主要讨论P2和FlexProp C编译器特有的特性。

FlexProp中的C:概述

FlexC(FracePrP C语言)仍然是一个正在进行中的工作,但它旨在支持C99编程语言规范,其中有一些来自C++和GNU C的扩展。

支持的平台

FlexProp在Windows、Mac OS X和Linux上运行。以下说明适用于Windows。对于Mac,您将使用非常类似的说明。对于Linux,克隆FlexProp git源存储库然后做“makeinstall”。

P2特定语言功能

FlexC还有一些值得注意的P2编程扩展,包括:

  • 支持内联组装
  • 支持调用Spin2和基本对象
  • __用于在另一个COG中运行函数的内置COG START
  • 其他一些用于访问P2指令的内置内部函数

当前限制

FlexC的当前版本对于C99有一些限制

  • 不支持64位算术(不支持long-long,double与float处理相同)
  • 没有可变长度数组
  • 没有匿名结构和联合
  • 指定初始值设定人的限制
  • 不完全标准库

获取FlexC/FlexProp

要下载FlexProp GUI,请转到FlexProp发布页面并下载flexprop.zip文件。将其解压缩到方便的地方,例如桌面。

不要将其放入系统文件夹(如Program Files文件夹;FlexProp配置文件存储在可执行文件旁边,因此它所在的文件夹必须是可写的。

运行FlexC

连接P2评估板

将微型USB电缆插入P2评估板上的“PC USB”插座;将另一端连接到电脑中的USB插座。USB-2或USB-3均可使用。

运行和配置FlexProp

导航到您解压缩flexprop.zip的flexprop文件夹。双击flexprop.exe。您可能会收到关于未知发布者的警告;您可以忽略此警告。

您应该会看到一个窗口出现,如下所示:

FlexProp初始屏幕

窗口的顶部是编辑器。这将包含多个选项卡(每个打开的文件对应一个选项卡)。下部标记为编译器输出,包含来自编译器的消息,包括任何错误消息。

最初编辑器中没有打开的选项卡。要开始,您必须启动一个新文件(文件>新文件)或加载一个示例(文件>打开文件)。对于本快速入门指南,我们将尝试一个新文件。

运行Hello World

选择文件>新建文件。这将打开一个新的文件选项卡,您可以在其中键入您的程序。让我们从经典的“hello world”程序开始。

输入:

#包括

int main(){
printf(“你好,世界!\n”);
返回0;
}

选择文件>将文件另存为…并为您的程序输入名称(如hello.c)。FlexProp窗口现在应该类似于:

你好世界节目

现在单击“在P2上编译并运行”按钮。您应该会看到一些编译消息,然后会弹出一个标有“螺旋桨输出”的终端窗口,如:

你好,世界跑步

由C程序打印的任何内容(例如,使用printf功能)都将显示在螺旋桨输出窗口中。这是一个标准的ANSI控制台窗口(它使用适用于您的平台的默认终端程序,无论是Windows、Mac还是Linux),因此您可以使用ANSI转义序列执行清除屏幕、移动光标、更改文本颜色等操作。

螺旋桨输出窗口实际上是一个交互式终端,因此,如果您的程序需要终端输入,您也可以在该窗口中键入它。

默认情况下,C程序在引脚63和62上使用230400的波特率,此输出在终端中捕获。您可以通过添加类似_setbaud(_baud)的行来更改波特率;在C main函数的开头,在任何printfs之前。此行将把波特率设置为_baud的任何值。FlexProp GUI自动添加一个与您在Ports菜单中选择的值相匹配的_baud定义。

完成与程序的交互后,必须关闭“螺旋桨输出”窗口。如果不关闭,则以后在P2上运行的尝试将失败,并出现“找不到P2”错误(请参阅下面的疑难解答部分)。关闭窗口实际上并不会终止螺旋桨上的程序;它只是关闭串行连接并保持P2运行。

闪烁发光二极管

我们可能希望LED闪烁,而不是打印信息。选择文件>新建并输入以下程序:

#包括

int main()
{
对于(;;){
_平(56);
_waitms(500);
_品脱(56);
_waitms(500);
}
}

选择文件>将文件另存为…并选择一个名称,如blink.c。

现在再次按下“在P2上编译并运行”按钮。终端窗口将再次出现,但其中不会显示任何输出(因此您可以关闭它)。相反,您将看到连接到针脚56的LED每秒闪烁一次。

请注意,螺旋桨输出窗口在所有情况下都会弹出(您不希望和P2交互)。您可以立即关闭此窗口。关闭它不会终止P2上运行的程序;LED将持续闪烁。在任何情况下,您必须在尝试运行另一个P2程序之前关闭窗口。

_pinh(n)函数将引脚n设置为输出并将其驱动为高电平;类似地,_pinl(n)将引脚驱动为低电平。_waitms(m)等待m毫秒。

FlexC文档中讨论了这些和其他螺旋桨特定功能,您可以通过“帮助”>“C语言”菜单访问这些功能。

故障排除

找不到P2

如果在螺旋桨输出窗口中收到“找不到P2”错误消息,请检查并确保已关闭所有其他螺旋桨输出窗口。一次只能打开一个螺旋桨会话,如果您试图在螺旋桨输出(终端)窗口打开时运行程序,那么它将不工作,并且找不到P2。

如果这不是问题所在,请检查与P2的连接,然后在“端口”菜单下查看选择了哪个端口。如果您知道P2连接到哪个端口,可以手动选择该端口以强制FlexProp使用它。

如果您的计算机连接了多个P2设备,您可以通过在FlexProp的“端口”菜单下查找来选择要连接的特定端口。如果您想要的端口未显示,请单击“端口>扫描端口”。

C语法错误

如果程序中存在语法错误,将出现如下对话框:

“编译失败”对话框

单击OK,然后检查编译器输出窗口中的错误消息。例如,如果我们忘记了分号,可能会出现语法错误消息。错误消息提供了一个指向编译器第一次注意到问题所在行的链接。如果您单击该链接,它会将您带到该行并将其高亮显示:

FlexProp错误消息

在这种情况下,实际的错误出现在前一行,即带有printf的那一行(它缺少分号)。在看到下一行之前,编译器无法始终找出问题所在,因此请始终查看周围的代码。

C对Projecter2功能的支持

大多数Propeller2功能都包含在头文件中,该头文件(大部分)在P2的C编译器中标准化。使用这些功能的程序应可移植到Catalina、riscvp2和P2的其他C编译器。

P2的C功能文档可在“帮助”>“C语言”菜单项下找到。这将打开一个包含Flex C文档的web浏览器。Projecter2.h部分介绍了从C访问P2功能的可移植功能。

其他有用的FlexC特性也记录在该文件中,因此非常值得阅读。

在命令行或生成文件中使用FlexC

有一个称为flexcc的前端,可用于在命令行上编译FlexC程序(或从另一个构建系统(如Make)调用时)。

使用FlexC中的Spin2对象

Spin2对象可直接用于FlexC程序中。FlexC文档中讨论了这一点,但这一点非常重要,我们可能应该在这里将其点亮。Spin2对象可以使用特殊的结构(使用语法)定义为FlexC结构。FlexProp附带的Mandelbrot演示就是一个很好的例子。这可以在文件samples\Multi-Language\mandelbrot.c中找到。它使用Roger Loh用Spin2编写的P2视频对象。声明如下:

使用(“video/p2videodrv.spin2”)视频的结构;

这将创建一个名为vid的对象,该对象使用位于视频子文件夹中的p2videodrv.Spin2文件中的Spin2代码。这个对象的SPIL2方法可以用通常的C++语法调用,比如:

vid.initDisplay(&display1,vid.VGA,VGA_BASE_引脚,VGA_VSYNC_引脚,vid.RGBHV,&lineBuffer,LINEBUFSIZE,0);

多语言Mandelbrot演示还演示了FlexC的一些其他功能,例如内联汇编的使用。

其他资源

FlexProp帮助菜单包含讨论FlexProp支持的语言的各种功能的页面。帮助>通用编译器参考菜单包含适用于所有语言的信息,包括FlexC。帮助>C语言菜单包含一些特定于C的信息。

有关FlexProp和FlexC的更多信息,请参阅视差论坛。

P2的其他C编译器

除了FlexC之外,还有许多其他社区支持的P2 C编译器。

卡塔琳娜C

https://sourceforge.net/projects/catalina-c/

Catalina是一个成熟的C编译器,用于视差螺旋桨和螺旋桨2。它支持C89标准,并带有一些C99扩展。它可用于Windows和Linux,并带有GUI和调试器。它更注重稳定性和易用性,而不是性能。它友好的GUI和丰富的文档使其成为FlexC的良好替代品,特别是对于P2和C编程的新手。

LLVM

https://github.com/ne75/p2llvm

这是一个基于LLVM工具链的本地P2编译器,它是一个成熟的C编译器,可在许多平台上使用。P2端口仍在开发中,通常需要熟悉LLVM和嵌入式系统编程才能安装。

riscvp2

https://github.com/totalspectrum/riscvp2

这是一个基于GCC的RISC-V P2工具链和一个从RISC-V rv32imac指令到P2指令的JIT编译器(这是一种RISC-V仿真器)。因为指令在运行时编译为P2代码,所以它的性能非常好,并且在某些基准测试中优于所有其他可用的P2编译器。它也有一个非常完整的运行时库(基于newlib)。但是,它没有GUI,用户需要一些嵌入式系统编程经验。