Olá, caro leitor. Neste artigo apresentarei algumas características da XMOS startKIT, uma placa de desenvolvimento criada pela XMOS para divulgar a linha xCORE-XS1-ANALOG. O xCORE é uma classe de microcontroladores com diversos núcleos de processamento, determinístico e de baixa latência. Com isso, múltiplas tarefas podem ser executadas simultaneamente, compartilhando recursos e trocando mensagens.
XMOS startKIT: Conhecendo o Hardware
O startKIT possui as seguintes características:
- xCORE-Analog 8-core com depurador integrado.
- Conexão micro-USB para o depurador.
- Conector PCIe de propósito geral;
- Conector compatível com a Raspberry pi;
- Dois sensores capacitivos (touch slider);
- Matriz de LED 3×3;
- 2 LEDs adicionais;
- 1 Chave Tac;
- 4 entradas analógicas;
- Memória Flash de 256KB acessada via SPI;
- Expansor para outras startKITs.
No startKIT estão presentes dois xCORE (xCORE-Analog A8-DEV) em um único encapsulamento. Um dos dispositivos é utilizado para o depurador e o outro para aplicação.
O ambiente de programação é o xTIMEcomposer, baseado no eclipse. Com essa ferramenta é possível realizar a programação, depuração, simulação além de outras ferramentas para análise de execução.
Mais informações sobre o startKIT podem ser encontradas neste link.
Um pouco mais sobre a arquitetura do xCORE
Como dito anteriormente, xCORE é uma classe de microcontroladores com diversos núcleos de processamento. Na família XS1, esses núcleos são agrupados — entre 4 e 8 — formando uma unidade denominada xCORE tile. Além disso, um dispositivo pode conter mais de um xCORE tile. Na Figura 2 é mostrado essa divisão para dois arranjos com oito núcleos.

De modo geral, dentro do xCORE tile os recursos são compartilhados entre todos os núcleos xCORE. No entanto, cabe ressaltar que cada xCORE possui o próprio conjunto de registradores.
Todas as instruções são executadas em um ciclo de máquina e são processadas em um pipeline de quatro estágios compartilhado. Assim, os xCOREs ativos tem suas instruções executadas utilizando uma política de escalonamento Round Robin. A Figura 3 ilustra os estágios de execução considerando os cenários em que apenas um ou mais núcleos estão ativados.

Com quatro núcleos ativos, o processamento é dividido a um quarto dos ciclos para cada xCORE. Para mais de quatro núcleos, o processamento é dividido no mínimo por N. Além disso, é importante considerar que a taxa de processamento nunca será menor que o mínimo determinado.
Eventos, tarefas e troca de informações
Outra característica interessante é que não existem interrupções no sistema. Cada núcleo pode receber e aguardar eventos. As sincronizações desses eventos são gerenciadas pelo sistema xTIME. Eventos de I/O são gerenciados por unidades denominadas Hardware Response Ports, e direcionadas para o núcleo que utiliza tal recurso. Temporizadores e tarefas também podem gerar eventos para os núcleos.
Diante disso, uma tarefa pode ser executada sempre que um evento ocorre. No entanto, esse evento não interrompe a execução de outras tarefas. Outro ponto a ser notado é que tarefas podem ser finalizadas (Run to completion). Tal condição é ilustrada na Figura 4.
Já a comunicação entre os núcleos é realizada por meio de um barramento de alta velocidade denominado xCONNECT. Esse sistema também é utilizado para trocar informações entre os xCORE tiles, possibilitando também a comunicação com elementos externos.

Periféricos sob demanda
Devido as configurações flexíveis de entradas e saídas, muitos periféricos são estruturados via software. Atualmente, a XMOS fornece 40 bibliotecas para 40 tipos de periféricos (xSOFTip peripheral block). A lista de bibliotecas pode ser consultada neste link.
Programando o startKIT
Para facilitar o desenvolvimento das aplicações utilizando diversos núcleos de processamento a XMOS criou uma extensão para linguagem C denominada xC. No entanto, o projeto pode ser desenvolvido em C e C++, ou agregando as três linguagens [3]. O programa abaixo tem a mesma sintaxe em C e xC.
#include <stdio.h>
void hw ( unsigned n) {
printf (" Hello world from task number %u\n " , n);
}
int main () {
hw (0) ;
while(1){
}
return 0;
}
Após a compilação, um relatório dos recursos utilizados pode ser gerado. Para o exemplo acima, obteve-se o seguinte relatório:
Constraint check for tile[0]:
- Cores available: 8, used: 1;
- Timers available: 10, used: 1;
- Chanends available: 32, used: 0;
- Memory available: 65536, used: 8044;
- Stack: 504, Code: 6938, Data: 602.
Para gerenciar múltiplas tarefas foi criada a extensão par.
#include <stdio.h>
void hw ( unsigned n) {
printf (" Hello world from task number %u\n " , n);
}
int main () {
hw (0) ;
while(1){
par {
hw (0) ;
hw (1) ;
hw (2) ;
}
}
return 0;
}
Constraint check for tile[0]:
- Cores available: 8, used: 3;
- Timers available: 10, used: 3;
- Chanends available: 32, used: 0;
- Memory available: 65536, used: 9024;
- Stack: 1280, Code: 7082, Data: 662.
Utilizando a linguagem xC, o acesso à portas de I/O é realizado pelo operador <:. Abaixo é mostrado o exemplo clássico, piscar um LED.
#include <platform.h>
#include <xs1.h>
#include <timer.h>
port p = XS1_PORT_1A ;
int main () {
while (1) {
p <: 0;
delay_milliseconds (200) ;
p <: 1;
delay_milliseconds (200) ;
}
return 0;
}
Quer saber mais?
Este artigo foi uma breve introdução ao XMOS startKIT, destacando alguns recursos e caracterizando a arquitetura xCORE. Além do site e da documentação disponibilizada, existe um fórum com discussões técnicas e projetos disponível neste link.
Referências
[1] xCORE Architecture. [2] xCONNECT Architecture. [3] XMOS Programming Guide.




