|
View:
New views
3 Messages
—
Rating Filter:
Alert me
|
|
|
Context switching fails under LPC22xx/LPC21xxHi,
We successfully built an eCos library (hal and default templates) and HAL programs for an LPC2214 board and for an LPC2119 board. I used Sergei Gavrilov's code and both work fine when used in HAL-only mode without a scheduler. When we try to run twothreads.c, the program runs cyg_user_start but then resets the processor, which causes cyg_user_start to run again, and on on indefinitely. We believe that the problem is that the stack frame is not aligned on a 32-bit boundary. This seems to throw an exception that causes the HAL to reset. We tried to allocate the stack buffers in different ways to fix that, but it does not seem to help. Any idea what might be causing this and how to fix it? Thanks, Sivan Toledo and Aviad Zuc. |
|
|
Re: Context switching fails under LPC22xx/LPC21xxOn Thu, Feb 21, 2008 at 10:17:07AM -0800, Sivan Toledo wrote:
> > Hi, > > We successfully built an eCos library (hal and default templates) and > HAL programs for an LPC2214 board and for an LPC2119 board. I used > Sergei Gavrilov's code and both work fine when used in HAL-only mode > without a scheduler. > > When we try to run twothreads.c, the program runs cyg_user_start but > then resets the processor, which causes cyg_user_start to run again, > and on on indefinitely. > > We believe that the problem is that the stack frame is not aligned on > a 32-bit boundary. This seems to throw an exception that causes the > HAL to reset. We tried to allocate the stack buffers in different ways > to fix that, but it does not seem to help. > > Any idea what might be causing this and how to fix it? > > Thanks, Sivan Toledo and Aviad Zuc. I won't stop on LPC2214. The CPU has an external bus and I hope that you have enough external RAM to build RAM image and to resolve a problem using GDB and an eCos tracing. The LPC2119 hasn't external bus, so you try to manage the example using 16K on-chip RAM only, don't you? The `twothreads.c` is a bloat example which uses LIBC cats: main(), printf(). It seems for me that you did modify some things to reduce twotheads's appetite... Public CVS tree has mcb2100 target (board from Keil with LPC2119 CPU). I tried to build the twothreads example for the target chdir <some where> ecosconfig new mcb2100 ecosconfig tree make SRCS=$ECOS_REPOSITORY/../examples/twothreads.c DST=twothreads \ $ECOS_REPOSITORY/../examples/build_Makefile . make -f Makefile So far, so good. I got twothreads.o for LPC2119. make -f Makefile twothreads arm-elf/bin/ld: address 0x40006e08 of twothreads section .bss is not within region ram We have a deficit of RAM (> 8K) with the default settings. So, we have to 1) revise the default ecos settings; 2) revise twothread.c source (no printf(), no main()). rm -r * ecosconfig new mcb2100 ecosconfig remove CYGPKG_LIBC_STARTUP ;# free 8K ecosconfig tree make # remove bloat printf() and reduce the default twothread's stack sizes sed 's/printf/diag_printf/;s/4096/2048/' \ < $ECOS_REPOSITORY/../examples/twothreads.c > twothreads.c # build Makefile SRCS=twothreads.c DST=twothreads \ $ECOS_REPOSITORY/../examples/build_Makefile . # rude tweak (no main()) echo "ACTUAL_CFLAGS += -Dmain=cyg_user_start" >> Make.params make -f Makefile arm-elf-size twothreads text data bss dec hex filename 25268 828 11980 38076 94bc twothreads It's seems for me this should work. If it won't. Compare your own hal_platform_setup.h, mlt* stuff for LPC2129 with the MCB2100' one. ... if that still not working try to apply an attached patch and _rebuild_ _all_ from scratch: patch -p1 -d $ECOS_REPOSITORY < lpc2xxx_misc.c.patch I hope the twothreads example will be run even on your LPC2119 board. Sergei diff -ur A/hal/arm/lpc2xxx/var/current/src/lpc2xxx_misc.c B/hal/arm/lpc2xxx/var/current/src/lpc2xxx_misc.c --- A/hal/arm/lpc2xxx/var/current/src/lpc2xxx_misc.c +++ B/hal/arm/lpc2xxx/var/current/src/lpc2xxx_misc.c @@ -462,12 +462,18 @@ // if (level < 16) { + int i; cyg_uint32 addr_offset = level << 2; cyg_uint32 reg_val; - HAL_READ_UINT32(CYGARC_HAL_LPC2XXX_REG_VIC_BASE + - CYGARC_HAL_LPC2XXX_REG_VICVECTCNTL0 + - addr_offset, reg_val); + for (i = level; i < 16; i++) { + addr_offset = i << 2; + HAL_READ_UINT32(CYGARC_HAL_LPC2XXX_REG_VIC_BASE + + CYGARC_HAL_LPC2XXX_REG_VICVECTCNTL0 + + addr_offset, reg_val); + if ((reg_val == 0) || (reg_val == (vector | 0x20))) + break; + } CYG_ASSERT((reg_val == 0) || (reg_val == (vector | 0x20)), "Priority already used by another vector"); HAL_WRITE_UINT32(CYGARC_HAL_LPC2XXX_REG_VIC_BASE + -- Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss |
|
|
Re: Context switching fails under LPC22xx/LPC21xxOK, I found the problem. The code ran fine on the LPC2214 with the external memory enabled, but failed when I build the code to run with just 16KB of RAM on either the 2214 or the LPC2119. It turned out to be a problem in my linker script (.ldi) for the 2119; the data section started at 0x40000000, which is obviously wrong, since the fixed vectors are at 0x40000400, so the data overwrote the vectors. It was very helpful that you pointed out the mcb2100; this gave me a good .ldi script! Regards, Sivan |
| Free embeddable forum powered by Nabble | Forum Help |