stm: Clean up main.c; disable libgcc by default.

f2d and d2f functions from libgcc does not work correctly, most likely
due to the ABI being incorrect.  libgcc disabled for now.
This commit is contained in:
Damien George 2014-01-21 23:28:03 +00:00
parent d51cfd155c
commit 2c30256382
7 changed files with 25 additions and 224 deletions

View File

@ -36,7 +36,10 @@ CFLAGS += -Os -DNDEBUG
endif
LDFLAGS = --nostdlib -T stm32f405.ld
LIBS = $(shell $(CC) -print-libgcc-file-name)
LIBS =
# uncomment this if you want libgcc
#LIBS += $(shell $(CC) -print-libgcc-file-name)
SRC_C = \
main.c \
@ -58,10 +61,10 @@ SRC_C = \
timer.c \
audio.c \
sdio.c \
pybwlan.c \
i2c.c \
usrsw.c \
adc.c \
# pybwlan.c \
SRC_S = \
startup_stm32f40xx.s \
@ -133,7 +136,7 @@ SRC_CC3K = \
ccspi.c \
pybcc3k.c \
OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(SRC_S:.s=.o) $(SRC_FATFS:.c=.o) $(SRC_STM:.c=.o) $(SRC_CC3K:.c=.o))
OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(SRC_S:.s=.o) $(SRC_FATFS:.c=.o) $(SRC_STM:.c=.o)) # $(SRC_CC3K:.c=.o))
#OBJ += $(addprefix $(BUILD)/, $(SRC_STM_OTG:.c=.o))
all2: $(BUILD) $(BUILD)/flash.dfu

View File

@ -208,9 +208,11 @@ static const mp_obj_type_t led_obj_type = {
.methods = led_methods,
};
mp_obj_t pyb_Led(mp_obj_t led_id) {
static mp_obj_t pyb_Led(mp_obj_t led_id) {
pyb_led_obj_t *o = m_new_obj(pyb_led_obj_t);
o->base.type = &led_obj_type;
o->led_id = mp_obj_get_int(led_id);
return o;
}
MP_DEFINE_CONST_FUN_OBJ_1(pyb_Led_obj, pyb_Led);

View File

@ -1,8 +1,14 @@
typedef enum {
// PYBv3
PYB_LED_R1 = 1,
PYB_LED_R2 = 2,
PYB_LED_G1 = 3,
PYB_LED_G2 = 4,
// PYBv4
PYB_LED_RED = 1,
PYB_LED_GREEN = 2,
PYB_LED_YELLOW = 3,
PYB_LED_BLUE = 4,
//STM32F4DISC
PYB_LED_R = 1,
PYB_LED_G = 2,
@ -14,4 +20,4 @@ void led_init(void);
void led_state(pyb_led_t led, int state);
void led_toggle(pyb_led_t led);
mp_obj_t pyb_Led(mp_obj_t led_id);
MP_DECLARE_CONST_FUN_OBJ(pyb_Led_obj);

View File

@ -61,21 +61,6 @@ void flash_error(int n) {
led_state(PYB_LED_R2, 0);
}
static void impl02_c_version(void) {
int x = 0;
while (x < 400) {
int y = 0;
while (y < 400) {
volatile int z = 0;
while (z < 400) {
z = z + 1;
}
y = y + 1;
}
x = x + 1;
}
}
void __fatal_error(const char *msg) {
lcd_print_strn("\nFATAL ERROR:\n", 14);
lcd_print_strn(msg, strlen(msg));
@ -108,41 +93,6 @@ mp_obj_t pyb_delay(mp_obj_t count) {
return mp_const_none;
}
mp_obj_t pyb_led(mp_obj_t state) {
led_state(PYB_LED_G1, rt_is_true(state));
return state;
}
/*
void g(uint i) {
printf("g:%d\n", i);
if (i & 1) {
nlr_jump((void*)(42 + i));
}
}
void f(void) {
nlr_buf_t nlr;
int i;
for (i = 0; i < 4; i++) {
printf("f:loop:%d:%p\n", i, &nlr);
if (nlr_push(&nlr) == 0) {
// normal
//printf("a:%p:%p %p %p %u\n", &nlr, nlr.ip, nlr.sp, nlr.prev, nlr.ret_val);
g(i);
printf("f:lp:%d:nrm\n", i);
nlr_pop();
} else {
// nlr
//printf("b:%p:%p %p %p %u\n", &nlr, nlr.ip, nlr.sp, nlr.prev, nlr.ret_val);
printf("f:lp:%d:nlr:%d\n", i, (int)nlr.ret_val);
}
}
}
void nlr_test(void) {
f(1);
}
*/
void fatality(void) {
led_state(PYB_LED_R1, 1);
led_state(PYB_LED_G1, 1);
@ -180,6 +130,8 @@ static const char *help_text =
" pyb.switch() -- return True/False if switch pressed or not\n"
" pyb.accel() -- get accelerometer values\n"
" pyb.rand() -- get a 16-bit random number\n"
" pyb.gpio(<port>) -- get port value (port='a4' for example)\n"
" pyb.gpio(<port>, <val>) -- set port value, True or False, 1 or 0\n"
;
// get some help about available functions
@ -587,7 +539,7 @@ mp_obj_t pyb_hid_send_report(mp_obj_t arg) {
static void rtc_init(void) {
uint32_t rtc_clksrc;
uint32_t timeout =10000;
uint32_t timeout = 1000000;
/* Enable the PWR clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
@ -839,7 +791,6 @@ soft_reset:
rt_store_attr(m, MP_QSTR_sync, rt_make_function_n(0, pyb_sync));
rt_store_attr(m, MP_QSTR_gc, rt_make_function_n(0, pyb_gc));
rt_store_attr(m, MP_QSTR_delay, rt_make_function_n(1, pyb_delay));
rt_store_attr(m, MP_QSTR_led, rt_make_function_n(1, pyb_led));
rt_store_attr(m, MP_QSTR_switch, (mp_obj_t)&pyb_switch_obj);
rt_store_attr(m, MP_QSTR_servo, rt_make_function_n(2, pyb_servo_set));
rt_store_attr(m, MP_QSTR_pwm, rt_make_function_n(2, pyb_pwm_set));
@ -849,7 +800,7 @@ soft_reset:
rt_store_attr(m, MP_QSTR_hid, rt_make_function_n(1, pyb_hid_send_report));
rt_store_attr(m, MP_QSTR_time, rt_make_function_n(0, pyb_rtc_read));
rt_store_attr(m, MP_QSTR_rand, rt_make_function_n(0, pyb_rng_get));
rt_store_attr(m, MP_QSTR_Led, rt_make_function_n(1, pyb_Led));
rt_store_attr(m, MP_QSTR_Led, (mp_obj_t)&pyb_Led_obj);
rt_store_attr(m, MP_QSTR_Servo, rt_make_function_n(1, pyb_Servo));
rt_store_attr(m, MP_QSTR_I2C, rt_make_function_n(2, pyb_I2C));
rt_store_attr(m, MP_QSTR_gpio, (mp_obj_t)&pyb_gpio_obj);
@ -990,151 +941,6 @@ soft_reset:
vstr_free(vstr);
}
//printf("init;al=%u\n", m_get_total_bytes_allocated()); // 1600, due to qstr_init
//sys_tick_delay_ms(1000);
// Python!
if (0) {
//const char *pysrc = "def f():\n x=x+1\nprint(42)\n";
const char *pysrc =
// impl01.py
/*
"x = 0\n"
"while x < 400:\n"
" y = 0\n"
" while y < 400:\n"
" z = 0\n"
" while z < 400:\n"
" z = z + 1\n"
" y = y + 1\n"
" x = x + 1\n";
*/
// impl02.py
/*
"#@micropython.native\n"
"def f():\n"
" x = 0\n"
" while x < 400:\n"
" y = 0\n"
" while y < 400:\n"
" z = 0\n"
" while z < 400:\n"
" z = z + 1\n"
" y = y + 1\n"
" x = x + 1\n"
"f()\n";
*/
/*
"print('in python!')\n"
"x = 0\n"
"while x < 4:\n"
" pyb_led(True)\n"
" pyb_delay(201)\n"
" pyb_led(False)\n"
" pyb_delay(201)\n"
" x += 1\n"
"print('press me!')\n"
"while True:\n"
" pyb_led(pyb_sw())\n";
*/
/*
// impl16.py
"@micropython.asm_thumb\n"
"def delay(r0):\n"
" b(loop_entry)\n"
" label(loop1)\n"
" movw(r1, 55999)\n"
" label(loop2)\n"
" subs(r1, r1, 1)\n"
" cmp(r1, 0)\n"
" bgt(loop2)\n"
" subs(r0, r0, 1)\n"
" label(loop_entry)\n"
" cmp(r0, 0)\n"
" bgt(loop1)\n"
"print('in python!')\n"
"@micropython.native\n"
"def flash(n):\n"
" x = 0\n"
" while x < n:\n"
" pyb_led(True)\n"
" delay(249)\n"
" pyb_led(False)\n"
" delay(249)\n"
" x = x + 1\n"
"flash(20)\n";
*/
// impl18.py
/*
"# basic exceptions\n"
"x = 1\n"
"try:\n"
" x.a()\n"
"except:\n"
" print(x)\n";
*/
// impl19.py
"# for loop\n"
"def f():\n"
" for x in range(400):\n"
" for y in range(400):\n"
" for z in range(400):\n"
" pass\n"
"f()\n";
mp_lexer_t *lex = mp_lexer_new_from_str_len("<stdin>", pysrc, strlen(pysrc), 0);
// nalloc=1740;6340;6836 -> 140;4600;496 bytes for lexer, parser, compiler
printf("lex; al=%u\n", m_get_total_bytes_allocated());
sys_tick_delay_ms(1000);
qstr parse_exc_id;
const char *parse_exc_msg;
mp_parse_node_t pn = mp_parse(lex, MP_PARSE_FILE_INPUT, &parse_exc_id, &parse_exc_msg);
mp_lexer_free(lex);
if (pn != MP_PARSE_NODE_NULL) {
printf("pars;al=%u\n", m_get_total_bytes_allocated());
sys_tick_delay_ms(1000);
//parse_node_show(pn, 0);
mp_obj_t module_fun = mp_compile(pn, 0, false);
printf("comp;al=%u\n", m_get_total_bytes_allocated());
sys_tick_delay_ms(1000);
if (module_fun == mp_const_none) {
printf("compile error\n");
} else {
// execute it!
// flash once
led_state(PYB_LED_G1, 1);
sys_tick_delay_ms(100);
led_state(PYB_LED_G1, 0);
nlr_buf_t nlr;
if (nlr_push(&nlr) == 0) {
mp_obj_t ret = rt_call_function_0(module_fun);
printf("done! got: ");
mp_obj_print(ret, PRINT_REPR);
printf("\n");
nlr_pop();
} else {
// uncaught exception
printf("exception: ");
mp_obj_print((mp_obj_t)nlr.ret_val, PRINT_REPR);
printf("\n");
}
// flash once
led_state(PYB_LED_G1, 1);
sys_tick_delay_ms(100);
led_state(PYB_LED_G1, 0);
sys_tick_delay_ms(1000);
printf("nalloc=%u\n", m_get_total_bytes_allocated());
sys_tick_delay_ms(1000);
}
}
}
// HID example
if (0) {
uint8_t data[4];
@ -1170,23 +976,6 @@ soft_reset:
do_repl();
// benchmark C version of impl02.py
if (0) {
led_state(PYB_LED_G1, 1);
sys_tick_delay_ms(100);
led_state(PYB_LED_G1, 0);
impl02_c_version();
led_state(PYB_LED_G1, 1);
sys_tick_delay_ms(100);
led_state(PYB_LED_G1, 0);
}
// SD card testing
if (0) {
extern void sdio_init(void);
sdio_init();
}
printf("PYB: sync filesystems\n");
pyb_sync();
@ -1196,7 +985,8 @@ soft_reset:
goto soft_reset;
}
/* now supplied by libgcc library
// these 2 functions seem to actually work... no idea why
// replacing with libgcc does not work (probably due to wrong calling conventions)
double __aeabi_f2d(float x) {
// TODO
return 0.0;
@ -1206,7 +996,6 @@ float __aeabi_d2f(double x) {
// TODO
return 0.0;
}
*/
double sqrt(double x) {
// TODO

View File

@ -11,7 +11,6 @@ Q(main)
Q(sync)
Q(gc)
Q(delay)
Q(led)
Q(switch)
Q(servo)
Q(pwm)

View File

@ -11,7 +11,7 @@ void *memcpy(void *dest, const void *src, size_t n);
void *memmove(void *dest, const void *src, size_t n);
void *memset(void *s, int c, size_t n);
//int strlen(const char *str);
size_t strlen(const char *str);
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
char *strndup(const char *s, size_t n);

View File

@ -286,6 +286,7 @@ void EXTI15_10_IRQHandler(void) {
// work out if it's A14 that had the interrupt
if (EXTI_GetITStatus(EXTI_Line14) != RESET) {
led_toggle(PYB_LED_G2);
/* these are needed for CC3000 support
extern void SpiIntGPIOHandler(void);
extern uint32_t exti14_enabled;
extern uint32_t exti14_missed;
@ -296,6 +297,7 @@ void EXTI15_10_IRQHandler(void) {
} else {
exti14_missed = 1;
}
*/
EXTI_ClearITPendingBit(EXTI_Line14);
//printf("<- EXTI14 done\n");
}