Page 1 of 1

Hard Fault in _port_switch on LPC1347

Posted: Sun Jun 12, 2016 2:57 pm
by Dzarda
I realize this is an unsupported platform.
Hello :)

Background Info:

I'm currently playing with ChibiOS/RT 3.1.2 on the LPCXpresso 1347 board.

I added support for the LPC1347 MCU according to the project standards. The relevant files added to the OS can be found here
chibios_lpc1347.zip
lpc1347.h, LPC1347.ld, cmparams.h
(4.63 KiB) Downloaded 1112 times


Problem:

Upon executing the last instruction in the assembly routine _port_switch, the core ends up in a HardFault_Handler as the SP gets loaded with zeros.

Code: Select all

          _port_switch:
00000190:   stmdb   sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr}
00000194:   str.w   sp, [r1, #12]
00000198:   ldr     r3, [r0, #12] ;<<< *(R0+12) contains 0x00000000
0000019a:   mov     sp, r3 ;<<< SP is set to 0, beginning of the end
0000019c:   ldmia.w sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} ;<<< Hard Fault


Here's the stack trace that leads to this _port_switch call:
(There are _port_switch calls before this one that don't fail - e.g. from chThdCreateStatic)

Code: Select all

   _port_switch() at 0x19a   
   chSchGoSleepS() at chschd.c:269 0xa90   
   chSchGoSleepTimeoutS() at chschd.c:338 0xb52   
   chThdSleepS() at chthreads.h:268 0xdfa   
   chThdSleep() at chthreads.c:314 0xfb0   
   Thread1() at main.c:9 0x13a4   
   _port_thread_start() at 0x1b2   


Here's main:
[spoil]

Code: Select all

#include "ch.h"

static THD_WORKING_AREA(waThread1, 128);
static THD_FUNCTION(Thread1, arg) {
  (void)arg;
  chRegSetThreadName("blinker");
  while (true) {
    chThdSleepMilliseconds(500);
  }
}

int main(void) {
  chSysInit();
  chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL);
  while (true) {
    chThdSleepMilliseconds(500);
  }
}
[/spoil]

Here's the Makefile:
[spoil]

Code: Select all

##############################################################################
# Build global options
# NOTE: Can be overridden externally.
#

# Compiler options here.
ifeq ($(USE_OPT),)
  USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16
endif

# C specific options here (added to USE_OPT).
ifeq ($(USE_COPT),)
  USE_COPT = #-std=c11
endif

# C++ specific options here (added to USE_OPT).
ifeq ($(USE_CPPOPT),)
  USE_CPPOPT = -fno-rtti -fno-exceptions
endif

# Enable this if you want the linker to remove unused code and data
ifeq ($(USE_LINK_GC),)
  USE_LINK_GC = yes
endif

# Linker extra options here.
ifeq ($(USE_LDOPT),)
  USE_LDOPT = "-l:liblpc_chip_13xx.a"
endif

# Enable this if you want link time optimizations (LTO)
ifeq ($(USE_LTO),)
  USE_LTO = no
endif

# If enabled, this option allows to compile the application in THUMB mode.
ifeq ($(USE_THUMB),)
  USE_THUMB = yes
endif

# Enable this if you want to see the full log while compiling.
ifeq ($(USE_VERBOSE_COMPILE),)
  USE_VERBOSE_COMPILE = yes
endif

# If enabled, this option makes the build process faster by not compiling
# modules not used in the current configuration.
ifeq ($(USE_SMART_BUILD),)
  USE_SMART_BUILD = yes
endif

#
# Build global options
##############################################################################

##############################################################################
# Architecture or project specific options
#

# Stack size to be allocated to the Cortex-M process stack. This stack is
# the stack used by the main() thread.
ifeq ($(USE_PROCESS_STACKSIZE),)
  USE_PROCESS_STACKSIZE = 0x400
endif

# Stack size to the allocated to the Cortex-M main/exceptions stack. This
# stack is used for processing interrupts and exceptions.
ifeq ($(USE_EXCEPTIONS_STACKSIZE),)
  USE_EXCEPTIONS_STACKSIZE = 0x400
endif

# Enables the use of FPU on Cortex-M4 (no, softfp, hard).
ifeq ($(USE_FPU),)
  USE_FPU = no
endif

#
# Architecture or project specific options
##############################################################################

##############################################################################
# Project, sources and paths
#

# Define project name here
PROJECT = Lateral

# Imported source files and paths
CHIBIOS = /home/dzarda/Sync/chibios
# Startup files.
include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/startup_lpc1347.mk
# HAL-OSAL files (optional).
include $(CHIBIOS)/os/hal/hal.mk
include $(CHIBIOS)/os/hal/ports/LPC/LPC134x/platform.mk
include $(CHIBIOS)/os/hal/osal/rt/osal.mk
include $(shell pwd)/board/board.mk
# RTOS files (optional).
include $(CHIBIOS)/os/rt/rt.mk
include $(CHIBIOS)/os/rt/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
# Other files (optional).
include $(CHIBIOS)/test/rt/test.mk


# Define linker script file here
LDSCRIPT= $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/ld/LPC1347.ld

# C sources that can be compiled in ARM or THUMB mode depending on the global
# setting.
CSRC = sys/handlers.c \
       $(STARTUPSRC) \
       $(KERNSRC) \
       $(PORTSRC) \
       $(OSALSRC) \
       $(HALSRC) \
       $(PLATFORMSRC) \
       $(BOARDSRC) \
       $(TESTSRC) \
       main.c
       

# C++ sources that can be compiled in ARM or THUMB mode depending on the global
# setting.
CPPSRC =

# C sources to be compiled in ARM mode regardless of the global setting.
# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
#       option that results in lower performance and larger code size.
ACSRC =

# C++ sources to be compiled in ARM mode regardless of the global setting.
# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
#       option that results in lower performance and larger code size.
ACPPSRC =

# C sources to be compiled in THUMB mode regardless of the global setting.
# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
#       option that results in lower performance and larger code size.
TCSRC =

# C sources to be compiled in THUMB mode regardless of the global setting.
# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
#       option that results in lower performance and larger code size.
TCPPSRC =

# List ASM source files here
ASMSRC = $(STARTUPASM) $(PORTASM) $(OSALASM)

INCDIR = $(STARTUPINC) $(KERNINC) $(PORTINC) $(OSALINC) \
         $(HALINC) $(PLATFORMINC) $(BOARDINC) $(TESTINC) \
         $(CHIBIOS)/os/various \
         sys

#
# Project, sources and paths
##############################################################################

##############################################################################
# Compiler settings
#

MCU  = cortex-m3

#TRGT = arm-elf-
TRGT = arm-none-eabi-
CC   = $(TRGT)gcc
CPPC = $(TRGT)g++
# Enable loading with g++ only if you need C++ runtime support.
# NOTE: You can use C++ even without C++ support if you are careful. C++
#       runtime support makes code size explode.
LD   = $(TRGT)gcc
#LD   = $(TRGT)g++
CP   = $(TRGT)objcopy
AS   = $(TRGT)gcc -x assembler-with-cpp
AR   = $(TRGT)ar
OD   = $(TRGT)objdump
SZ   = $(TRGT)size
HEX  = $(CP) -O ihex
BIN  = $(CP) -O binary

# ARM-specific options here
AOPT =

# THUMB-specific options here
TOPT = -mthumb -DTHUMB

# Define C warning options here
CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes

# Define C++ warning options here
CPPWARN = -Wall -Wextra -Wundef

#
# Compiler settings
##############################################################################

##############################################################################
# Start of user section
#

# List all user C define here, like -D_DEBUG=1
UDEFS = -DLPC1347

# Define ASM defines here
UADEFS =

# List all user directories here
UINCDIR =

# List the user directory to look for the libraries here
ULIBDIR =

# List all user libraries here
ULIBS =

#
# End of user defines
##############################################################################

RULESPATH = $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC
include $(RULESPATH)/rules.mk

##############################################################################
# MISRA check rule, requires PCLint and the setup files, not provided.
#
misra:
   @lint-nt -v -w3 $(DEFS) pclint/co-gcc.lnt pclint/au-misra3.lnt pclint/waivers.lnt $(IINCDIR) $(CSRC) &> misra.txt
[/spoil]

I'd be happy for any pointers to what am I doing wrong.

Re: Hard Fault in _port_switch on LPC1347

Posted: Sun Jun 12, 2016 5:32 pm
by Giovanni
Hi,

Check for common errors, stack overflows for example, LPC devices should work without problems.

Giovanni

Re: Hard Fault in _port_switch on LPC1347

Posted: Tue Nov 01, 2016 10:13 pm
by Dzarda
I tried to add support for the LPC device to the current trunk's RT and the problem seems to have disappeared.

Re: Hard Fault in _port_switch on LPC1347

Posted: Tue Nov 01, 2016 10:21 pm
by Giovanni
Hi,

Good to know :)

Giovanni

Re: Hard Fault in _port_switch on LPC1347

Posted: Tue Jan 10, 2017 11:51 pm
by astoneb
Hello everybody,

i have currently exactly the same problem with the stm32f4discovery.
Are there may be a few details on the problem and how to solve it?

I am new to chibios and not quite so experienced with the system ...

Re: Hard Fault in _port_switch on LPC1347

Posted: Wed Jan 11, 2017 8:46 am
by Giovanni
Hi,

Please post questions related to STM32 in the STM32 forum. All the F4 demos work as intended and you don't give any detail about your setup, please have a look to this article:

http://chibios.org/dokuwiki/doku.php?id ... ebug_guide

Giovanni