有没有人成功使用基于汇编程序的led闪光灯用于xcore?

时间:2010-06-16 03:58:13

标签: assembly embedded

我喜欢http://www.xmos.com筹码,但希望能够更清楚地了解正在发生的事情。基本上是汇编程序。我试图找出像led闪光灯一样简单的东西,设置LED,计数到N清除LED,计数到N,永远循环。

当然我可以反汇编10行XC程序,但是如果你已经尝试过,你会发现每个程序中都有很多膨胀,有什么位支持编译器输出以及实际设置的是什么位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

构建并加载上面的汇编程序m.s:

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不喜欢语法,所以要查看带有gtkwave的m.vcd文件我必须编辑.vcd文件和

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

基本上删除所有paa变量定义行的0:

使用上面的汇编程序x0d14,x0d15,x0d19,x0d20是摆动可以从文档中看到连接的打击垫。

这个神奇的数字来自一个包含文件:

#define XS1_PORT_4C 0x40200

编辑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 个答案:

答案 0 :(得分:1)

发布大会,我会为你仔细研究。听起来很有趣。

编辑:

   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参考手册,但基于main中的控制流,这必须是访问流血通道的部分。要确认它,您可以在XC代码中添加一个标志,并在while循环中翻转LED。这应该将对上述内容的类似访问添加到程序集输出中。

根据指令集参考(第123页),out的第一个操作数是端口,第二个操作数是数据。 dp[0x5]操作数看起来像是从某种全局银行获取端口的句柄,然后用来查找相关资源。

一位知情人士向我建议你尝试-O2来清理代码。如果你试图跟踪正在发生的事情,我会跳过所有的初始化代码,它在大多数平台上总是一团糟。如果您只关注主标签和下一个过程(DoException)之间的界限,那么您应该看到可管理的代码量,这些代码映射到您编写的部件上。较小的btxx标签是控制结构的跳转目标(while循环,if语句)。

答案 1 :(得分:1)

假设您对机器进行原始编程,您需要获取端口ID,您可以在工具中的xs1.h包含文件中找到该端口ID。

将该端口ID加载到寄存器中,然后使用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

希望这会有所帮助......

答案 2 :(得分:1)

对不起,是的,您需要打开参考时钟模块并启动它。所以你需要我添加到程序中的三行。

形式为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值列表位于XS1 Architecture Manual的第172页。