ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
459179
fk0, легенда (01.11.2013 19:42 - 20:04, просмотров: 6689)
XC16 -- глюкодром. Насоветовали. Показываю:  typedef struct { fifo_ptr_t data; volatile fifo_ptr_t rd; volatile fifo_ptr_t wr; size_t size; } fifo_t; ; аргумент в WREG0, не в стеке void fifo_flush(fifo_t *fifo) { char __cpu_ipl__; assert(fifo!=NULL); assert(fifo->data!=NULL); assert(fifo->size>1); SET_AND_SAVE_CPU_IPL(__cpu_ipl__, 7); fifo->rd=fifo->data; fifo->wr=fifo->data; RESTORE_CPU_IPL(__cpu_ipl__); } ; все аргументы в регистрах void fifo_init(fifo_t *fifo, void *data, size_t size) { assert(fifo!=NULL); assert(data!=NULL); assert(size>1); fifo->data=data; fifo->size=size; fifo_flush(fifo); } Генерируется код (подсмотренный де-факто в mblab-x и соответствующий выводу xc16-objdump -dS, а также соответствующий выводу xc16-gcc -mcpu=24FJ256GA108 -msmart-io=0 -std=gnu9x -g -Wall -mlarge-code -mconst-in-code -Wundef -Wcast-qual -Wpointer-arith -Wcast-align -Wwrite-strings -Wsign-compare -O2 -fno-inline-functions -S): 000000a6 <_fifo_init>: a6: e4 87 47 add.w w15, #0x4, w15 a8: 88 9f be mov.d w8, [w15++] aa: 00 04 be mov.d w0, w8 ac: e0 0f 54 sub.w w8, #0x0, [w15] ae: 00 00 32 bra Z, 0xb0 <.LSM20> ; objdump неправильно выводит метку куда jmp! 000000b0 <.LSM20>: b0: e0 8f 54 sub.w w9, #0x0, [w15] b2: 00 00 32 bra Z, 0xb4 <.L13> ; аналогично, в mplab всё ок (это assert) 000000b4 <.L13>: b4: e1 0f 51 sub.w w2, #0x1, [w15] b6: 00 00 36 bra LEU, 0xb8 <.L14> ; аналогично 000000b8 <.L14>: b8: 09 0c 78 mov.w w9, [w8] ba: 32 04 98 mov.w w2, [w8+6] bc: 08 00 78 mov.w w8, w0 be: 00 00 07 rcall 0xc0 <.LSM25> ; это на самом деле rcall fifo_flush 000000c0 <.LSM25>: c0: 4f 04 be mov.d [--w15], w8 c2: 00 00 00 nop c4: 00 00 06 return Что видим выше. Он в самой первой строке резервирует 4 байта на стеке и фиг высвобождает в конце. На выходе улёт по х.з. какому адресу, что подтверждает MPLAB. Компилируем то же самое в C30: _fifo_init: mov.d w8,[w15++] mov w10,[w15++] mov.d w0,w8 mov w2,w10 cp0 w0 bra z,.L24 ; assert cp0 w9 bra z,.L25 ; assert .L18: sub w10,#1,[w15] bra leu,.L26 ; assert .L20: mov w9,[w8] mov w10,[w8+6] mov w8,w0 call _fifo_flush mov [--w15],w10 mov.d [--w15],w8 ; всё ок, баланс в стеке соблюдён. return .L27: .L26: ; assert 3 mov #.LC0,w1 mov #48,w0 call __fassert nop mov w9,[w8] ; стоило бы добавить __attribute__((noreturn)) для _fassert mov w10,[w8+6] mov w8,w0 call _fifo_flush mov [--w15],w10 mov.d [--w15],w8 return bra .L27 ; странная команда -- она зачем? .L24: ; assert 1 mov #.LC0,w1 mov #46,w0 call __fassert nop cp0 w9 bra nz,.L18 .L25: ; assert 2 mov #.LC0,w1 mov #47,w0 call __fassert nop sub w10,#1,[w15] bra gtu,.L20 bra .L26 Не считая не оптимальности -- всё ок. Баланс в стеке есть, вылетов нет. Вопрос. Если я беру проект, компилирую и он сразу не работает -- о чём это говорит? XC16 -- НЕ РАБОТАЕТ. Такого рода глюки значит -- массовые. Никто, вообще никто не тестирует. Остальные мучаются с -O1. PS:
Microchip Language Tool Shell Version v1_20 (Build date: Sep 30 2013).
Copyright (c) 2012 Microchip Technology Inc. All rights reserved
Executing: "/opt/microchip/xc16/v1.20/bin/bin/elf-gcc" "-v" 
Using built-in specs.
COLLECT_GCC=/opt/microchip/xc16/v1.20/bin/bin/elf-gcc
Target: pic30-elf
Configured with: /Users/cawilkie/dev/builds/build_20130930_1/src/XC_GCC/gcc/configure --build=i386-darwin --host=i386-linux --target=pic30-elf --disable-lto --disable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --disable-hosted-libstdcxx --with-gnu-as --with-gnu-ld --enable-languages=c --disable-nls --disable-libgomp --without-headers --disable-libffi --disable-bootstrap --prefix=/Users/cawilkie/dev/builds/build_20130930_1/install/bin --libexecdir=/Users/cawilkie/dev/builds/build_20130930_1/install/bin --program-prefix=pic30- --with-libelf=/Users/cawilkie/dev/builds/build_20130930_1/bin/XC_GCC-elf-linux-xclm/host-libs/ --with-dwarf2 --with-gmp=/Users/cawilkie/dev/builds/build_20130930_1/bin/XC_GCC-elf-linux-xclm/host-libs --with-ppl=/Users/cawilkie/dev/builds/build_20130930_1/bin/XC_GCC-elf-linux-xclm/host-libs --with-cloog=/Users/cawilkie/dev/builds/build_20130930_1/bin/XC_GCC-elf-linux-xclm/host-libs --with-zlib=/Users/cawilkie/dev/builds/build_20130930_1/bin/XC_GCC-elf-linux-xclm/host-libs --with-bugurl=http://www.microchip.com/support --with-host-libstdcxx=
Thread model: single
gcc version 4.5.1 (XC16, Microchip v1_20) Build date: Sep 30 2013 (Microchip Technology) 
[ZX]