Reduce stack usage of _vfiprintf_r()
Wed Oct 10 18:12:00 GMT 2012
W dniu 2012-10-10 18:25, Corinna Vinschen pisze:
>> In case of my code I
>> don't expect it to be ever called, because I don't use unbuffered
> Now I'm puzzled. If you're not using unbuffered IO, how come that
> you notice a difference, given that the code in question is only
> called for unbuffered IO?!?
From looking at the code you may come to conclusion that it does not
get called if your stream is buffered, but - as I wrote in my first
message - the __sbprintf() gets inlined (it's static and not used
anywhere else, it will always be inlined with optimization enabled) in
_vfiprintf_r(), thus the 1024 byte buffer on stack is allocated on EVERY
entry to to _vfiprintf_r() - no matter what the stream is.
With my change, the dynamic allocation is performed only when the
execution actually reaches the code path.
Another solution could be to make __sbprintf() not-static, so that it
would not be inlined.
I would never complain if the allocation would happen only for
unbuffered stream, but it doesn't...
> Keep in mind that we have to serve targets with size constraints as well
> as targets which go for speed. If you have a lot of output to an
> unbuffered stream like stderr, calling malloc may slow down output
You can't expect unbuffered I/O to be fast... If I'm concerned it can be
as slow as 1bps if it does not allocate 1kB on stack (; On Cortex-M3
dynamic allocation takes about few-hundred cycles, so I guess that it's
not a significant problem. By "overhead" I actually meant that
allocation of 1024 bytes with malloc() can take up more memory, I was
not refering to speed, as that's not the problem here.
Bottom line: newlib _IS_ too big for ARM microcontrollers, that's why
most people from the embedded world don't use anything more than math
library. That's why commercial IDE/toolchains using GCC for such devices
have their own - smaller - version of libc, not newlib (just to name
CrossWorks and CodeRed). That's why AVR microcontrollers have their own
avr-libc, which would probably better suit ARM microcontrollers if it
was not targeted especially at AVR architecture.
More information about the Newlib