Commit 6aa6e84c authored by 서윤희's avatar 서윤희

final_practice

parent bf39a128
CROSS_COMPILE ?= arm-none-eabi-
CC := $(CROSS_COMPILE)gcc
CFLAGS = -fno-common -O0 -std=gnu99 \
-mcpu=cortex-m3 -mthumb \
-T countdown.ld -nostartfiles -g \
TARGET = countdown.bin
all: $(TARGET)
$(TARGET): countdown.c startup.c
$(CC) $(CFLAGS) $^ -o countdown.elf
$(CROSS_COMPILE)objcopy -Obinary countdown.elf countdown.bin
$(CROSS_COMPILE)objdump -S countdown.elf > countdown.list
qemu: $(TARGET)
@qemu-system-arm -M ? | grep lm3s811evb >/dev/null || exit
@echo "Press Ctrl-A and then X to exit QEMU"
@echo
qemu-system-arm -M lm3s811evb -semihosting -nographic -kernel countdown.bin
gdb: $(TARGET)
@qemu-system-arm -M ? | grep lm3s811evb >/dev/null || exit
@echo "Press Ctrl-A and then X to exit QEMU"
@echo
qemu-system-arm -M lm3s811evb -s -S -semihosting -nographic -kernel countdown.bin
clean:
rm -f *.o *.bin *.elf *.list
#include <stdint.h>
#include "reg.h"
static int semihost_call(int service, void *opaque){
register int r0 asm("r0") = service;
register void *r1 asm("r1") = opaque;
register int result asm("r0");
asm volatile("bkpt 0xab"
: "=r" (result) : "r" (r0), "r" (r1));
return result;
}
enum SEMIHOST_SVC {
SYS_WRITE = 0x05,
};
void main(void){
/* SysTick configuration */
*SYSTICK_LOAD = 5000000;
*SYSTICK_VAL = 0;
*SYSTICK_CTRL = 0x07;
while(1);
}
int systick_handler(void){
char seconds[] = {'5','4','3','2','1','0'};
static int counts = 5;
uint32_t param[] = {1, (uint32_t)&seconds[counts], 1};
semihost_call(SYS_WRITE, (void*) param);
counts = counts < 0 ? 5 : counts - 1;
}
ENTRY(reset_handler)
MEMORY{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 8K
}
SECTIONS
{
.text : {
KEEP(*(.isr_vector))
*(.text)
*(.text.*)
*(.rodata)
_sidata = .;
} >FLASH
.data : AT(_sidata){
_sdata = .;
*(.data)
*(.data*)
_edata = .;
} >RAM
.bss : {
_sbss = .;
*(.bss)
_ebss = .;
} >RAM
_estack = ORIGIN(RAM) + LENGTH(RAM);
}
countdown.elf: file format elf32-littlearm
Disassembly of section .text:
00000000 <isr_vectors>:
0: 00 20 00 20 e1 00 00 00 49 01 00 00 49 01 00 00 . . ....I...I...
10: 49 01 00 00 49 01 00 00 49 01 00 00 00 00 00 00 I...I...I.......
...
2c: 49 01 00 00 00 00 00 00 00 00 00 00 49 01 00 00 I...........I...
3c: 85 00 00 00 ....
00000040 <semihost_call>:
#include <stdint.h>
#include "reg.h"
static int semihost_call(int service, void *opaque){
40: b480 push {r7}
42: b083 sub sp, #12
44: af00 add r7, sp, #0
46: 6078 str r0, [r7, #4]
48: 6039 str r1, [r7, #0]
register int r0 asm("r0") = service;
4a: 6878 ldr r0, [r7, #4]
register void *r1 asm("r1") = opaque;
4c: 6839 ldr r1, [r7, #0]
register int result asm("r0");
asm volatile("bkpt 0xab"
4e: beab bkpt 0x00ab
: "=r" (result) : "r" (r0), "r" (r1));
return result;
50: 4603 mov r3, r0
}
52: 4618 mov r0, r3
54: 370c adds r7, #12
56: 46bd mov sp, r7
58: bc80 pop {r7}
5a: 4770 bx lr
0000005c <main>:
enum SEMIHOST_SVC {
SYS_WRITE = 0x05,
};
void main(void){
5c: b480 push {r7}
5e: af00 add r7, sp, #0
/* SysTick configuration */
*SYSTICK_LOAD = 5000000;
60: 4b04 ldr r3, [pc, #16] ; (74 <main+0x18>)
62: 4a05 ldr r2, [pc, #20] ; (78 <main+0x1c>)
64: 601a str r2, [r3, #0]
*SYSTICK_VAL = 0;
66: 4b05 ldr r3, [pc, #20] ; (7c <main+0x20>)
68: 2200 movs r2, #0
6a: 601a str r2, [r3, #0]
*SYSTICK_CTRL = 0x07;
6c: 4b04 ldr r3, [pc, #16] ; (80 <main+0x24>)
6e: 2207 movs r2, #7
70: 601a str r2, [r3, #0]
while(1);
72: e7fe b.n 72 <main+0x16>
74: e000e014 .word 0xe000e014
78: 004c4b40 .word 0x004c4b40
7c: e000e018 .word 0xe000e018
80: e000e010 .word 0xe000e010
00000084 <systick_handler>:
}
int systick_handler(void){
84: b580 push {r7, lr}
86: b086 sub sp, #24
88: af00 add r7, sp, #0
char seconds[] = {'5','4','3','2','1','0'};
8a: 4a13 ldr r2, [pc, #76] ; (d8 <systick_handler+0x54>)
8c: f107 0310 add.w r3, r7, #16
90: e892 0003 ldmia.w r2, {r0, r1}
94: 6018 str r0, [r3, #0]
96: 3304 adds r3, #4
98: 8019 strh r1, [r3, #0]
static int counts = 5;
uint32_t param[] = {1, (uint32_t)&seconds[counts], 1};
9a: 2301 movs r3, #1
9c: 607b str r3, [r7, #4]
9e: 4b0f ldr r3, [pc, #60] ; (dc <systick_handler+0x58>)
a0: 681b ldr r3, [r3, #0]
a2: f107 0210 add.w r2, r7, #16
a6: 4413 add r3, r2
a8: 60bb str r3, [r7, #8]
aa: 2301 movs r3, #1
ac: 60fb str r3, [r7, #12]
semihost_call(SYS_WRITE, (void*) param);
ae: 1d3b adds r3, r7, #4
b0: 4619 mov r1, r3
b2: 2005 movs r0, #5
b4: f7ff ffc4 bl 40 <semihost_call>
counts = counts < 0 ? 5 : counts - 1;
b8: 4b08 ldr r3, [pc, #32] ; (dc <systick_handler+0x58>)
ba: 681b ldr r3, [r3, #0]
bc: 2b00 cmp r3, #0
be: db03 blt.n c8 <systick_handler+0x44>
c0: 4b06 ldr r3, [pc, #24] ; (dc <systick_handler+0x58>)
c2: 681b ldr r3, [r3, #0]
c4: 3b01 subs r3, #1
c6: e000 b.n ca <systick_handler+0x46>
c8: 2305 movs r3, #5
ca: 4a04 ldr r2, [pc, #16] ; (dc <systick_handler+0x58>)
cc: 6013 str r3, [r2, #0]
}
ce: bf00 nop
d0: 4618 mov r0, r3
d2: 3718 adds r7, #24
d4: 46bd mov sp, r7
d6: bd80 pop {r7, pc}
d8: 00000150 .word 0x00000150
dc: 20000000 .word 0x20000000
000000e0 <reset_handler>:
extern uint32_t _sbss;
extern uint32_t _ebss;
extern void main(void);
void reset_handler(void)
{
e0: b580 push {r7, lr}
e2: b086 sub sp, #24
e4: af00 add r7, sp, #0
/* Copy the data segment initializers from flash to SRAM */
uint32_t *idata_begin = &_sidata;
e6: 4b13 ldr r3, [pc, #76] ; (134 <reset_handler+0x54>)
e8: 617b str r3, [r7, #20]
uint32_t *data_begin = &_sdata;
ea: 4b13 ldr r3, [pc, #76] ; (138 <reset_handler+0x58>)
ec: 613b str r3, [r7, #16]
uint32_t *data_end = &_edata;
ee: 4b13 ldr r3, [pc, #76] ; (13c <reset_handler+0x5c>)
f0: 60bb str r3, [r7, #8]
while(data_begin < data_end) *data_begin++ = *idata_begin++;
f2: e007 b.n 104 <reset_handler+0x24>
f4: 693b ldr r3, [r7, #16]
f6: 1d1a adds r2, r3, #4
f8: 613a str r2, [r7, #16]
fa: 697a ldr r2, [r7, #20]
fc: 1d11 adds r1, r2, #4
fe: 6179 str r1, [r7, #20]
100: 6812 ldr r2, [r2, #0]
102: 601a str r2, [r3, #0]
104: 693a ldr r2, [r7, #16]
106: 68bb ldr r3, [r7, #8]
108: 429a cmp r2, r3
10a: d3f3 bcc.n f4 <reset_handler+0x14>
/* Zero fill the bss segment */
uint32_t *bss_begin = &_sbss;
10c: 4b0c ldr r3, [pc, #48] ; (140 <reset_handler+0x60>)
10e: 60fb str r3, [r7, #12]
uint32_t *bss_end = &_ebss;
110: 4b0c ldr r3, [pc, #48] ; (144 <reset_handler+0x64>)
112: 607b str r3, [r7, #4]
while(bss_begin < bss_end) *bss_begin++ = 0;
114: e004 b.n 120 <reset_handler+0x40>
116: 68fb ldr r3, [r7, #12]
118: 1d1a adds r2, r3, #4
11a: 60fa str r2, [r7, #12]
11c: 2200 movs r2, #0
11e: 601a str r2, [r3, #0]
120: 68fa ldr r2, [r7, #12]
122: 687b ldr r3, [r7, #4]
124: 429a cmp r2, r3
126: d3f6 bcc.n 116 <reset_handler+0x36>
/* jump to C entry point */
main();
128: f7ff ff98 bl 5c <main>
}
12c: bf00 nop
12e: 3718 adds r7, #24
130: 46bd mov sp, r7
132: bd80 pop {r7, pc}
134: 00000156 .word 0x00000156
138: 20000000 .word 0x20000000
13c: 20000004 .word 0x20000004
140: 20000004 .word 0x20000004
144: 20000004 .word 0x20000004
00000148 <default_handler>:
void default_handler(void){
148: b480 push {r7}
14a: af00 add r7, sp, #0
while(1);
14c: e7fe b.n 14c <default_handler+0x4>
14e: bf00 nop
150: 32333435 .word 0x32333435
154: 3031 .short 0x3031
#ifndef __REG_H__
#define __REG_H__
#define __REG_TYPE volatile uint32_t
#define __REG __REG_TYPE *
/* SysTick Memory Map */
#define SYSTICK ((__REG_TYPE) 0xE000E010)
#define SYSTICK_CTRL ((__REG) (SYSTICK + 0x00))
#define SYSTICK_LOAD ((__REG) (SYSTICK + 0x04))
#define SYSTICK_VAL ((__REG) (SYSTICK + 0x08))
#endif
#include <stdint.h>
static int semihost_call(int service, void* opaque)
{
register int r0 asm("r0") = service;
register void *r1 asm("r1") = opaque;
register int result asm("r0");
asm volatile("bkpt 0xab" : "=r" (result) : "r" (r0), "r" (r1));
return result;
}
enum SEMIHOST_SVC{
SYS_WRITE = 0x05,
};
char g_message[] = "Hello World!\n";
uint32_t g_param[3];
void main(void)
{
g_param[0] = 1;
g_param[1] = g_message;
g_param[2] = sizeof(g_message);
//char message[] = "Hello World!\n";
//uint32_t param[] = {1, (uint32_t)g_message, sizeof(g_message)};
semihost_call(SYS_WRITE, (void*)g_param);
while(1);
}
ENTRY(reset_handler)
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 8k
}
SECTIONS
{
.text :
{
KEEP(*(.isr_vector))
*(.text)
*(.text.*)
*(.rodata)
_sidata = .;
} >FLASH
.data : AT(_sidata){
_sdata = .;
*(.data)
*(.data*)
_edata = .;
} >RAM
.bss : {
_sbss = .;
*(.bss)
_ebss = .;
} >RAM
_estack = ORIGIN(RAM) + LENGTH(RAM);
}
#include <stdint.h>
extern uint32_t _estack;
extern uint32_t _sidata;
extern uint32_t _sdata;
extern uint32_t _edata;
extern uint32_t _sbss;
extern uint32_t _ebss;
extern void main(void);
void reset_handler(void)
{
/* Copy the data segment initializers from flash to SRAM */
uint32_t *idata_begin = &_sidata;
uint32_t *data_begin = &_sdata;
uint32_t *data_end = &_edata;
while(data_begin < data_end) *data_begin++ = *idata_begin++;
/* Zero fill the bss segment */
uint32_t *bss_begin = &_sbss;
uint32_t *bss_end = &_ebss;
while(bss_begin < bss_end) *bss_begin++ = 0;
/* jump to C entry point */
main();
}
void default_handler(void){
while(1);
}
void nmi_handler(void) __attribute((weak,alias("default_handler")));
void hardfault_handler(void) __attribute((weak,alias("default_handler")));
void memmanage_handler(void) __attribute((weak,alias("default_handler")));
void busfault_handler(void) __attribute((weak,alias("default_handler")));
void usagefault_handler(void) __attribute((weak,alias("default_handler")));
void svc_handler(void) __attribute((weak,alias("default_handler")));
void pendsv_handler(void) __attribute((weak,alias("default_handler")));
void systick_handler(void) __attribute((weak,alias("default_handler")));
__attribute((section(".isr_vector")))
uint32_t *isr_vectors[] = {
(uint32_t*) &_estack,
(uint32_t*) reset_handler, /* code entry point */
(uint32_t*) nmi_handler, /* NMI handler */
(uint32_t*) hardfault_handler, /* hard fault handler */
(uint32_t*) memmanage_handler, /* mem manage handler */
(uint32_t*) busfault_handler, /* bus fault handler */
(uint32_t*) usagefault_handler, /* usage fault handler */
0,
0,
0,
0,
(uint32_t*) svc_handler, /* svc handler */
0,
0,
(uint32_t*) pendsv_handler, /* pendsv handler */
(uint32_t*) systick_handler, /* systick handler */
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment