This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
Re: Hard faults using sprintf() and float
On 24/03/17 11:48, Jochen Strohbeck wrote:
> Not sure what must be aligned and how. Could you please be more precise
> ? Here is a part of my linker script taken from Atmel's FreeRTOS demo:
>
> /* .bss section which is used for uninitialized data */
> .bss (NOLOAD) :
> {
> . = ALIGN(4);
> _sbss = . ;
> _szero = .;
> *(.bss .bss.*)
> *(COMMON)
> . = ALIGN(4);
> _ebss = . ;
> _ezero = .;
> } > ram
>
> /* stack section */
> .stack (NOLOAD):
> {
> . = ALIGN(8);
> _sstack = .;
> . = . + STACK_SIZE;
> . = ALIGN(8);
> _estack = .;
> } > ram
>
> /* heap section */
> .heap (NOLOAD):
> {
> . = ALIGN(8);
> _sheap = .;
> . = . + HEAP_SIZE;
> . = ALIGN(8);
> _eheap = .;
> } > ram
>
> . = ALIGN(4);
> _end = . ;
> _ram_end_ = ORIGIN(ram) + LENGTH(ram) -1 ;
> }
>
> I guess that printf/sprintf allocates dynamic memory. I provided
> calloc_r(), alloc_r() etc in order to use the FreeRTOS memory allocation
> but this doesn't seem to help out here. Therefore I would like to know
> (a little) more about what must be provided in order to work newlib
> smoothly with (Free)RTOS. Probably the info I found in the net is outdated.
>
> BTW: Sometimes I get some weird formatted output as shown in the second
> line of these three examples:
>
> {"input":{"U":-1.955017e+01,"I":-4.877560e-04,"R":0.000000e+00},
> {"input":{"U":-1.955017e+01,"I":-4.00 e-04,"R":0.000000e+00},
>
> {"input":{"U":-1.956951e+01,"I":-4.856550e-04,"R":0.000000e+00},
> {"input":{"U":-1.956951e+01,"I":-4.8 672e-04,"R":0.000000e+00},
>
> {"input":{"U":-1.955017e+01,"I":-4.908266e-04,"R":0.000000e+00},
> {"input":{"U":-3.00 e+01,"I":-4.959982e-04,"R":0.000000e+00},
>
> Found this issue because the spaces between mantissa and exponent seem
> to break the json parser in the python lib. Could this be related to a
> probably memory misalignment or is this caused by something else ?
>
> Regards,
> Jochen
>
>
>
>> Looks like you have a problem with misaligned loads. Check your MPU
>> configuration.
>
>
Your stack needs to be 8-byte aligned at all function boundaries. The
compiler will maintain this invariant if start-up and interrupt code
handle the startup and interrupt entry code (most m-class cores will do
the latter automatically).
R.