MSP430 RedHat Toolchain: minor issues

Chris Liechti <[email protected]>
Newsgroups gmane.comp.hardware.texas-instruments.msp430.gcc.user
Message-ID <[email protected]>
I'm updating a larger project to compile with the RH port of gcc for
MSP430 as well as previous mspgcc versions. I've noticed a few problems.

versions used from http://www.ti.com/tool/msp430-gcc-opensource:
- GCC_RH_20131206.zip
- msp430-130423-272-source.tar.bz2 (resp. the provided windows command
line binaries)

== 1)

iomacros.h includes the following 4 lines in the section that is parsed
by "as" and "cc"

#define const_sfrb(x,x_) const sfrb_(x,x_)
#define const_sfrw(x,x_) const sfrw_(x,x_)
#define const_sfra(x,x_) const sfra_(x,x_)
#define const_sfrl(x,x_) const sfrl_(x,x_)

it is an error for "as" when it sees the "const". solution: move these
line in between the #ifdef'd part where only the c compiler sees it and
add the following to the section for the assembler.

#define const_sfrb(x,x_) x=x_
#define const_sfrw(x,x_) x=x_
#define const_sfra(x,x_) x=x_
#define const_sfrl(x,x_) x=x_

== 2)

.noinit segment is not correctly flagged, it is needlessly downloaded to
the target and occupies flash for a series of zeros. objdump shows

...
  8 .rodata       000009dc  00002100  00002100  00000194  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  9 .text         0000acd2  00002adc  00002adc  00000b70  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 10 .data         0000035c  00001100  0000d7ae  0000b844  2**1
                  CONTENTS, ALLOC, LOAD, DATA
 11 .bss          00000808  0000145c  0000db0a  0000bba0  2**1
                  ALLOC
 12 .noinit       000002f1  00001c64  0000db0a  0000bba0  2**1
                  CONTENTS, ALLOC, LOAD, DATA
...

and objcopy seems to include the zeros from .noinit in the .a43 (intel hex).

== 3)

it looks like COMMON is included in the ".noinit" section, i thought it
belongs to the ".bss" section.

there are multiple "end" labels defined, one in ".bss" and one in ".noinit"

and unfortunately "_end" is placed in .bss instead of the very end of
RAM (behind .noinit) as it was in mspgcc.

(seen in the ld files for msp430f2410 and others)

== 4)

and probably not MSP430 specific, with -Os "static inline functions()"
are not inlined, i also tried adding __attribute__((always_inline)) but
it did not seem to have an effect in a quick test.

we are using such one-line functions for pin access. when not inlined
the call will probably increase the code size considerably with register
moving to prepare a call to one assembler line that does not even touch
a register...

we used to use -O2 only but the code is a little bit larger with GCC 4.x
so we added -Os ...

== 5)

it was probably a design decision to change the ABI and start with R12
instead of R15 for parameters. this leads to some work with assembler
modules interacting with c modules.

it would be nice if there where some defines available to detect the
ABI. i've passed a -D from the command line depending on which compiler
is used (old mspggc/ti gcc).


i'm also not getting any source, just assembler, with "objdump -dSt" of
the .elf file, which previously worked.

====

positively, after working around these issues (we use custom linker
scripts anyway as we reserve space for a bootlaoder, MSP430F2xx) it
compiles and runs :-)


thanks,
chris


------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today. 
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.