Peter,
Thank you for this workaround. Declaring the pointer volatile does the
job for me. I now get reasonably small binaries and sufficient
performance, so further tweaking is not needed for now.
I've created a ticket:
https://sourceforge.net/tracker/?func=detail&aid=3604235&group_id=42303&atid=432701
Martin
On 02/08/2013 04:01 PM, Peter Bigot wrote:
It's probably been forgotten, but there is an issue with large memory
model
because in this model the following is true:
sizeof(void*) != sizeof(ptrdiff_t)
See
https://sourceforge.net/apps/mediawiki/mspgcc/index.php?title=Gcc47:20-Bit_Design#mixedmode
GCC internally has a hard-coded assumption that those two values are
equal,
and it will frequently replace address operations with base-plus-index
operations, then convert them back. Such conversions are invalid when the
index has a smaller range than the address. Through grotesque hacks I
quashed many of those cases. I suspect this is another, though it could
also be an error in the machine description constraints (which theory is
supported because the code also fails under the huge model).
You can work around this by changing the declaration to the following:
uint8_t * volatile addr = (uint8_t *)0x18000L;
There are redundant stack accesses with this code, which you might be able
to get away with further trickiness.
It would be good if you'd file a ticket describing this problem. However,
it is unlikely to be worked by me any time soon.
Peter
On Fri, Feb 8, 2013 at 5:35 AM, Martin Zoller
<martin.zol...@tinynode.com <mailto:martin.zol...@tinynode.com>> wrote:
Hi,
I have an issue with the -Os optimization parameter in mspgcc
4.7.0 20120911.
The following code writes a byte to 0x18000 (in flash > 64 KB) on
an MSP430F5342:
#include <msp430f5342.h>
#include <stdint.h>
#include <string.h>
int main(){
uint8_t* addr=(uint8_t*)0x18000;
WDTCTL = WDTPW+WDTHOLD;
FCTL3 = FWKEY + LOCKA; // Clear LOCK and LOCKA
FCTL1 = FWKEY + ERASE; // Enable segment erase
*addr = 0; // Dummy write, erase the
selected segment
while(FCTL3 & BUSY); // Wait for erase to finish
FCTL1 = FWKEY + WRT; // Enable write
*addr = 0x88; // WRITE
while(FCTL3 & BUSY); // Wait for write to finish
FCTL1 = FWKEY; // Disable writes / erases
FCTL3 = FWKEY + LOCK + LOCKA; // Set LOCK and LOCKA
return 0;
}
It works fine when I compile it without -Os:
msp430-gcc -mmcu=msp430f5342 -mmemory-model=large test.c
But with -Os I get:
/tmp/ccANT1um.s: Assembler messages:
/tmp/ccANT1um.s:18: Error: value 98304 out of range for 16-bit
immediate
/tmp/ccANT1um.s:23: Error: value 98304 out of range for 16-bit
immediate
To identify the offending optimization parameter, I tried using
all the parameters that -Os is supposed to activate, as determined
with msp430-gcc -Os -Q --help=optimizers:
-falign-functions -falign-jumps -falign-labels -falign-loops
-fbranch-count-reg -fcaller-saves -fcombine-stack-adjustments
-fcommon -fcompare-elim -fcprop-registers -fcrossjumping
-fcse-follow-jumps -fdce -fdefer-pop -fdelete-null-pointer-checks
-fdevirtualize -fdse -fearly-inlining -fexpensive-optimizations
-fforward-propagate -fgcse -fgcse-lm -fguess-branch-probability
-fif-conversion -fif-conversion2 -finline-atomics
-finline-functions -finline-functions-called-once
-finline-small-functions -fipa-cp -fipa-profile -fipa-pure-const
-fipa-reference -fipa-sra -fivopts -fjump-tables -fmath-errno
-fmerge-constants -fmove-loop-invariants -fomit-frame-pointer
-foptimize-register-move -foptimize-sibling-calls -fpeephole
-fpeephole2 -freg-struct-return -fregmove -frename-registers
-freorder-blocks -freorder-functions -frerun-cse-after-loop
-fsched-critical-path-heuristic -fsched-dep-count-heuristic
-fsched-group-heuristic -fsched-interblock
-fsched-last-insn-heuristic -fsched-rank-heuristic -fsched-spec
-fsched-spec-insn-heuristic -fsched-stalled-insns-dep
-fshort-enums -fshrink-wrap -fsigned-zeros -fsplit-ivs-in-unroller
-fsplit-wide-types -fstrict-aliasing -fthread-jumps
-ftoplevel-reorder -ftrapping-math -ftree-bit-ccp
-ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-copy-prop
-ftree-copyrename -ftree-cselim -ftree-dce -ftree-dominator-opts
-ftree-dse -ftree-forwprop -ftree-fre -ftree-loop-if-convert
-ftree-loop-im -ftree-loop-ivcanon -ftree-loop-optimize
-ftree-phiprop -ftree-pre -ftree-pta -ftree-reassoc
-ftree-scev-cprop -ftree-sink -ftree-slp-vectorize -ftree-sra
-ftree-switch-conversion -ftree-tail-merge -ftree-ter
-ftree-vect-loop-version -ftree-vrp -funit-at-a-time -fweb
But with these parameters the code compiles.
Unfortunately the executables get much bigger with these
parameters than with -Os, so using them as a workaround is not an
option.
Any ideas on what might cause this problem?
Martin
--
Martin Zoller ? Tinynode <http://www.tinynode.com/> ? System
Architect ? Lausanne ? D: +41 21 510 11 81
<tel:%2B41%2021%20510%2011%2081> ? F: +41 21 510 11 71
<tel:%2B41%2021%20510%2011%2071> ? martin.zol...@tinynode.com
<mailto:martin.zol...@tinynode.com>
<mailto:martin.zol...@tinynode.com
<mailto:martin.zol...@tinynode.com>>
New postal address from 12/15/2012: Tinynode SA, Boulevard de
Grancy 19A, 1006 Lausanne
------------------------------------------------------------------------------
Free Next-Gen Firewall Hardware Offer
Buy your Sophos next-gen firewall before the end March 2013
and get the hardware for free! Learn more.
http://p.sf.net/sfu/sophos-d2d-feb
_______________________________________________
Mspgcc-users mailing list
Mspgcc-users@lists.sourceforge.net
<mailto:Mspgcc-users@lists.sourceforge.net>
https://lists.sourceforge.net/lists/listinfo/mspgcc-users
--
Martin Zoller ? Tinynode <http://www.tinynode.com/> ? System Architect ?
Lausanne ? D: +41 21 510 11 81 ? F: +41 21 510 11 71 ?
martin.zol...@tinynode.com <mailto:martin.zol...@tinynode.com>
New postal address from 12/15/2012: Tinynode SA, Boulevard de Grancy
19A, 1006 Lausanne
------------------------------------------------------------------------------
Free Next-Gen Firewall Hardware Offer
Buy your Sophos next-gen firewall before the end March 2013
and get the hardware for free! Learn more.
http://p.sf.net/sfu/sophos-d2d-feb
_______________________________________________
Mspgcc-users mailing list
Mspgcc-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mspgcc-users