Skip to main content
欢迎来到PAWPAW技术文档网站了解更多信息

XCORE资源与硬件配置 `xs1.h`

该文档包含了用于访问XS1-XS3系列硬件的函数库xs1.h。其中提供的函数能够执行对时钟、端口、通道、节点、Tile、逻辑核心以及外围设备等低级硬件组件的操作。

要使用这些函数,请在程序中添加:

#include <xs1.h>

时钟配置函数

以下函数用于配置时钟和端口,以实现嵌入式系统中的同步和时钟输出。

void configure_port_clock_output()

配置一个1位端口以输出时钟信号。如果端口不是1位端口,则会引发异常。在此模式下配置端口后进行输入或输出会导致不确定的行为。

参数:

  • void port p - 要配置的1位端口。
  • const xcore_clock_t clk - 要输出的时钟。

void start_port()

激活一个端口并清除该端口使用的缓冲区。

参数:

  • void port p - 要激活的端口。

另请参阅:


void stop_port()

停用一个端口,并将其重置为非就绪状态。

参数:

  • void port p - 要停用的端口。

另请参阅:


void configure_clock_src()

配置时钟使用1位端口作为其源,允许端口的I/O操作与外部时钟信号同步。如果端口不是1位端口,则会引发异常。

参数:

  • xcore_clock_t clk - 要配置的时钟。
  • void port p - 用作时钟源的1位端口。

另请参阅:


void configure_clock_src_divide()

此函数用于配置时钟,使其能够以1位端口作为时钟源,并设置分频因子。

该函数负责设置一个时钟块,让它从1位端口派生其时钟信号,并可以选择性地设置分频因子。如果divide参数设置为零,则1位端口将直接为时钟块提供时钟信号。若divide参数非零,则由1位端口提供的时钟信号会被2×divide2 \times divide分频。此函数仅适用于XS2设备,若端口不是1位端口,则会抛出异常。

参数说明:

  • xcore_clock_t clk - 需要配置的时钟。
  • void port p - 作为时钟源的1位端口。
  • unsigned char divide - 时钟信号的分频因子。

参考链接:


void configure_clock_ref()

此函数用于将某个时钟的源配置为参考时钟。

通过调用此函数,可以将时钟源指定为参考时钟。如果divide参数被设置为零,则会直接采用参考时钟的频率。如果不为零,则采用的频率为参考时钟频率除以2×divide2 \times \text{divide}。默认情况下,参考时钟被设置为运行在100 MHz的频率。

参数说明:

  • xcore_clock_t clk - 需要配置的时钟。
  • unsigned char divide - 时钟分频系数。

参见:


void configure_clock_xcore()

此函数用于将时钟的源配置为xCORE Tile 时钟。

所使用的频率为xCORE Tile 时钟的频率除以2×divide2 \times \text{divide}。若divide参数被设置为零,则会抛出异常。

参数说明:

  • xcore_clock_t clk - 需要配置的时钟。
  • unsigned char divide - 时钟分频系数。

参见:


void configure_clock_rate()

此函数用于配置时钟,使其以ab\frac{a}{b} MHz的速率运行。

通过此函数可以设置时钟运行在特定的速率,即a除以b的商值,单位为MHz。如果硬件不支持指定的速率,将会抛出异常。支持的速率包括参考时钟频率(ref MHz)以及形式为ref2n\frac{\text{ref}}{2^n} MHz或tileclk2n\frac{\text{tileclk}}{2^n} MHz的速率,这里的ref代表参考时钟频率,tileclk代表xCORE Tile 频率,而n的取值范围为1至255(含)。

参数说明:

  • xcore_clock_t clk - 需要配置的时钟。
  • unsigned a - 期望速率的分子。
  • unsigned b - 期望速率的分母。

参见:


void configure_clock_rate_at_least()

此函数用于将时钟配置为至少达到指定的MHz速率,同时不超过硬件支持的最慢速率。

它将时钟clk的运行速率设置为硬件所能支持的最慢速率,但这个速率不低于ab MHz的比值。如果找不到符合这一条件的速率,将会抛出异常。

参数说明:

  • xcore_clock_t clk - 需要配置的时钟。
  • unsigned a - 期望速率的分子。
  • unsigned b - 期望速率的分母。

参见:


void configure_clock_rate_at_most()

此函数用于将时钟配置为不超过指定的MHz速率的最快非零速率,同时是硬件所能支持的速率。

它将时钟clk的运行速率设置为硬件所能支持的最快非零速率,但这个速率不高于ab MHz的比值。如果找不到符合这一条件的速率,将会抛出异常。

参数说明:

  • xcore_clock_t clk - 需要配置的时钟。
  • unsigned a - 期望速率的分子。
  • unsigned b - 期望速率的分母。

参见:


void set_clock_src()

将时钟源设置为1位端口。

此函数使用SETCLK指令来配置时钟源,要求指定的端口是1位端口。如果端口不是1位的,或者如果时钟之前被配置为非零除数,则会引发异常。通常建议使用configure_clock_src()代替,因为它没有除数问题。

参数:

  • xcore_clock_t clk - 要配置的时钟。
  • void port p - 作为时钟源的1位端口。

另请参阅:


void set_clock_ref()

将时钟源设置为参考时钟。

此函数使用SETCLK指令将时钟源配置为参考时钟,并保持时钟除数不变。

参数:

  • xcore_clock_t clk - 要配置的时钟。

另请参阅:


void set_clock_xcore()

将时钟源设置为xCORE Tile 时钟。

这对应于在时钟上使用SETCLK指令。时钟除数保持不变。

参数:

  • xcore_clock_t clk - 要配置的时钟。

另请参阅:


void set_clock_div()

设置时钟的分频值。

这对应于使用SETD指令。如果时钟源不是参考时钟或XS1设备上的xCORE Tile 时钟,或者当源是xCORE Tile 时钟且分频值设置为零时,会引发异常。非零分频意味着源频率被2 * divide除。

参数:

  • xcore_clock_t clk - 要配置的时钟。
  • unsigned char div - 要使用的分频值。

另请参阅:


void set_clock_rise_delay()

设置时钟上升沿的延迟。

时钟的每个上升沿都会延迟n个处理器时钟周期。延迟必须设置在0到512(含)的范围内。

参数:

  • xcore_clock_t clk - 要配置的时钟。
  • unsigned n - 延迟时钟上升沿的处理器时钟周期数。

另请参阅:


void set_clock_fall_delay()

设置时钟下降沿的延迟。

时钟的每个下降沿都会延迟n个处理器时钟周期。延迟可以设置在0到512(含)的范围内。

参数:

  • xcore_clock_t clk - 要配置的时钟。
  • unsigned n - 延迟时钟下降沿的处理器时钟周期数。

另请参阅:


void set_port_clock()

将时钟附加到指定端口。

此函数对应于在端口上使用SETCLK指令。时钟的边沿用于采样和输出数据。通常建议使用configure_*_port_*函数,因为这些函数能保证端口配置的变更,按照正确的顺序完成。

参数:

  • void port p - 要配置的端口。
  • const xcore_clock_t clk - 要附加的时钟。

另请参阅:


void set_port_ready_src()

此函数将一个1位端口设置为另一个端口的就绪输出(ready-out)。这相当于在端口上执行SETRDY指令。如果就绪输出端口不是1位端口,则会抛出异常。就绪输出端口的作用是指示相应端口已准备好进行数据传输。

通常,推荐使用configure_*_port_*系列函数来进行端口配置,因为它们可以确保所有必要的配置更改都按照正确的顺序完成,以达到预期的模式。

参数:

  • void port ready - 作为就绪输出信号的1位端口。
  • void port p - 需要配置的端口。

另请参阅:


void set_clock_ready_src()

此函数设置时钟,以使用1位端口作为就绪输入(ready-in)信号。这相当于在时钟上执行SETRDY指令。如果端口不是1位端口,则会抛出异常。就绪输入端口负责控制何时从引脚采集数据。

通常,推荐使用configure_*_port_*系列函数来进行端口配置,因为它们可以确保所有必要的配置更改都按照正确的顺序完成,以达到预期的模式。

参数:

  • xcore_clock_t clk - 需要配置的时钟。
  • void port ready - 作为就绪输入信号的1位端口。

另请参阅:


void set_clock_on()

此函数用于开启一个时钟。时钟会被初始化为默认状态。如果时钟已经处于开启状态,那么它会被重置为默认状态。

参数:

  • xcore_clock_t clk - 需要开启的时钟。

另请参阅:


void set_clock_off()

此函数用于关闭一个时钟。如果时钟已经是关闭状态,那么不会执行任何操作。在时钟关闭时尝试使用它,将会抛出异常。

参数:

  • xcore_clock_t clk - 需要关闭的时钟。

另请参阅:


void start_clock()

此函数将时钟置于运行状态。只有在置于此状态之后,时钟才会开始产生时钟边沿。所有连接到此时钟的端口的计数器都会被重置为0。

参数:

  • xcore_clock_t clk - 需要置于运行状态的时钟。

另请参阅:


void stop_clock()

此函数会等待时钟变为低电平,然后将其置于停止状态。在停止状态下,时钟不会产生任何边沿。

参数:

  • xcore_clock_t clk - 需要置于停止状态的时钟。

另请参阅:


定时器函数

void elate()

如果指定时间小于参考时间,则引发ET_ECALL异常。

参数:

  • unsigned int time – [输入] 时间值。

XS2A/XS3A特殊处理:

#if defined(__XS2A__) || defined(__XS3A__)
#define elate(t) __builtin_elate(t)
#endif

端口配置函数

以下函数用于配置XS1和XS2设备上端口行为的各个方面。

void configure_in_port_handshake()

此函数用于将缓冲端口设置为握手模式的时钟输入端口。

该函数的作用是初始化缓冲端口,使其能够在握手模式下工作。如果ready-inready-out端口不是单比特端口,系统将抛出异常。当端口缓冲区未满时,ready-out端口会在时钟的下降沿被激活。只有当ready-inready-out端口同时被激活时,端口才会在其采样边沿对引脚进行采样。

默认情况下,端口的采样边沿是时钟的上升沿,但可以通过set_port_sample_delay()函数进行修改。

参数说明:

  • void port p - 需要设置的缓冲端口。
  • in port readyin - 作为就绪输入信号的单比特端口。
  • out port readyout - 作为就绪输出信号的单比特端口。
  • xcore_clock_t clk - 用于配置端口的时钟信号。

相关函数:


void configure_out_port_handshake()

此函数用于将缓冲端口设置为握手模式的时钟输出端口。

如果ready-inready-out端口不是单比特端口,将会抛出异常。端口会持续在其引脚上输出初始值,直至有输出语句改变这一输出值。在缓冲端口的采样时钟边沿,会读取ready-in端口的值。如果在前一个时钟周期内ready-in端口的值为高,则在下一个时钟的下降边沿输出数据。同时,在时钟的下降边沿,如果有数据输出,则ready-out端口会被置为高电平,否则为低电平。

默认情况下,端口的采样边沿是时钟的上升沿,但可以通过set_port_sample_delay()函数进行修改。

参数说明:

  • void port p - 需要配置的缓冲端口。
  • in port readyin - 用作ready-in信号的单比特端口。
  • out port readyout - 用作ready-out信号的单比特端口。
  • xcore_clock_t clk - 用于配置端口的时钟源。
  • unsigned initial - 端口上的初始输出值。

参见:


void configure_in_port_strobed_master()

此函数用于将缓冲端口设置为strobed master模式的时钟输入端口。

如果ready-out端口不是单比特端口,将会抛出异常。当端口缓冲区未满时,ready-out端口会在时钟的下降边沿被置为有效状态。在ready-out端口有效后的下一个采样边沿,端口会采样其引脚上的信号。

默认情况下,端口的采样边沿是时钟的上升沿,但可以通过set_port_sample_delay()函数进行修改。

参数说明:

  • void port p - 需要配置的缓冲端口。
  • out port readyout - 用作ready-out信号的单比特端口。
  • const xcore_clock_t clk - 用于配置端口的时钟源。

参见:


void configure_out_port_strobed_master()

配置缓冲端口为脉冲主模式的时钟输出端口。

此函数将缓冲端口设置为脉冲主模式,用于输出时钟信号。如果ready-out端口不是单比特端口,将会抛出异常。端口将在其引脚上输出初始值,直至输出操作更改该值。输出值将在下一个时钟周期的下降沿被更新。在时钟的下降沿,如果输出操作发生在该边沿,则ready-out端口将输出高电平,否则输出低电平。

参数说明:

  • void port p - 需要配置的缓冲端口。
  • out port readyout - 用于输出就绪信号的单比特端口。
  • const xcore_clock_t clk - 用于配置端口的时钟源。
  • unsigned initial - 端口上的初始输出值。

参见:


void configure_in_port_strobed_slave()

配置缓冲端口为脉冲从模式的时钟输入端口。

此函数将缓冲端口设置为脉冲从模式,用于输入时钟信号。如果ready-in端口不是单比特端口,将会抛出异常。当ready-in信号为高电平时,端口将在其采样边沿采样引脚状态。默认情况下,采样边沿为时钟的上升沿,但可以通过set_port_sample_delay()函数进行修改。

参数说明:

  • void port p - 需要配置的缓冲端口。
  • in port readyin - 用于输入就绪信号的单比特端口。
  • xcore_clock_t clk - 用于配置端口的时钟源。

参见:


void configure_out_port_strobed_slave()

配置缓冲端口为脉冲从模式的时钟输出端口。

此函数将缓冲端口设置为脉冲从模式,用于输出时钟信号。如果ready-in端口不是单比特端口,将会抛出异常。端口将在其引脚上输出初始值,直至输出操作更改该值。ready-in端口的状态将在端口的采样边沿被读取,而输出操作将在下一个时钟周期的下降沿更新,前提是ready-in端口在该边沿读取的值为高电平。默认情况下,采样边沿为时钟的上升沿,但可以通过set_port_sample_delay()函数进行修改。

参数说明:

  • void port p - 需要配置的缓冲端口。
  • in port readyin - 用于输入就绪信号的单比特端口。
  • xcore_clock_t clk - 用于配置端口的时钟源。
  • unsigned initial - 端口上的初始输出值。

参见:


void configure_in_port()

配置端口为无就绪信号的时钟输入端口。

此函数用于将端口(无论是缓冲还是非缓冲)设置为无需就绪信号即可操作的时钟输入端口。端口将在其采样边沿上采样引脚状态。如果端口是非缓冲的,可以通过执行输出操作来改变其方向,这将在下一个时钟周期的下降沿发生。之后,端口将作为无就绪信号的输出端口操作。

默认情况下,端口的采样边沿为时钟的上升沿,但可以通过set_port_sample_delay()函数进行修改。

参数说明:

  • void port p - 需要配置的端口。
  • const xcore_clock_t clk - 用于配置端口的时钟源。

参见:


void configure_in_port_no_ready()

configure_in_port()的同义函数。

参见:


void configure_out_port()

配置端口为无就绪信号的时钟输出端口。

此函数用于将端口(无论是缓冲还是非缓冲)设置为无需就绪信号即可操作的时钟输出端口。端口将在其引脚上输出初始值,直至输入或输出操作更改该值。输出将在下一个时钟周期的下降沿更新,且每个端口宽度的数据位将保持一个时钟周期。如果端口是非缓冲的,在任何待处理的输出保持一个时钟周期后,可以执行输入操作来改变方向。之后,端口将作为无就绪信号的输入端口操作。

参数说明:

  • void port p - 需要配置的端口。
  • const xcore_clock_t clk - 用于配置端口的时钟源。
  • unsigned initial - 端口上的初始输出值。

参见:


void configure_out_port_no_ready()

configure_out_port()的同义函数。

参见:


void set_port_use_on()

此函数用于开启一个端口。端口会被初始化为其类型默认的状态。如果端口已经是开启状态,那么它会被重置为默认状态。

参数:

  • void port p - 需要开启的端口。

另请参阅:


void set_port_use_off()

此函数用于关闭一个端口。如果端口已经是关闭状态,那么不会执行任何操作。在端口关闭时尝试使用它,将会抛出异常。

参数:

  • void port p - 需要关闭的端口。

另请参阅:


void set_port_mode_data()

此函数将端口配置为数据端口。这是端口的默认状态。端口的输出操作用于控制其输出信号。

参数:

  • void port p - 需要配置的端口。

另请参阅:


void set_port_mode_clock()

此函数用于将单比特端口配置为时钟输出端口。该端口会输出其所连接的时钟信号。如果该端口不是单比特端口,将会抛出异常。若要将端口恢复到其默认状态,可以使用set_port_mode_data()函数。

参数:

  • void port p - 需要配置的端口。

参见:


void set_port_mode_ready()

此函数用于将单比特端口配置为就绪信号输出端口。端口将输出通过set_port_ready_src()设置的相关端口的就绪信号。如果该端口不是单比特端口,将会抛出异常。若要将端口恢复到其默认状态,可以使用set_port_mode_data()函数。

通常,推荐使用configure_*_port_*系列函数进行端口配置,因为这些函数能保证所有必要的配置更改都按照正确的顺序完成,以达到预期的模式。

参数:

  • void port p - 需要配置的端口。

参见:


void set_port_drive()

此函数用于将端口配置为驱动模式。在此模式下,端口输出的值会直接驱动到引脚上。这是端口的默认驱动状态。调用set_port_drive()会副作用地禁用端口的上拉或下拉电阻。

参数:

  • void port p - 需要配置的端口。

参见:


void set_port_drive_low()

此函数用于将端口配置为低电平驱动模式。在此模式下,当向引脚输出0时,它会被驱动为低电平;输出1时,则不驱动任何电平。对于XS1设备,如果端口不是单比特端口,向该端口输出的结果是未定义的。在XS2和XS1-G设备上,调用set_port_drive_low()会副作用地启用端口的内部上拉电阻。而在XS1-L设备上,调用set_port_drive_low()会启用端口的内部下拉电阻。

参数:

  • void port p - 需要配置的端口。

参见:


void set_port_drive_high(void port p)

配置端口为高驱动模式。当向引脚输出1时,它被驱动为高电平;当输出0时,不产生任何输出。在XS2设备上,此函数还会启用端口的内部下拉电阻。此函数在XS1设备上不可用。

  • void port p: 要配置的端口。

另请参阅:


void set_port_pull_up(void port p)

启用端口的内部上拉电阻,确保当没有任何信号驱动引脚时,端口采样到的值为1。在XS2和XS1-G设备上,这也会将端口配置为低驱动模式。在XS1-L设备上,上拉电阻不可用,如果调用此函数将会引发异常。

  • void port p: 要配置的端口。

另请参阅:


void set_port_pull_down(void port p)

启用端口的内部下拉电阻,确保当没有任何信号驱动引脚时,端口采样到的值为0。在XS2设备上,这会将端口配置为高驱动模式。在XS1-G设备上,下拉电阻不可用,如果调用此函数将会引发异常。在XS1-L设备上,这也会将端口配置为低驱动模式。

  • void port p: 要配置的端口。

另请参阅:


void set_port_pull_none(void port p)

禁用端口的上拉或下拉电阻,这会导致端口配置为驱动模式。

  • void port p: 要配置的端口。

另请参阅:


void set_port_master(void port p)

将端口设置为主模式。通常使用值XS1_SETC_MS_MASTER和SETC指令来完成此操作。通常最好使用函数configure_in_port_strobed_master()configure_out_port_strobed_master(),因为它们确保所有必需的配置更改按正确顺序进行。

  • void port p: 要配置的端口。

另请参阅:


void set_port_slave(void port p)

将端口设置为从模式。通常使用值XS1_SETC_MS_SLAVE和SETC指令来完成此操作。通常最好使用函数configure_in_port_strobed_slave()configure_out_port_strobed_slave(),因为它们确保所有必需的配置更改按正确顺序进行。

  • void port p: 要配置的端口。

另请参阅:


void set_port_no_ready(void port p)

配置端口不使用准备信号。通常使用值XS1_SETC_RDY_NOREADY和SETC指令来完成此操作。通常最好使用函数configure_in_port()configure_out_port(),因为它们确保所有必需的配置更改按正确顺序进行。

  • void port p: 要配置的端口。

另请参阅:


void set_port_strobed(void port p)

将端口设置为 strobed 模式。通常使用值XS1_SETC_RDY_STROBED和SETC指令来完成此操作。通常最好使用configure_*_port_strobed_*函数,因为它们确保所有必需的配置更改按正确顺序进行。

  • void port p: 要配置的端口。

另请参阅:


void set_port_handshake(void port p)

将端口设置为握手模式。通常使用值XS1_SETC_RDY_HANDSHAKE和SETC指令来完成此操作。通常最好使用configure_*_port_handshake函数,因为它们确保所有必需的配置更改按正确顺序进行。

  • void port p: 要配置的端口。

另请参阅:


void set_port_no_sample_delay(void port p)

将端口设置为无采样延迟模式,使其在时钟的上升沿上采样输入数据。这是端口的默认状态。

  • void port p: 要配置的端口。

另请参阅:


void set_port_sample_delay()

设置端口为采样延迟模式。这会导致端口在其时钟的下降沿上采样输入数据。

参数:

  • void port p - 要配置的端口。

另请参阅:


void set_port_no_inv()

配置端口不反转在其引脚上采样和驱动的数据。这是端口的默认状态。

参数:

  • void port p - 要配置的端口。

另请参阅:


void set_port_inv()

配置一个1位端口反转在其引脚上采样和驱动的数据。如果端口不是1位端口,则会引发异常。如果端口用作时钟的源,则设置此模式将导致交换时钟的上升沿和下降沿。

参数:

  • void port p - 要配置的1位端口。

另请参阅:


void set_port_shift_count()

设置端口的移位计数。这对应于SETPSC指令。新的移位计数必须小于端口的传输宽度,大于零,并且是端口宽度的倍数,否则会引发异常。

参数:

  • void port p - 要配置的缓冲端口。
  • unsigned n - 新的移位计数。

另请参阅:

  • partin
  • partin_timestamped
  • partout
  • partout_timed
  • partout_timestamped

void set_pad_delay()

设置连接到端口的引脚的延迟。在端口的引脚上采样的输入信号在被端口看到之前会延迟这么多个处理器时钟周期。延迟必须设置为0到5之间的值。

参数:

  • void port p - 要配置的端口。
  • unsigned n - 要延迟输入信号的处理器时钟周期数。

另请参阅:

  • set_clock_rise_delay
  • set_clock_fall_delay

reconfigure_port

动态重新配置端口的类型。此函数重新配置端口的类型。在重新配置端口时,端口上的所有状态(缓冲输入值等)都会丢失。

使用示例:

void f(in port p) {
in port * movable pp = &p;
in buffered port:32 * movable q;
q = reconfigure_port(move(pp), in buffered port:32);

// 在这里使用 *q 作为缓冲端口

pp = reconfigure_port(move(q), in port);
}

逻辑核模式

void set_core_fast_mode_on()

将当前逻辑核设置为快速模式运行。这会减少某些操作的最坏情况延迟,但可能会增加功耗。


void set_core_fast_mode_off()

将当前逻辑核设置为正常执行模式。如果之前使用set_core_fast_mode_on将执行模式设置为快速模式,此函数将重置执行模式为其默认状态。

另请参阅:


set_thread_fast_mode_on()

set_core_fast_mode_on() 的别名。


set_thread_fast_mode_off()

set_core_fast_mode_off() 的别名。


void set_core_high_priority_on()

将当前逻辑核心设置为高优先级模式运行。

在高优先级模式下,核心将优先于常规低优先级核心运行,但至少会有一个低优先级核心在低优先级队列的每次迭代中运行。

另请参阅:


void set_core_high_priority_off()

将当前逻辑核心设置为低优先级模式运行。

另请参阅:


通道控制函数

void outuchar()

在通道端点上以无符号字符形式流出一个值。

所使用的协议与输入(:> 操作符)和输出(<: 操作符)所使用的协议不兼容。

参数:

  • chanend c - 用于流出数据的通道端点。
  • unsigned char val - 要输出的值。

另请参阅:

注:

此函数实现为调用__builtin_out_uchar的宏。


void outuint()

在通道端点上以无符号整数形式流出一个值。

所使用的协议与输入(:> 操作符)和输出(<: 操作符)所使用的协议不兼容。

参数:

  • chanend c - 用于流出数据的通道端点。
  • unsigned val - 要输出的值。

另请参阅:

注:

此函数实现为调用__builtin_out_uint的宏。


unsigned char inuchar()

从通道端口中读取一个无符号字符。如果通道中的下一个标记是控制标记,则会引发异常。该协议与输入(:>)和输出(<:)操作符使用的协议不兼容。

参数:

  • chanend c - 用于读取数据的通道端口。

返回:

  • 作为无符号字符接收到的值。

另请参阅:


unsigned inuint()

从通道端口中读取一个无符号整数。如果通道中的下一个数据字包含控制标记,则会引发异常。该协议与输入(:>)和输出(<:)操作符使用的协议不兼容。

参数:

  • chanend c - 用于读取数据的通道端口。

返回:

  • 作为无符号整数接收到的值。

另请参阅:


void inuchar_byref()

从通道端口中读取一个无符号字符。输入的值被写入val。如果通道中的下一个标记是控制标记,则会引发异常。该协议与输入(:>)和输出(<:)操作符使用的协议不兼容。

参数:

  • chanend c - 用于读取数据的通道端口。
  • unsigned char &val - [输出] 要设置为接收到的值的变量。

另请参阅:


void inuint_byref()

从通道端口中读取一个无符号整数。输入的值被写入val。在select的情况下可能会调用此函数,在这种情况下,一旦通道上有数据可用,它就会立即准备就绪。该协议与输入(:>)和输出(<:)操作符使用的协议不兼容。

参数:

  • chanend c - 用于读取数据的通道端口。
  • unsigned &val - [输出] 要设置为接收到的值的变量。

另请参阅:


void sync()

等待直到端口完成任何未决的输出。等待直到端口完成任何未决的输出,并且数据的最后端口宽度位已经在引脚上保持了一个时钟周期。

参数:

  • void port p - 要等待的端口。

unsigned peek()

指示端口对其引脚上的当前值进行采样。无论其传输宽度、时钟、准备信号和缓冲如何,端口都会立即将采样的端口宽度数据提供给处理器。该输入对端口上随后进行的I/O没有影响。

参数:

  • void port p - 要查看的端口。

返回:

  • 作为无符号整数在引脚上采样的值。

void clearbuf()

清除端口使用的缓冲区。端口采样的任何未由处理器输入的数据都将被丢弃。处理器输出的任何未由端口驱动的数据都将被丢弃。如果端口正在串行化输出,它将立即被中断。

参数:

  • void port p - 要清除缓冲区的端口。

unsigned endin()

结束缓冲端口上的当前输入。返回端口采样但尚未由处理器输入的位数。随后在端口上进行的输入将返回传输宽度位的数据,直到剩余的数据少于一个传输宽度位。

参数:

  • void port p - 要结束当前输入的端口。

返回:

  • 剩余的数据位数。

unsigned partin()

在缓冲端口上执行指定宽度的输入。宽度必须小于端口的传输宽度,大于零,并且是端口宽度的倍数;否则将引发异常。

参数:

  • void port p - 要进行输入的缓冲端口。
  • unsigned n - 要输入的位数。

返回:

  • 作为无符号整数接收到的值。

另请参阅:


void partout()

在缓冲端口上执行指定宽度的输出。宽度必须小于端口的传输宽度,大于零,并且是端口宽度的倍数;否则将引发异常。

参数:

  • void port p - 要进行输出的缓冲端口。
  • unsigned n - 要输出的位数。
  • unsigned val - 要输出的值。

另请参阅:


unsigned partout_timed()

在缓冲端口上执行指定宽度的输出,当端口计数器等于指定的时间时。宽度必须小于端口的传输宽度,大于零,并且是端口宽度的倍数;否则将引发异常。

参数:

  • void port p - 要进行输出的缓冲端口。
  • unsigned n - 要输出的位数。
  • unsigned val - 要输出的值。
  • unsigned t - 要在其上进行输出的端口计数器值。

另请参阅:


{unsigned, unsigned} partin_timestamped()

在缓冲端口上执行指定宽度的输入,并为输入加上时间戳。

该宽度必须小于端口的传输宽度,大于零,并且是端口宽度的倍数;否则,将引发异常。如果端口的移位寄存器中的位数大于或等于指定的宽度,则返回值未定义。

参数:

  • void port p - 要进行输入的缓冲端口。
  • unsigned n - 要输入的位数。

返回:

  • 包含输入值和时间戳的元组。

另请参阅:


unsigned partout_timestamped()

在缓冲端口上执行指定宽度的输出,并为输出加上时间戳。

该宽度必须小于端口的传输宽度,大于零,并且是端口宽度的倍数;否则,将引发异常。valn个最低有效位将被输出。

参数:

  • void port p - 要进行输出的缓冲端口。
  • unsigned n - 要输出的位数。
  • unsigned val - 要输出的值。

返回:

  • 输出的时间戳。

另请参阅:


void outct()

在通道端口上流出控制令牌。尝试输出硬件控制令牌将引发异常。

参数:

  • chanend c - 要在其上流出数据的通道端口。
  • unsigned char val - 要输出的控制令牌值。

另请参阅:


void chkct()

检查给定值的控制令牌。如果通道中的下一个字节是匹配预期值的控制令牌,则将其输入并丢弃;否则,将引发异常。

参数:

  • chanend c - 通道端口。
  • unsigned char val - 期望的控制令牌值。

另请参阅:


unsigned char inct()

在通道端口上流入控制令牌。如果通道中的下一个字节不是控制令牌,则将引发异常;否则,将返回控制令牌的值。

参数:

  • chanend c - 要在其上流入数据的通道端口。

返回:

  • 接收到的控制令牌。

另请参阅:


void inct_byref()

在通道端口上流入控制令牌。输入的值被写入val。如果通道中的下一个字节不是控制令牌,则将引发异常。

参数:

  • chanend c - 要在其上流入数据的通道端口。
  • unsigned char &val - 要设置为接收值的变量。

另请参阅:


int testct()

测试通道端口上的下一个字节是否为控制令牌。该令牌不会从通道中丢弃,仍然可以进行输入。

参数:

  • chanend c - 要进行测试的通道端口。

返回:

  • 如果下一个字节是控制令牌,则返回1,否则返回0。

另请参阅:


int testwct()

测试通道端口上的下一个字是否包含控制令牌。如果字包含控制令牌,则返回字中的位置。不会从通道中丢弃任何数据。

参数:

  • chanend c - 要进行测试的通道端口。

返回:

  • 字中第一个控制令牌的位置(1-4),如果字中不包含控制令牌,则返回0。

另请参阅:


void soutct()

在流通道末端输出控制令牌。输出硬件控制令牌、\a CT_END或\a CT_PAUSE控制令牌都是无效的,并会引发异常。

参数:

  • streaming chanend c - 用于输出数据的通道末端。
  • unsigned char val - 要输出的控制令牌的值。

另请参阅:


void schkct()

检查流通道末端的控制令牌是否为给定值。如果通道中的下一个字节是与预期值匹配的控制令牌,则将其输入并丢弃;否则,将引发异常。

参数:

  • streaming chanend c - 流通道末端。
  • unsigned char val - 期望的控制令牌值。

另请参阅:


unsigned char sinct()

在流通道末端输入控制令牌。如果通道中的下一个字节不是控制令牌,则将引发异常;否则,将返回控制令牌的值。

参数:

  • streaming chanend c - 用于输入数据的流通道末端。

返回:

  • 接收到的控制令牌。

另请参阅:


void sinct_byref()

在流通道末端输入控制令牌,并将该值写入\a val。如果通道中的下一个字节不是控制令牌,则将引发异常。

参数:

  • streaming chanend c - 用于输入数据的流通道末端。
  • unsigned char &val - 要设置为接收值的变量。

另请参阅:


int stestct()

测试流通道末端的下一个字节是否为控制令牌。该令牌不会从通道中丢弃,仍然可以输入。

参数:

  • streaming chanend c - 要进行测试的通道末端。

返回:

  • 如果下一个字节为控制令牌,则返回1,否则返回0。

另请参阅:


int stestwct()

测试流通道末端的下一个字是否包含控制令牌。如果存在控制令牌,则返回字中的位置。不会从通道中丢弃任何数据。

参数:

  • streaming chanend c - 要进行测试的流通道末端。

返回:

  • 字中第一个控制令牌的位置(1-4),如果字中不包含控制令牌,则返回0。

另请参阅:


transaction out_char_array()

通过通道输出一块数据。该函数从src数组中发送size字节的数据到通道末端c

参数:

  • chanend c - 要输出的通道末端。
  • const char src[size] - 要发送的值数组。
  • unsigned size - 要输出的字节数。

另请参阅:


transaction in_char_array()

从通道中输入一块数据。该函数接收size字节的数据,并将其存储在dst数组中,从通道末端c中接收。

参数:

  • chanend c - 要输入的通道末端。
  • char dst[size] - 从通道中接收的值数组。
  • unsigned size - 要输入的字节数。

另请参阅:


void sout_char_array()

通过流通道输出一块数据。该函数从src数组中发送size字节的数据到流通道末端c

参数:

  • streaming chanend c - 要输出的流通道末端。
  • const char src[size] - 要发送的值数组。
  • unsigned size - 要输出的字节数。

另请参阅:


void sin_char_array()

从流通道中输入一块数据。该函数接收size字节的数据,并将其存储在dst数组中,从流通道末端c中接收。

参数:

  • streaming chanend c - 要输入的流通道末端。
  • char dst[size] - 从流通道中接收的值数组。
  • unsigned size - 要输入的字节数。

另请参阅:


CRC函数

void crc32()

将一个字(word)纳入循环冗余校验(CRC)中。

该函数使用指定的多项式对单个字进行CRC计算。checksum将被新的CRC值更新。

参数:

  • unsigned &checksum – [输入/输出]:校验和的初始值,将被新的校验和更新。
  • unsigned data – [输入]:要进行CRC计算的数据。
  • unsigned poly – [输入]:计算CRC时要使用的多项式。

相关函数:

宏定义:

#define crc32(checksum, data, poly) __builtin_crc32(checksum, data, poly)

unsigned crc8shr()

将一个字的8位纳入循环冗余校验(CRC)中。

该函数计算数据的最低有效位的8位CRC,并返回右移8位的数据。它使用新的CRC值更新checksum

参数:

  • unsigned &checksum – [输入/输出]:校验和的初始值,将被新的校验和更新。
  • unsigned data – [输入]:数据。
  • unsigned poly – [输入]:计算CRC时要使用的多项式。

返回值:

  • 右移8位的数据。

宏定义:

#define crc8shr(checksum, data, poly) __builtin_crc8shr(checksum, data, poly)

void crc32_inc()

将一个字纳入CRC,并同时将寄存器按指定数量增加。

该函数使用指定的多项式对数据的CRC进行更新,并将value按指定的increment增加。

参数:

  • unsigned int &checksum – [输入/输出]:校验和的初始值,将被新的校验和更新。
  • unsigned int data – [输入]:要进行CRC计算的数据。
  • unsigned int poly – [输入]:计算CRC时要使用的多项式。
  • unsigned int &value – [输入/输出]:要增加的值。
  • unsigned int increment – [输入]:增加的数量,可以是bpw、1、2、3、4、5、6、7、8、16、24、32之一。

相关函数:


void crcn()

将32位字的n位纳入循环冗余校验(CRC)中。

参数:

  • unsigned int &checksum – [输入/输出] 校验和的初始值,将使用新的校验和进行更新。
  • unsigned int data – [输入] 用于计算CRC的数据。
  • unsigned int poly – [输入] 计算CRC时使用的多项式。
  • unsigned int n – [输入] 要纳入的数据的低位数。

XS2A/XS3A特殊处理:

#if defined(__XS2A__) || defined(__XS3A__)
#define crcn(c, d, p, n) __builtin_crcn(c, d, p, n)
#endif

汇编ALU操作

{unsigned, unsigned} lmul()

将两个字相乘得到一个双字,并将两个单字相加。

该函数执行无法溢出的无符号乘法,将乘积与另外两个单字相加。

返回值:

  • 分别是计算的高位和低位。

相关函数:

宏定义:

#define lmul(a, b, c, d) __builtin_long_mul(a, b, c, d)

{unsigned, unsigned} mac()

将两个无符号字相乘得到一个双字,并将一个双字相加。

该函数计算无符号乘法的结果,并将其与双字相加。

返回值:

  • 分别是计算的高位和低位。

相关函数:

宏定义:

#define mac(a, b, c, d) __builtin_mac(a, b, c, d)

{signed, unsigned} macs()

将两个有符号字相乘,并将双字结果相加。

该函数计算有符号乘法的结果,并将其与双字相加。

返回值:

  • 分别是计算的高位和低位。

相关函数:

宏定义:

#define macs(a, b, c, d) __builtin_macs(a, b, c, d)

signed sext()

对输入进行符号扩展。

该函数对a的低b位进行符号扩展,将其解释为有符号整数,并用符号位填充高位。

返回值:

  • 扩展的有符号值。

相关函数:

宏定义:

#define sext(a, b) __builtin_sext(a, b)

unsigned zext()

对输入进行零扩展。

返回: 零扩展值。

#define zext(a,b) __builtin_zext(a,b)

位域函数

unsigned int lextract()

从64位值中提取一个位域。

参数:

  • unsigned long long value – [输入] 要从中提取位域的值。
  • unsigned int position – [输入] 字段的位位置。
  • unsigned int length – [输入] 字段的长度。

返回: 位域的值。

XS2A/XS3A特殊处理:

#if defined(__XS2A__) || defined(__XS3A__)
#define lextract(v, p, l) __builtin_lextract(v, p, l)
#endif

unsigned long long linsert()

将一个位域插入到64位值中。

参数:

  • unsigned long long value – [输入] 要在其中插入位域的64位值。
  • unsigned int bitfield – [输入] 位域的值。
  • unsigned int position – [输入] 字段的位位置。
  • unsigned int length – [输入] 字段的长度。

返回: 带有插入位域的64位值。

XS2A/XS3A特殊处理:

#if defined(__XS2A__) || defined(__XS3A__)
#define linsert(v, b, p, l) __builtin_linsert(v, b, p, l)
#endif

signed long long lsats()

对64位值执行饱和操作。

参数:

  • signed long long value – [输入] 要执行饱和操作的64位值。
  • unsigned int index – [输入] 检查溢出的位索引。

返回: 饱和的64位值。

XS2A/XS3A特殊处理:

#if defined(__XS2A__) || defined(__XS3A__)
#define lsats(v, i) __builtin_lsats(v, i)
#endif

Zip函数

unzip()

将64位值解压缩为两个32位值。

参数:

  • unsigned long long value – [输入] 64位压缩值。
  • unsigned int log_granularity – [输入] 粒度的对数。

返回: 两个32位未压缩值。

XS2A/XS3A特殊处理:

#if defined(__XS2A__) || defined(__XS3A__)
#define unzip(v, g) __builtin_unzip(v, g)
#endif

unsigned long long zip()

将两个32位值压缩为单个64位值。

参数:

  • unsigned int value1 – [输入] 第一个32位值。
  • unsigned int value2 – [输入] 第二个32位值。
  • unsigned int log_granularity – [输入] 粒度的对数。

返回: 64位压缩值。

XS2A/XS3A特殊处理:

#if defined(__XS2A__) || defined(__XS3A__)
#define zip(v1, v2, g) __builtin_zip(v1, v2, g)
#endif

端口等待函数

void pinseq()

等待端口引脚上的值等于指定值。

参数:

  • unsigned val – [输入] 要与之比较的值。
#define pinseq(val) __builtin_pins_eq(val)

void pinsneq()

等待端口引脚上的值不等于指定值。

参数:

  • unsigned val – [输入] 要与之比较的值。
#define pinsneq(val) __builtin_pins_ne(val)

void pinseq_at()

等待端口引脚上的值等于指定值,并且端口计数器等于指定时间。

参数:

  • unsigned val – [输入] 要与之比较的值。
  • unsigned time – [输入] 进行比较的时间。
#define pinseq_at(val, time) __builtin_pins_eq_at(val, time)

void pinsneq_at()

等待端口引脚上的值不等于指定值,并且端口计数器等于指定时间。

参数:

  • unsigned val – [输入] 要与之比较的值。
  • unsigned time – [输入] 进行比较的时间。
#define pinsneq_at(val, time) __builtin_pins_ne_at(val, time)

void timerafter()

等待直到计时器的时间等于指定值。

参数:

  • unsigned val – [输入] 要与之比较的时间。
#define timerafter(val) __builtin_timer_after(val)

timeafter

检查来自计时器的时间输入是否被认为在另一个计时器的时间输入之后。

参数:

  • unsigned A – [输入] 要比较的第一个时间。
  • unsigned B – [输入] 要比较的第二个时间。

返回: 第一个时间是否在第二个时间之后。

#define timeafter(A, B) ((int)((B) - (A)) < 0)

porttimeafter

检查从端口记录的时间是否在另一个从端口记录的时间之后。

参数:

  • unsigned A – [输入] 要比较的第一个时间。
  • unsigned B – [输入] 要比较的第二个时间。

返回: 第一个时间是否在第二个时间之后。

#define porttimeafter(A, B) ((short)((B) - (A)) < 0)

处理器状态寄存器函数

unsigned getps()

获取处理器状态寄存器的值。

该函数对应GETPS指令。如果参数不是合法的处理器状态寄存器,则会引发异常。

参数:

  • unsigned reg - 要读取的处理器状态寄存器。

返回值:

  • 处理器状态寄存器的值。

宏定义:

#define getps(reg) __builtin_getps(reg)

void setps()

设置处理器状态寄存器的值。

该函数对应SETPS指令。如果参数不是合法的处理器状态寄存器,则会引发异常。

参数:

  • unsigned reg - 要写入的处理器状态寄存器。
  • unsigned value - 要设置的处理器状态寄存器的值。

宏定义:

#define setps(reg, value) __builtin_setps(reg, value)

int read_pswitch_reg()

读取处理器切换寄存器的值。

该函数读取指定 Tile ID的本地处理器切换寄存器。成功时返回1,并将值赋给data。如果发生错误,或者寄存器编号或 Tile 标识符过大,则返回0。

参数:

  • unsigned tileid - Tile 标识符。
  • unsigned reg - 寄存器编号。
  • unsigned &data - 从寄存器中读取的值。[输出]

返回值:

  • 读取是否成功。

相关函数:

C语言中的替代签名:

int read_pswitch_reg(unsigned tileid, unsigned *reg, unsigned *data);

int write_pswitch_reg()

向处理器切换寄存器写入值。

该函数向指定 Tile ID的本地处理器切换寄存器写入值。如果成功收到确认,则返回1。如果发生错误,或者寄存器编号或 Tile 标识符过大,则返回0。

参数:

  • unsigned tileid - Tile 标识符。
  • unsigned reg - 寄存器编号。
  • unsigned data - 要写入寄存器的值。

返回值:

  • 写入是否成功。

相关函数:


int write_pswitch_reg_no_ack()

向处理器切换寄存器写入值,无需等待确认。

该函数向指定 Tile ID的本地处理器切换寄存器执行写入操作。如果参数有效,则返回1,无论写入操作是否成功,因为不需要确认。

参数:

  • unsigned tileid - Tile 标识符。
  • unsigned reg - 寄存器编号。
  • unsigned data - 要写入寄存器的值。

返回值:

  • 参数是否有效。

相关函数:


系统开关寄存器函数

int write_sswitch_reg()

向指定 Tile ID的本地系统开关寄存器写入数值。

参数:

  • unsigned tileid - Tile 标识符。
  • unsigned reg - 寄存器编号。
  • unsigned data - 要写入寄存器的数值。

返回: 如果写入成功,则返回1;否则返回0。

参见:


int write_sswitch_reg_no_ack()

向系统开关寄存器写入数值,无需等待确认。

参数:

  • unsigned tileid - Tile 标识符。
  • unsigned reg - 寄存器编号。
  • unsigned data - 要写入寄存器的数值。

返回: 如果参数有效,则返回1;否则返回0。

参见:


读写 Tile 寄存器函数

int read_tile_config_reg()

读取 Tile 配置寄存器的数值。

参数:

  • tileref tile - Tile 。
  • unsigned reg - 寄存器编号。
  • unsigned &data - [输出] 从寄存器中读取的数值。

返回: 如果读取成功,则返回1;否则返回0。

参见:


int write_tile_config_reg()

向 Tile 配置寄存器写入数值。

参数:

  • tileref tile - Tile 。
  • unsigned reg - 寄存器编号。
  • unsigned data - 要写入寄存器的数值。

返回: 如果写入成功,则返回1;否则返回0。

参见:


int write_tile_config_reg_no_ack()

向 Tile 配置寄存器写入数值,无需确认。

参数:

  • tileref tile - Tile 。
  • unsigned reg - 寄存器编号。
  • unsigned data - 要写入寄存器的数值。

返回: 如果参数有效,则返回1;否则返回0。

参见:


unsigned get_local_tile_id()

返回调用者所在 Tile 的路由ID。

路由ID在网络中唯一标识一个 Tile 。

返回:

  • unsigned - Tile 标识符。

另请参阅:


unsigned get_tile_id()

返回指定 Tile 的路由ID。

路由ID在网络中唯一标识一个 Tile 。

参数:

  • tileref t - Tile 。

返回:

  • unsigned - Tile 标识符。

另请参阅:


unsigned get_logical_core_id()

返回调用者所在逻辑核的标识符。

该标识符在当前 Tile 上唯一标识一个逻辑核。

返回:

  • unsigned - 逻辑核标识符。

另请参阅:

节点配置寄存器函数

int read_node_config_reg()

读取节点配置寄存器的数值。

参数:

  • tileref tile - 所属节点的 Tile 。
  • unsigned reg - 寄存器编号。
  • unsigned &data - [输出] 从寄存器中读取的数值。

返回: 如果读取成功,则返回1;否则返回0。

参见:


int write_node_config_reg()

向节点配置寄存器写入数值。

参数:

  • tileref tile - 所属节点的 Tile 。
  • unsigned reg - 寄存器编号。
  • unsigned data - 要写入寄存器的数值。

返回: 如果写入成功,则返回1;否则返回0。

参见:


int write_node_config_reg_no_ack()

向节点配置寄存器写入数值,无需确认。

参数:

  • tileref tile - 所属节点的 Tile 。
  • unsigned reg - 寄存器编号。
  • unsigned data - 要写入寄存器的数值。

返回: 如果参数有效,则返回1;否则返回0。

参见:


外设接口函数

int read_periph_8()

从具有8位接口的外设读取字节。

参数:

  • tileref tile - Tile 。
  • unsigned peripheral - 外设编号。
  • unsigned base_address - 基地址。
  • unsigned size - 要读取的8位值的数量。
  • unsigned char data[size] - [输出] 从外设读取的值。

返回: 如果读取成功,则返回1;否则返回0。

参见:


int write_periph_8()

向具有8位接口的外设写入字节。

参数:

  • tileref tile - Tile 。
  • unsigned peripheral - 外设编号。
  • unsigned base_address - 基地址。
  • unsigned size - 要写入的8位值的数量。
  • const unsigned char data[size] - 要写入外设的值。

返回: 如果写入成功,则返回1;否则返回0。

参见:


int write_periph_8_no_ack()

向具有8位接口的外设写入字节,无需确认。

参数:

  • tileref tile - Tile 。
  • unsigned peripheral - 外设编号。
  • unsigned base_address - 基地址。
  • unsigned size - 要写入的8位值的数量。
  • const unsigned char data[size] - 要写入外设的值。

返回: 如果参数有效,则返回1;否则返回0。

参见:


int write_periph_32()

size个32位字写入指定基地址的外设。

成功时返回1。失败时返回0。此函数通过使用大端字节顺序写入每个字的最高有效字节到最低地址的字节,向8位接口的外设写入数据。

参数:

  • tileref tile - Tile 。
  • unsigned peripheral - 外设编号。
  • unsigned base_address - 基地址。
  • unsigned size - 要写入的32位字的数量。
  • const unsigned data[size] - 要写入外设的值。

返回:

  • int - 写入是否成功。

另请参阅:


int write_periph_32_no_ack()

size个32位字写入指定基地址的外设,无需确认。

write_periph_32()不同,此函数不会等待写入完成,也不提供成功确认。它使用大端字节顺序用于8位接口的外设。

参数:

  • tileref tile - Tile 。
  • unsigned peripheral - 外设编号。
  • unsigned base_address - 基地址。
  • unsigned size - 要写入的32位字的数量。
  • const unsigned data[size] - 要写入外设的值。

返回:

  • int - 参数是否有效。

另请参阅:


已弃用的宏

已弃用的函数

  • get_core_id() 已弃用,不应再使用。
  • get_thread_id() 已弃用,不应再使用。