龙芯开源社区

 找回密码
 注册新用户(newuser)
查看: 1448|回复: 1

悬赏100元找根因

[复制链接]
发表于 2016-7-28 23:28:16 | 显示全部楼层 |阅读模式
本帖最后由 zt52952 于 2016-7-30 16:25 编辑

#include <gpr_o32.h>
#include <cp0_regs.h>

        .data
        .global  val0
        .global  val1
val0:
        .word 0x00000000
        .word 0x00000000
val1:
        .word 0x9f0c7ec0
        .word 0x00000006


        .text
        .align        2
        .set noreorder
        .set noat

        .globl  start
start:
        mtc0    zero, C0_STATUS
        nop

        mtc0    zero, C0_CAUSE
        nop

        mtc0    zero, C0_COMPARE
        nop

        // (使能CACHE)
        mfc0    t0, C0_CONFIG
        nop
        lui        a0, 0xffff
        ori        a0, 0xfff8
        and     t0, t0, a0
        ori     t0, t0, 0x3
        mtc0    t0, C0_CONFIG
        nop

        // sp = 0x800ffffc(设置堆栈)
        lui        sp, 0x800f
        ori        sp, 0xfffc


        jal led_init
        nop

        jal     main
        nop

/*
    程序运行不到此处,无法再调用led_on
*/

        jal led_on
        nop


3:
        j   3b
        nop



main:

        addi    sp, sp, 0xffd0 # -48   // 压栈
        sw      ra, 0(sp)              // 保存返回地址


        la      a0, val0
        la      t0, val1

        j        2f
        nop

1:
        la      a2, val1
        lw      v0, 0(a2)
        lw      v1, 4(a2)
        sw      v0, 0(a0)
        sw      v1, 4(a0)


        lw      v0, 0(sp)              // 恢复返回地址
        nop

#        sync

        addi    sp, sp, 0x30           // 恢复堆栈
        jr      v0                     // main函数返回
        nop



2:
        lw      v1, 0(t0)
        lui     t6, 0x00c0
        ori     t6, 0x42c0
        addu    t0, v1, t6

        j       1b
        nop




1. 这段程序运行不到led_on,CPU就飞了,也不产生任何异常
2. 这段程序死在main函数中,因为删除main调用,会正常运行led_on,点亮灯
3. main函数程序逻辑没有问题,因为关闭cache,程序会正常运行(似乎是cache一致性问题)
4. 将main函数恢复堆栈之前加sync指令或至少5个nop指令,程序也会正常运行(又似乎是内存加载延迟问题)

更奇怪的是如下现象
5. 将main函数返回jr  v0,改成jr  ra,程序也会正常运行
6. 将main函数中addu    t0, v1, t6改成addu    t5, v1, t6,程序也会正常运行
7. 将main函数中,如下改动,也会正常运行
        lui     t6, 0x00c0
        ori     t6, 0x42c0
   改成
        lui     t6, 0x0000
        ori     t6, 0x0000
8. val1值改小,也会运行
        val1:
                .word 0x9f0c7ec0
                .word 0x00000006
   改成
        val1:
                .word 0x00000000
                .word 0x00000000
9. 在main函数中,随意很小的改动,都会使程序可以运行。


注:

关闭cache方法
        将start函数中"ori     t0, t0, 0x3"换成"ori     t0, t0, 0x2"



如何编译此程序:

在Makefile中指定正确的编译器即可
TRGT         = mips-sde-elf-


如何运行此程序:

Loongson1C(智龙开发板)

PMON>load tftp://ip/step0
PMON>g




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册新用户(newuser)

x
 楼主| 发表于 2016-8-9 22:44:55 | 显示全部楼层
本帖最后由 zt52952 于 2016-8-9 22:49 编辑

更新:
    将上段程序放在PMON内存和Cache初始化之后调用就没有问题,后来跟踪发现spi初始化完成后就不行了,
最后确认关掉SPI0的内存映射后就不行了,在PMON启动完成后或加载的程序开始加入打开映射就可以了。

但还是不知道为什么spi0映射会影响内存里的一小段程序。


*(unsigned char*) 0xbfe80004 |= 0x01;   /* enable spi0 flash memory access */

本版积分规则

小黑屋|手机版|Archiver|Lemote Inc.  

GMT+8, 2019-3-21 20:02 , Processed in 0.171866 second(s), 18 queries .

快速回复 返回顶部 返回列表