Compare commits
5 Commits
master
...
stack-debu
Author | SHA1 | Date | |
---|---|---|---|
a81c04e485 | |||
bb82d588fb | |||
bfaf3010e6 | |||
75ef884e4f | |||
b9479b95f0 |
11
Makefile
11
Makefile
|
@ -1,9 +1,9 @@
|
||||||
MCU = at90usb1287
|
MCU = atmega32u2
|
||||||
ARCH = AVR8
|
ARCH = AVR8
|
||||||
BOARD = USER
|
BOARD = MINIMUS
|
||||||
F_CPU = 8000000
|
F_CPU = 16000000
|
||||||
F_USB = 8000000
|
F_USB = 16000000
|
||||||
OPTIMIZATION = 3
|
OPTIMIZATION = s
|
||||||
TARGET = main
|
TARGET = main
|
||||||
LUFA_PATH = lufa/LUFA
|
LUFA_PATH = lufa/LUFA
|
||||||
CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -Iconfig/ -Wall
|
CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -Iconfig/ -Wall
|
||||||
|
@ -13,6 +13,7 @@ SRC = \
|
||||||
main.c \
|
main.c \
|
||||||
ftdi.c \
|
ftdi.c \
|
||||||
reset.c \
|
reset.c \
|
||||||
|
stack.c \
|
||||||
$(LUFA_SRC_USB)
|
$(LUFA_SRC_USB)
|
||||||
|
|
||||||
# Default target
|
# Default target
|
||||||
|
|
4
ftdi.h
4
ftdi.h
|
@ -9,11 +9,11 @@
|
||||||
|
|
||||||
/* FTDI device-to-host data IN endpoint */
|
/* FTDI device-to-host data IN endpoint */
|
||||||
#define FTDI_TX_EPADDR (ENDPOINT_DIR_IN | 1)
|
#define FTDI_TX_EPADDR (ENDPOINT_DIR_IN | 1)
|
||||||
#define FTDI_TX_QUEUE_LEN 256
|
#define FTDI_TX_QUEUE_LEN 32
|
||||||
|
|
||||||
/* Endpoint address of FTDI host-to-device data OUT endpoint */
|
/* Endpoint address of FTDI host-to-device data OUT endpoint */
|
||||||
#define FTDI_RX_EPADDR (ENDPOINT_DIR_OUT | 2)
|
#define FTDI_RX_EPADDR (ENDPOINT_DIR_OUT | 2)
|
||||||
#define FTDI_RX_QUEUE_LEN 256 /* Must be at least FTDI_TXRX_EPSIZE + 1 */
|
#define FTDI_RX_QUEUE_LEN 32 /* Must be at least FTDI_TXRX_EPSIZE + 1 */
|
||||||
|
|
||||||
/* Endpoint size */
|
/* Endpoint size */
|
||||||
#define FTDI_TXRX_EPSIZE 16 /* e.g. 16 or 64 */
|
#define FTDI_TXRX_EPSIZE 16 /* e.g. 16 or 64 */
|
||||||
|
|
6
main.c
6
main.c
|
@ -9,6 +9,7 @@
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
#include "ftdi.h"
|
#include "ftdi.h"
|
||||||
|
#include "stack.h"
|
||||||
|
|
||||||
static void setup(void)
|
static void setup(void)
|
||||||
{
|
{
|
||||||
|
@ -36,7 +37,10 @@ int main(void)
|
||||||
c = getchar();
|
c = getchar();
|
||||||
/* If FTDI_NONBLOCKING was provided to ftdi_init,
|
/* If FTDI_NONBLOCKING was provided to ftdi_init,
|
||||||
c will be -1 if no data was available. */
|
c will be -1 if no data was available. */
|
||||||
if (c >= 0)
|
if (c >= 0) {
|
||||||
printf("You sent %d (%c)\n", c, isprint(c) ? c : '?');
|
printf("You sent %d (%c)\n", c, isprint(c) ? c : '?');
|
||||||
|
printf("Maximum stack space used: %d / %d bytes\n",
|
||||||
|
(stack_total() - stack_min()), stack_total());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
46
stack.c
Normal file
46
stack.c
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
#include "stack.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
|
extern uint8_t _end;
|
||||||
|
extern uint8_t __stack;
|
||||||
|
|
||||||
|
void __stack_canary_init(void)
|
||||||
|
__attribute__ ((naked))
|
||||||
|
__attribute__ ((section (".init1")));
|
||||||
|
void __stack_canary_init(void)
|
||||||
|
{
|
||||||
|
__asm volatile (" ldi r30,lo8(_end)\n"
|
||||||
|
" ldi r31,hi8(_end)\n"
|
||||||
|
" ldi r24,lo8(0xaa)\n" // canary
|
||||||
|
" ldi r25,hi8(__stack)\n"
|
||||||
|
" rjmp 2f\n"
|
||||||
|
"1:\n"
|
||||||
|
" wdr\n"
|
||||||
|
" st Z+,r24\n"
|
||||||
|
"2:\n"
|
||||||
|
" cpi r30,lo8(__stack)\n"
|
||||||
|
" cpc r31,r25\n"
|
||||||
|
" brlo 1b\n"
|
||||||
|
" breq 1b"
|
||||||
|
:
|
||||||
|
:
|
||||||
|
: "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return low level mark of free stack space */
|
||||||
|
uint16_t stack_min(void)
|
||||||
|
{
|
||||||
|
const uint8_t *p;
|
||||||
|
uint16_t c = 0;
|
||||||
|
|
||||||
|
for (p = &_end; *p == 0xaa && p <= &__stack; p++)
|
||||||
|
c++;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return total amount of stack */
|
||||||
|
uint16_t stack_total(void)
|
||||||
|
{
|
||||||
|
return &__stack - &_end;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user