1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-12-11 19:24:10 +01:00
Commit Graph

3 Commits

Author SHA1 Message Date
stac
918250868b irq_stack: correct one word overlap of _irq_stack_top
The previous fix in r652 was _almost_ right.  There was
still a one word (4-byte) overlap between _irq_stack_top
and the start of the data segment.

_irq_stack_end + _irq_stack_size leaves the '.' pointer at
the word immediatly after the stack.  This commit corrects
this error and places _irq_stack_top on the last word
_inside_ the reserved space for the irq stack.

[Before]
  $ ./tools/arm-2009q3/bin/arm-none-eabi-nm -n ./build/openpilot/OpenPilot.elf
  ...
  20000000 A SRAM_BASE
  20000000 B _irq_stack_end
  20000400 d LED_GPIO_PORT   <--- overlap
  20000400 B _irq_stack_top  <--- overlap
  20000400 D _sdata
  20000408 d ADC_GPIO_PORT
  ...

[After]
  $ ./tools/arm-2009q3/bin/arm-none-eabi-nm -n ./build/openpilot/OpenPilot.elf
  ...
  20000000 A SRAM_BASE
  20000000 B _irq_stack_end
  200003fc B _irq_stack_top
  20000400 d LED_GPIO_PORT
  20000400 D _sdata
  20000408 d ADC_GPIO_PORT
  ...

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@668 ebee16cc-31ac-478f-84a7-5cbb03baadba
2010-05-27 01:37:40 +00:00
stac
41da33c920 irq_stack: provide a proper IRQ stack for FreeRTOS
The MSP (IRQ stack) was trampling across the data segment.  This was
especially disastrous in the USB interrupts since they allocate and
fill buffers on the stack.

The root of this trampling was that no RAM was being reserved for the
MSP and a hard-coded value of (0x20000400) was used as the initial MSP
base address.  This resulted in the first 1K bytes of the .data segment
overlapping with the IRQ stack.  As can be expected, all sorts of badness
resulted when interrupts were firing and trampling over variables.

This change reserves the first _isr_stack_size bytes at the beginning of
RAM for the MSP.  If an ISR call chain runs off of the end of the MSP,
a Hard Fault will be generated as the (now invalid) sp is accessed.

There are two stack pointers in the Cortex-M3 CPU.  These are MSP (Main
Stack Pointer) and PSP (Process Stack Pointer).

Which stack is in use at any given time is determined by the following table:

   Mode      CONTROL[ASPSEL]    Stack
   ----      ---------------    -----
   Thread    0                  MSP
   Thread    1                  PSP
   Handler   x                  MSP

Out of reset, the CPU is in Thread mode using the MSP.  The initial value
of the MSP is automatically loaded from address 0 (lowest word in boot
region -- typically FLASH) immediately prior to jumping to the reset vector.

When running at interrupt level, the Cortex-M3 always uses the MSP and the
ASPSEL bit is forced to zero.

FreeRTOS allocates a separate stack for each task upon task creation.  These
task stacks are allocated from the heap.  FreeRTOS sets the active stack to
the PSP whenever running in a task context (both in privileged mode and user
mode).

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@652 ebee16cc-31ac-478f-84a7-5cbb03baadba
2010-05-24 16:33:26 +00:00
gussy
a0a92d5a59 OP-21: Made changes to OpenPilot makefile too allow building for bootloader and non-bootloader targets. Use "USE_BOOTLOADER = YES" to build for the OpenPilot Bootloader.
git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@300 ebee16cc-31ac-478f-84a7-5cbb03baadba
2010-03-13 20:01:31 +00:00