Кто-нибудь был успешен в ассемблере на основе X-Core? - PullRequest
2 голосов
/ 16 июня 2010

Мне нравятся фишки http://www.xmos.com, но я хочу получить более низкий уровень понимания происходящего.В основном ассемблер.Я пытаюсь разобраться с чем-то таким простым, как индикатор мигания, установить индикатор, считать до N, очистить индикатор, считать до N, выполнить цикл навсегда.

Конечно, я могу разобрать программу XC из 10 строк, но есливы пытались увидеть, что в каждой программе много раздувания, какие биты должны поддерживать вывод компилятора и какие биты фактически настраивают gpio?

РЕДАКТИРОВАТЬ:

Код XC

#include 
out port bled = PORT_BUTTONLED ;
int main () {
   bled <: 0b0011 ;
   while (1)
     ;
   return 0;
}

Команды для сборки

source SetEnv
xcc bob.xc -target=XC-1A -o bob.xe
xsim --max-cycles 2000 --vcd-tracing "-o bob.vcd -ports -cycles -threads -timers -instructions -functions" bob.xe

РЕДАКТИРОВАТЬ 5

Вот ответ

.globl _start
_start:
    ldc r0,4
    ldc r2,8
    ldc r3,16
    ldc r1, 100
notmain:
    sub r1,r1,1
    bt r1, notmain

    ldap r11,constants
    set  dp,r11

    ldc  r3, 0x6
    setc res[r3], 0x8
    setc res[r3], 0xf

    ldw r3,dp[0x0]
    setc res[r3],0x8
    ldc r1,0x6
    setclk res[r3],r1

top:

    ldc    r0, 0x8
    out    res[r3], r0
    bl delay

    ldc    r0, 0x4
    out    res[r3], r0
    bl delay

    ldc    r0, 0x2
    out    res[r3], r0
    bl delay

    ldc    r0, 0x1
    out    res[r3], r0
    bl delay

    ldc    r0, 0x2
    out    res[r3], r0
    bl delay

    ldc    r0, 0x4
    out    res[r3], r0
    bl delay

    bu top

constants:
.word 0x00040200

delay:
    ldc r2, 1000
da:
    ldc r1, 10000
db:
    sub r1,r1,1
    bt r1, db
    sub r2,r2,1
    bt r2, da
    retsp 0x0

сборка и загрузкаВышеприведенный ассемблер ms:

xcc m.s -target=XC-1A -nostartfiles -o m.xe
xrun m.xe

вы можете сим и посмотреть на контакты / выводы чипа, если вы избавитесь от задержек, чтобы вы могли увидеть, что что-то происходит при разумной длине сима

xsim --max-cycles 2000 --vcd-tracing "-o m.vcd -ports -cycles -threads -timers -instructions -functions -pads" m.xe

, но gtkwave не нравится синтаксис, поэтому для просмотра этого файла m.vcd с помощью gtkwave мне нужно отредактировать файл .vcd и

from:
$var wire 1 paa10 0:X0D61 $end
to:
$var wire 1 paa10 X0D61 $end

В основном удалить 0: для всех определений переменной paaлинии.

с указанным выше ассемблером x0d14, x0d15,x0d19, x0d20 - это пэды, которые покачиваются, видят соединение из их документации.

Это магическое число происходит из включаемого файла:

#define XS1_PORT_4C 0x40200

EDIT 6

Henk,спасибо, что прыгнул, чтобы помочь.Я проверял, как далеко я продвинулся и не понял, что такое 0x6 и setclk, и мне пришлось заново задавать вопрос или копать глубже.Приведенный ниже код начинает шевелить порт, но затем xcore, по-видимому, выполняет перестановку потоков и практически зависает, так что это все еще не совсем простая программа, на которую я надеялся.И я понимаю, что это не простое ядро ​​(поэтому я хочу понять его на этом уровне, чтобы извлечь из него максимальную пользу).


.globl _start
_start:
    ldc r1, 100
notmain:
    sub r1,r1,1
    bt r1, notmain

    ldc r3,0x4020
    shl r3,r3,4
    setc res[r3],0x8
top:
    ldc    r0, 0x8
    out    res[r3], r0
    ldc    r0, 0x4
    out    res[r3], r0
    ldc    r0, 0x2
    out    res[r3], r0
    ldc    r0, 0x1
    out    res[r3], r0
    ldc    r0, 0x2
    out    res[r3], r0
    ldc    r0, 0x4
    out    res[r3], r0
    bu top

Ответы [ 3 ]

1 голос
/ 07 августа 2010

Предполагая, что вы программируете машину в сыром виде, вам нужно получить идентификатор порта, который вы можете найти в файле включения xs1.h в инструментах.

Загрузить этот идентификатор порта в регистр, затем использовать SETCчтобы включить порт и использовать OUT для ввода значения в порт.Установка часов порта не должна быть необходимой.Предполагая, что вы используете порт 0x10000, следующая последовательность должна дать вам очень короткий импульс.Используйте таймер, чтобы получить более длинный импульс;Если вы используете цикл, фактическое время зависит от тактовой частоты процессора и количества потоков.Таймер дает вам реальное время.

ldc r0, 1
shl r0, r0, 16 // Makes 0x10000
setc res[r0], 8
ldc r1, 1
out res[r0], r1
ldc r1, 0
out res[r0], r1

Надеюсь, это поможет ...

1 голос
/ 09 августа 2010

Извините, да, вам нужно включить блок опорных часов и запустить его. Итак, вам нужны три строки, которые я добавил в программу.

Ресурсом вида 0x00000y06 является блок часов y, поэтому 0x6 относится к блоку часов 0. setc 8 включает его, setc 0xf устанавливает работу часов. Когда часы «включены», но не «работают» (между setc 8 и setc 0xf), вы можете изменить настройки делителя. Раскомментируйте две строки, чтобы дать часам делитель, который замедлит выход.

.globl _start
_start:
    ldc r1, 100
notmain:
    sub r1,r1,1
    bt r1, notmain

    ldc r3,0x4020
    shl r3,r3,4
    setc res[r3],0x8
    ldc r1,0x6
    setc res[r1],0x8
    // ldc  r2, 8
    // setd res[r1], r2
    setc res[r1],0xf

top:
    ldc    r0, 0x8
    out    res[r3], r0
    ldc    r0, 0x4
    out    res[r3], r0
    ldc    r0, 0x2
    out    res[r3], r0
    ldc    r0, 0x1
    out    res[r3], r0
    ldc    r0, 0x2
    out    res[r3], r0
    ldc    r0, 0x4
    out    res[r3], r0
    bu top

Надеюсь, это поможет.

Хенк

PS - список значений SETC приведен на стр. 172 Руководства по архитектуре XS1 .

1 голос
/ 04 августа 2010

Опубликуйте сборку, и я просмотрю ее для вас. Звучит интересно.

Edit:

   0x000100ac: 00 f0 45 58: ldw (lru6)      r1, dp[0x5]
   0x000100b0: d2 a6:       mkmsk (rus)     r0, 0x2
   0x000100b2: c1 ae:       out (r2r)       res[r1], r0

Я думаю, что это та часть, которую вы ищете. Мне нужно будет найти справочное руководство по XMOS, но на основе потока управления в основном это должна быть часть, которая обращается к каналу для удаления. Чтобы подтвердить это, вы можете добавить флаг в код XC и включить светодиод в цикле while. Это должно добавить аналогичный доступ к вышесказанному в выводе сборки.

Согласно справочнику по набору инструкций (стр. 123), первым операндом для выхода является порт, а вторым - данные. Операнд dp[0x5] выглядит так, как будто он берет дескриптор порта из какого-то глобального банка, а затем использует его для поиска соответствующего ресурса.

Знающий человек предложил мне попробовать -O2, чтобы очистить код. Если вы пытаетесь следить за тем, что происходит, я бы пропустил весь код инициализации, это всегда беспорядок на большинстве платформ. Если вы просто сконцентрируетесь на линиях между основной меткой и следующей процедурой (DoException), тогда вы должны увидеть управляемый объем кода, который отображается на написанную вами часть. Меньшие метки btxx являются целями перехода для управляющих конструкций (циклы while, операторы if).

...