16+
Вторник
20 ноября
Вход |Карта сайта | |Upload |codebook | PARTS

 О смысле всего сущего 0xFF

 Средства и методы разработки

 Мобильная и беспроводная связь

 Блошиный рынок Объявления

caxapa

Микроконтроллеры ARM 

AVR PIC MSP PLD,FPGA,DSP 

Кибернетика Технологии 

Схемы, платы, компоненты 

Микроконтроллеры PIC

 
   Новая тема Правила Регистрация Поиск »» Архив
Вернуться в конференциюТопик полностью
fk0  (01.11.2013 19:42 - 01.11.2013 20:04, просмотров: 3464)
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]
Главная | Карта сайта | О проекте | Проекты | Файлообменник | Регистрация | Вебмастер | RSS
Лето 7527 от сотворения мира. При использовании материалов сайта ссылка на caxapу обязательна.
MMI © MMXVIII