0

我设计了 RISCV32IM 处理器,并使用“riscv32/64-unknown-elf-gcc”生成测试代码。

它是一个无操作系统系统,指令代码中不需要堆栈指针。但是,如下编译时,会创建堆栈点操作,初始SP值为0,因此在指令代码执行过程中会出现故障。

riscv64-unknown-elf-gcc -march=rv32im -mabi=ilp32 -nostartfiles -fno-toplevel-reorder -fno-omit-frame-pointer -funwind-tables -O0 -x c  -Ttext 40000000 -Tdata 70000100 -Tbss 70000200 -o main.o main.c

C代码如下。

void    irq1 (void);
void    irq2 (void);
void    irq3 (void);
void    irq4 (void);
void    irq5 (void);
void    irq6 (void);
void    _start(void);

void _start (void)
{
    int     irq;

    IRQ0      = 0;
    DMEM_ROM4 = 0;
    while (1) {
            irq = (int) IRQ0;

            switch (irq) {
                    case 1  : irq1(); break;
                    case 2  : irq2(); break;
                    case 3  : irq3(); break;
                    case 4  : irq4(); break;
                    case 5  : irq5(); break;
                    case 6  : irq6(); break;
                    default : irq1();
            }
    }
}

编译生成的指令代码如下。在操作“4000005c”中,它跳出指令存储区并发生故障。

我想删除 SP 行为,我该怎么做?或者有没有办法即使使用 SP 也能正常工作?

40000000 <_start>:
40000000:       fe010113                addi    sp,sp,-32
40000004:       00112e23                sw      ra,28(sp)
40000008:       00812c23                sw      s0,24(sp)
4000000c:       02010413                addi    s0,sp,32
40000010:       700007b7                lui     a5,0x70000
40000014:       02078793                addi    a5,a5,32 # 70000020 <irq6+0x2ffff854>
40000018:       0007a023                sw      zero,0(a5)
4000001c:       700007b7                lui     a5,0x70000
40000020:       01078793                addi    a5,a5,16 # 70000010 <irq6+0x2ffff844>
40000024:       0007a023                sw      zero,0(a5)
40000028:       700007b7                lui     a5,0x70000
4000002c:       02078793                addi    a5,a5,32 # 70000020 <irq6+0x2ffff854>
40000030:       0007a783                lw      a5,0(a5)
40000034:       fef42623                sw      a5,-20(s0)
40000038:       fec42703                lw      a4,-20(s0)
4000003c:       00600793                li      a5,6
40000040:       04e7e863                bltu    a5,a4,40000090 <_start+0x90>
40000044:       fec42783                lw      a5,-20(s0)
40000048:       00279713                slli    a4,a5,0x2
4000004c:       400017b7                lui     a5,0x40001
40000050:       b6078793                addi    a5,a5,-1184 # 40000b60 <irq6+0x394>
40000054:       00f707b3                add     a5,a4,a5
40000058:       0007a783                lw      a5,0(a5)
4000005c:       00078067                jr      a5
40000060:       038000ef                jal     ra,40000098 <irq1>
40000064:       0300006f                j       40000094 <_start+0x94>
40000068:       180000ef                jal     ra,400001e8 <irq2>
4000006c:       0280006f                j       40000094 <_start+0x94>
4

0 回答 0