This is the mail archive of the
ecos-discuss@sourceware.org
mailing list for the eCos project.
Re: small custom bootloader to start an app stored in flash
- From: Oleg Uzenkov <o dot uzenkov at unicore dot co dot ua>
- To: Edgar Grimberg <edgar dot grimberg at gmail dot com>, Rainer Arndt <arndt at ibehs dot de>
- Cc: eCos Discussion <ecos-discuss at sourceware dot org>
- Date: Thu, 23 Oct 2014 18:03:21 +0300
- Subject: Re: small custom bootloader to start an app stored in flash
- Authentication-results: sourceware.org; auth=none
- References: <544618E5 dot 90101 at unicore dot co dot ua> <CAPrjMDAi=cqTSQ-d-c9FF53W-c6=v0j8rzSLQfuTcBQUY43Zpw at mail dot gmail dot com> <54479031 dot 9080106 at unicore dot co dot ua> <CAPrjMDCiZ0Lkwfgv=dfw8fhjmZXjeLAdgHSiiK9o6RZXLM-G=g at mail dot gmail dot com> <5447C1D0 dot 3070906 at unicore dot co dot ua> <CAPrjMDBeetQ+sEYswv7dF=bcFuqpjpqOhtjfNBC+oMFuXzT_8A at mail dot gmail dot com> <CAPrjMDCdT9ddPowRvQmaKh396tYwt7yWLzKNQB+83Asi0f71jw at mail dot gmail dot com>
Hi again,
At last got some progress! :-)
The jump from the bootloader now works (but with one minor problem. plz
see below)
I found that the problem was caused by optimisation.
(and it was dumb of me not to pay attention to a warning: optimization
may eliminate reads and/or writes to register variables)
I should have not used -O option when I use a register variable.
Here is bootloader's code:
#define HAL_PLF_ARCH_GETRESETVECTOR(__reset,__vector) \
{ \
__reset = *((unsigned long*)(__vector+4)); \
register volatile CYG_ADDRESS __stack_ptr asm("sp");\
__stack_ptr = (*((unsigned long*)(__vector))); \
}
static volatile unsigned long exec;
int main (void) {
diag_printf( "JUMP\n" );
HAL_PLF_ARCH_GETRESETVECTOR(exec, 0x08020000);
((void (*)(void))exec)();
while (1);
return 0;
}
Here is app's code:
int main (void) {
diag_printf( "HELLO1\n" );
diag_printf( "HELLO2\n" );
while (1);
return 0;
}
But there is still some minor problem:
Please have a look at the terminal output:
JUMPC!â11=â
HELLO2
Notice that instead of "HELLO1" a garbage (C!â11=â) is printed out.
Where as the next HELLO2 is ok.
It is either something related to diag_print() that was not initialised
properly.
or may be something to do with thumb mode on Cortex-4?
here:
$ arm-none-eabi-nm -n app.elf | grep hal_reset_vsr
08020984 T hal_reset_vsr
where as exec is (08020984+1):
(gdb) next
28 ((void (*)(void))exec)();
(gdb) print/x exec
$3 = 0x8020985
any ideas?
Thank you very much for you help!!!
Oleg
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss