parent
e714a0ba63
commit
000bb19ad2
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
RISCV_ARCH := rv32im
|
||||||
|
RISCV_ABI := ilp32
|
||||||
|
|
||||||
|
RISCV_PATH := ../../../tools/gnu-mcu-eclipse-riscv-none-gcc-8.2.0-2.2-20190521-0004-win64/
|
||||||
|
|
||||||
|
CFLAGS += -march=$(RISCV_ARCH)
|
||||||
|
CFLAGS += -mabi=$(RISCV_ABI)
|
||||||
|
CFLAGS += -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles
|
||||||
|
|
||||||
|
RISCV_GCC := $(abspath $(RISCV_PATH)/bin/riscv-none-embed-gcc)
|
||||||
|
RISCV_AS := $(abspath $(RISCV_PATH)/bin/riscv-none-embed-as)
|
||||||
|
RISCV_GXX := $(abspath $(RISCV_PATH)/bin/riscv-none-embed-g++)
|
||||||
|
RISCV_OBJDUMP := $(abspath $(RISCV_PATH)/bin/riscv-none-embed-objdump)
|
||||||
|
RISCV_GDB := $(abspath $(RISCV_PATH)/bin/riscv-none-embed-gdb)
|
||||||
|
RISCV_AR := $(abspath $(RISCV_PATH)/bin/riscv-none-embed-ar)
|
||||||
|
RISCV_OBJCOPY := $(abspath $(RISCV_PATH)/bin/riscv-none-embed-objcopy)
|
||||||
|
RISCV_READELF := $(abspath $(RISCV_PATH)/bin/riscv-none-embed-readelf)
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all:
|
||||||
|
$(RISCV_GCC) $(CFLAGS) start.S main.c -Tlink.ld -o gpio
|
||||||
|
$(RISCV_OBJCOPY) -O binary gpio gpio.bin
|
||||||
|
$(RISCV_OBJDUMP) --disassemble-all gpio > gpio.dump
|
|
@ -0,0 +1 @@
|
||||||
|
通过一个GPIO来控制板上的LED以1Hz频率闪烁。
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,167 @@
|
||||||
|
|
||||||
|
gpio: file format elf32-littleriscv
|
||||||
|
|
||||||
|
|
||||||
|
Disassembly of section .init:
|
||||||
|
|
||||||
|
00000000 <_start>:
|
||||||
|
0: 0040006f j 4 <_reset_handler>
|
||||||
|
|
||||||
|
00000004 <_reset_handler>:
|
||||||
|
4: 10000197 auipc gp,0x10000
|
||||||
|
8: 7fc18193 addi gp,gp,2044 # 10000800 <__global_pointer$>
|
||||||
|
c: 00018113 mv sp,gp
|
||||||
|
10: 00000d13 li s10,0
|
||||||
|
14: 00000d93 li s11,0
|
||||||
|
18: 1d000513 li a0,464
|
||||||
|
1c: 10000597 auipc a1,0x10000
|
||||||
|
20: fe458593 addi a1,a1,-28 # 10000000 <_data>
|
||||||
|
24: 10000617 auipc a2,0x10000
|
||||||
|
28: fdc60613 addi a2,a2,-36 # 10000000 <_data>
|
||||||
|
2c: 00c5fc63 bgeu a1,a2,44 <_reset_handler+0x40>
|
||||||
|
30: 00052283 lw t0,0(a0)
|
||||||
|
34: 0055a023 sw t0,0(a1)
|
||||||
|
38: 00450513 addi a0,a0,4
|
||||||
|
3c: 00458593 addi a1,a1,4
|
||||||
|
40: fec5e8e3 bltu a1,a2,30 <_reset_handler+0x2c>
|
||||||
|
44: 10000517 auipc a0,0x10000
|
||||||
|
48: fbc50513 addi a0,a0,-68 # 10000000 <_data>
|
||||||
|
4c: 10000597 auipc a1,0x10000
|
||||||
|
50: fb458593 addi a1,a1,-76 # 10000000 <_data>
|
||||||
|
54: 00b57863 bgeu a0,a1,64 <_reset_handler+0x60>
|
||||||
|
58: 00052023 sw zero,0(a0)
|
||||||
|
5c: 00450513 addi a0,a0,4
|
||||||
|
60: feb56ce3 bltu a0,a1,58 <_reset_handler+0x54>
|
||||||
|
64: 134000ef jal ra,198 <main>
|
||||||
|
68: 00100d13 li s10,1
|
||||||
|
|
||||||
|
0000006c <loop>:
|
||||||
|
6c: 0000006f j 6c <loop>
|
||||||
|
|
||||||
|
Disassembly of section .text:
|
||||||
|
|
||||||
|
00000070 <delay_ms>:
|
||||||
|
70: fb010113 addi sp,sp,-80
|
||||||
|
74: 04812623 sw s0,76(sp)
|
||||||
|
78: 05010413 addi s0,sp,80
|
||||||
|
7c: faa42e23 sw a0,-68(s0)
|
||||||
|
80: c0002773 rdcycle a4
|
||||||
|
84: fee42623 sw a4,-20(s0)
|
||||||
|
88: fec42703 lw a4,-20(s0)
|
||||||
|
8c: fee42023 sw a4,-32(s0)
|
||||||
|
90: fe042223 sw zero,-28(s0)
|
||||||
|
94: c8002773 rdcycleh a4
|
||||||
|
98: fce42e23 sw a4,-36(s0)
|
||||||
|
9c: fdc42703 lw a4,-36(s0)
|
||||||
|
a0: 00070793 mv a5,a4
|
||||||
|
a4: 00000813 li a6,0
|
||||||
|
a8: 00079e93 slli t4,a5,0x0
|
||||||
|
ac: 00000e13 li t3,0
|
||||||
|
b0: fe042683 lw a3,-32(s0)
|
||||||
|
b4: fe442703 lw a4,-28(s0)
|
||||||
|
b8: 01c687b3 add a5,a3,t3
|
||||||
|
bc: 00078513 mv a0,a5
|
||||||
|
c0: 00d53533 sltu a0,a0,a3
|
||||||
|
c4: 01d70833 add a6,a4,t4
|
||||||
|
c8: 01050733 add a4,a0,a6
|
||||||
|
cc: 00070813 mv a6,a4
|
||||||
|
d0: fef42023 sw a5,-32(s0)
|
||||||
|
d4: ff042223 sw a6,-28(s0)
|
||||||
|
d8: c00027f3 rdcycle a5
|
||||||
|
dc: fcf42c23 sw a5,-40(s0)
|
||||||
|
e0: fd842783 lw a5,-40(s0)
|
||||||
|
e4: fcf42823 sw a5,-48(s0)
|
||||||
|
e8: fc042a23 sw zero,-44(s0)
|
||||||
|
ec: c80027f3 rdcycleh a5
|
||||||
|
f0: fcf42623 sw a5,-52(s0)
|
||||||
|
f4: fcc42783 lw a5,-52(s0)
|
||||||
|
f8: 00078f13 mv t5,a5
|
||||||
|
fc: 00000f93 li t6,0
|
||||||
|
100: 000f1393 slli t2,t5,0x0
|
||||||
|
104: 00000313 li t1,0
|
||||||
|
108: fd042683 lw a3,-48(s0)
|
||||||
|
10c: fd442703 lw a4,-44(s0)
|
||||||
|
110: 006687b3 add a5,a3,t1
|
||||||
|
114: 00078513 mv a0,a5
|
||||||
|
118: 00d53533 sltu a0,a0,a3
|
||||||
|
11c: 00770833 add a6,a4,t2
|
||||||
|
120: 01050733 add a4,a0,a6
|
||||||
|
124: 00070813 mv a6,a4
|
||||||
|
128: fcf42823 sw a5,-48(s0)
|
||||||
|
12c: fd042a23 sw a6,-44(s0)
|
||||||
|
130: fbc42703 lw a4,-68(s0)
|
||||||
|
134: 0000c7b7 lui a5,0xc
|
||||||
|
138: 35078793 addi a5,a5,848 # c350 <__stack_size+0xbf50>
|
||||||
|
13c: 02f707b3 mul a5,a4,a5
|
||||||
|
140: 00078593 mv a1,a5
|
||||||
|
144: 00000613 li a2,0
|
||||||
|
148: fe042683 lw a3,-32(s0)
|
||||||
|
14c: fe442703 lw a4,-28(s0)
|
||||||
|
150: 00d587b3 add a5,a1,a3
|
||||||
|
154: 00078513 mv a0,a5
|
||||||
|
158: 00b53533 sltu a0,a0,a1
|
||||||
|
15c: 00e60833 add a6,a2,a4
|
||||||
|
160: 01050733 add a4,a0,a6
|
||||||
|
164: 00070813 mv a6,a4
|
||||||
|
168: fd442703 lw a4,-44(s0)
|
||||||
|
16c: 00080693 mv a3,a6
|
||||||
|
170: f6d764e3 bltu a4,a3,d8 <delay_ms+0x68>
|
||||||
|
174: fd442703 lw a4,-44(s0)
|
||||||
|
178: 00080693 mv a3,a6
|
||||||
|
17c: 00d71663 bne a4,a3,188 <delay_ms+0x118>
|
||||||
|
180: fd042703 lw a4,-48(s0)
|
||||||
|
184: f4f76ae3 bltu a4,a5,d8 <delay_ms+0x68>
|
||||||
|
188: 00000013 nop
|
||||||
|
18c: 04c12403 lw s0,76(sp)
|
||||||
|
190: 05010113 addi sp,sp,80
|
||||||
|
194: 00008067 ret
|
||||||
|
|
||||||
|
00000198 <main>:
|
||||||
|
198: ff010113 addi sp,sp,-16
|
||||||
|
19c: 00112623 sw ra,12(sp)
|
||||||
|
1a0: 00812423 sw s0,8(sp)
|
||||||
|
1a4: 01010413 addi s0,sp,16
|
||||||
|
1a8: 400007b7 lui a5,0x40000
|
||||||
|
1ac: 00478793 addi a5,a5,4 # 40000004 <__global_pointer$+0x2ffff804>
|
||||||
|
1b0: 0007a703 lw a4,0(a5)
|
||||||
|
1b4: 400007b7 lui a5,0x40000
|
||||||
|
1b8: 00478793 addi a5,a5,4 # 40000004 <__global_pointer$+0x2ffff804>
|
||||||
|
1bc: 00174713 xori a4,a4,1
|
||||||
|
1c0: 00e7a023 sw a4,0(a5)
|
||||||
|
1c4: 1f400513 li a0,500
|
||||||
|
1c8: ea9ff0ef jal ra,70 <delay_ms>
|
||||||
|
1cc: fddff06f j 1a8 <main+0x10>
|
||||||
|
|
||||||
|
Disassembly of section .stack:
|
||||||
|
|
||||||
|
10000400 <_sp-0x400>:
|
||||||
|
...
|
||||||
|
|
||||||
|
Disassembly of section .comment:
|
||||||
|
|
||||||
|
00000000 <.comment>:
|
||||||
|
0: 3a434347 fmsub.d ft6,ft6,ft4,ft7,rmm
|
||||||
|
4: 2820 fld fs0,80(s0)
|
||||||
|
6: 20554e47 fmsub.s ft8,fa0,ft5,ft4,rmm
|
||||||
|
a: 434d li t1,19
|
||||||
|
c: 2055 jal b0 <delay_ms+0x40>
|
||||||
|
e: 6345 lui t1,0x11
|
||||||
|
10: 696c flw fa1,84(a0)
|
||||||
|
12: 7370 flw fa2,100(a4)
|
||||||
|
14: 2065 jal bc <delay_ms+0x4c>
|
||||||
|
16: 4952 lw s2,20(sp)
|
||||||
|
18: 562d4353 0x562d4353
|
||||||
|
1c: 4520 lw s0,72(a0)
|
||||||
|
1e: 626d lui tp,0x1b
|
||||||
|
20: 6465 lui s0,0x19
|
||||||
|
22: 6564 flw fs1,76(a0)
|
||||||
|
24: 2064 fld fs1,192(s0)
|
||||||
|
26: 2c434347 0x2c434347
|
||||||
|
2a: 3620 fld fs0,104(a2)
|
||||||
|
2c: 2d34 fld fa3,88(a0)
|
||||||
|
2e: 6962 flw fs2,24(sp)
|
||||||
|
30: 2974 fld fa3,208(a0)
|
||||||
|
32: 3820 fld fs0,112(s0)
|
||||||
|
34: 322e fld ft4,232(sp)
|
||||||
|
36: 302e fld ft0,232(sp)
|
||||||
|
...
|
|
@ -0,0 +1,147 @@
|
||||||
|
OUTPUT_ARCH( "riscv" )
|
||||||
|
ENTRY(_start)
|
||||||
|
|
||||||
|
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
flash (wxa!ri) : ORIGIN = 0x00000000, LENGTH = 4K
|
||||||
|
ram (wxa!ri) : ORIGIN = 0x10000000, LENGTH = 2K
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
__stack_size = DEFINED(__stack_size) ? __stack_size : 1K;
|
||||||
|
|
||||||
|
.init :
|
||||||
|
{
|
||||||
|
KEEP (*(SORT_NONE(.init)))
|
||||||
|
} >flash AT>flash
|
||||||
|
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
*(.text.unlikely .text.unlikely.*)
|
||||||
|
*(.text.startup .text.startup.*)
|
||||||
|
*(.text .text.*)
|
||||||
|
*(.gnu.linkonce.t.*)
|
||||||
|
} >flash AT>flash
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
|
||||||
|
PROVIDE (__etext = .);
|
||||||
|
PROVIDE (_etext = .);
|
||||||
|
PROVIDE (etext = .);
|
||||||
|
|
||||||
|
.preinit_array :
|
||||||
|
{
|
||||||
|
PROVIDE_HIDDEN (__preinit_array_start = .);
|
||||||
|
KEEP (*(.preinit_array))
|
||||||
|
PROVIDE_HIDDEN (__preinit_array_end = .);
|
||||||
|
} >flash AT>flash
|
||||||
|
|
||||||
|
.init_array :
|
||||||
|
{
|
||||||
|
PROVIDE_HIDDEN (__init_array_start = .);
|
||||||
|
KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
|
||||||
|
KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
|
||||||
|
PROVIDE_HIDDEN (__init_array_end = .);
|
||||||
|
} >flash AT>flash
|
||||||
|
|
||||||
|
.fini_array :
|
||||||
|
{
|
||||||
|
PROVIDE_HIDDEN (__fini_array_start = .);
|
||||||
|
KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
|
||||||
|
KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
|
||||||
|
PROVIDE_HIDDEN (__fini_array_end = .);
|
||||||
|
} >flash AT>flash
|
||||||
|
|
||||||
|
.ctors :
|
||||||
|
{
|
||||||
|
/* gcc uses crtbegin.o to find the start of
|
||||||
|
the constructors, so we make sure it is
|
||||||
|
first. Because this is a wildcard, it
|
||||||
|
doesn't matter if the user does not
|
||||||
|
actually link against crtbegin.o; the
|
||||||
|
linker won't look for a file to match a
|
||||||
|
wildcard. The wildcard also means that it
|
||||||
|
doesn't matter which directory crtbegin.o
|
||||||
|
is in. */
|
||||||
|
KEEP (*crtbegin.o(.ctors))
|
||||||
|
KEEP (*crtbegin?.o(.ctors))
|
||||||
|
/* We don't want to include the .ctor section from
|
||||||
|
the crtend.o file until after the sorted ctors.
|
||||||
|
The .ctor section from the crtend file contains the
|
||||||
|
end of ctors marker and it must be last */
|
||||||
|
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
|
||||||
|
KEEP (*(SORT(.ctors.*)))
|
||||||
|
KEEP (*(.ctors))
|
||||||
|
} >flash AT>flash
|
||||||
|
|
||||||
|
.dtors :
|
||||||
|
{
|
||||||
|
KEEP (*crtbegin.o(.dtors))
|
||||||
|
KEEP (*crtbegin?.o(.dtors))
|
||||||
|
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
|
||||||
|
KEEP (*(SORT(.dtors.*)))
|
||||||
|
KEEP (*(.dtors))
|
||||||
|
} >flash AT>flash
|
||||||
|
|
||||||
|
.lalign :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
PROVIDE( _data_lma = . );
|
||||||
|
} >flash AT>flash
|
||||||
|
|
||||||
|
.dalign :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
PROVIDE( _data = . );
|
||||||
|
} >ram AT>flash
|
||||||
|
|
||||||
|
.data :
|
||||||
|
{
|
||||||
|
*(.rdata)
|
||||||
|
*(.rodata .rodata.*)
|
||||||
|
*(.gnu.linkonce.r.*)
|
||||||
|
*(.data .data.*)
|
||||||
|
*(.gnu.linkonce.d.*)
|
||||||
|
. = ALIGN(8);
|
||||||
|
PROVIDE( __global_pointer$ = . + 0x800 );
|
||||||
|
*(.sdata .sdata.*)
|
||||||
|
*(.gnu.linkonce.s.*)
|
||||||
|
. = ALIGN(8);
|
||||||
|
*(.srodata.cst16)
|
||||||
|
*(.srodata.cst8)
|
||||||
|
*(.srodata.cst4)
|
||||||
|
*(.srodata.cst2)
|
||||||
|
*(.srodata .srodata.*)
|
||||||
|
} >ram AT>flash
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
PROVIDE( _edata = . );
|
||||||
|
PROVIDE( edata = . );
|
||||||
|
|
||||||
|
PROVIDE( _fbss = . );
|
||||||
|
PROVIDE( __bss_start = . );
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
*(.sbss*)
|
||||||
|
*(.gnu.linkonce.sb.*)
|
||||||
|
*(.bss .bss.*)
|
||||||
|
*(.gnu.linkonce.b.*)
|
||||||
|
*(COMMON)
|
||||||
|
. = ALIGN(4);
|
||||||
|
} >ram AT>ram
|
||||||
|
|
||||||
|
. = ALIGN(8);
|
||||||
|
PROVIDE( _end = . );
|
||||||
|
PROVIDE( end = . );
|
||||||
|
|
||||||
|
.stack ORIGIN(ram) + LENGTH(ram) - __stack_size :
|
||||||
|
{
|
||||||
|
PROVIDE( _heap_end = . );
|
||||||
|
. = __stack_size;
|
||||||
|
PROVIDE( _sp = . );
|
||||||
|
} >ram AT>ram
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
// GPIO regs
|
||||||
|
#define GPIO_BASE (0x40000000)
|
||||||
|
#define GPIO_DATA (GPIO_BASE + (0x04))
|
||||||
|
|
||||||
|
|
||||||
|
#define GPIO_REG(addr) (*((volatile uint32_t *)addr))
|
||||||
|
|
||||||
|
|
||||||
|
#define MS(ms) (ms * 50000)
|
||||||
|
|
||||||
|
|
||||||
|
#define read_csr(reg) ({ unsigned long __tmp; \
|
||||||
|
asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \
|
||||||
|
__tmp; })
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void delay_ms(uint32_t ms)
|
||||||
|
{
|
||||||
|
uint64_t tmp;
|
||||||
|
uint64_t cycle;
|
||||||
|
|
||||||
|
tmp = read_csr(cycle);
|
||||||
|
tmp += (uint64_t)(read_csr(cycleh)) << 32;
|
||||||
|
|
||||||
|
do {
|
||||||
|
cycle = read_csr(cycle);
|
||||||
|
cycle += (uint64_t)(read_csr(cycleh)) << 32;
|
||||||
|
} while (cycle < tmp + MS(ms));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
while (1) {
|
||||||
|
GPIO_REG(GPIO_DATA) ^= 0x1;
|
||||||
|
delay_ms(500);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
.section .init;
|
||||||
|
.globl _start;
|
||||||
|
.type _start,@function
|
||||||
|
|
||||||
|
|
||||||
|
_start:
|
||||||
|
j _reset_handler
|
||||||
|
|
||||||
|
_reset_handler:
|
||||||
|
.option push
|
||||||
|
.option norelax
|
||||||
|
la gp, __global_pointer$
|
||||||
|
.option pop
|
||||||
|
la sp, _sp
|
||||||
|
li x26, 0x00
|
||||||
|
li x27, 0x00
|
||||||
|
|
||||||
|
/* Load data section */
|
||||||
|
la a0, _data_lma
|
||||||
|
la a1, _data
|
||||||
|
la a2, _edata
|
||||||
|
bgeu a1, a2, 2f
|
||||||
|
1:
|
||||||
|
lw t0, (a0)
|
||||||
|
sw t0, (a1)
|
||||||
|
addi a0, a0, 4
|
||||||
|
addi a1, a1, 4
|
||||||
|
bltu a1, a2, 1b
|
||||||
|
2:
|
||||||
|
|
||||||
|
/* Clear bss section */
|
||||||
|
la a0, __bss_start
|
||||||
|
la a1, _end
|
||||||
|
bgeu a0, a1, 2f
|
||||||
|
1:
|
||||||
|
sw zero, (a0)
|
||||||
|
addi a0, a0, 4
|
||||||
|
bltu a0, a1, 1b
|
||||||
|
2:
|
||||||
|
|
||||||
|
call main
|
||||||
|
|
||||||
|
li x26, 0x01
|
||||||
|
|
||||||
|
loop:
|
||||||
|
j loop
|
Loading…
Reference in New Issue