Цитата
Вот только исправлен ли там этот баг, я не знаю, т.к. с XMEGA дела не имела.
Это не баг, а недоделка. Не доделана.
Но это не повод сильно материться. Только что глянул и придумал способ.
Ставим в версии 5.30 тип проца ATxmega128A3, в ATxmega128A1.h патчим проверку модели
Код
#if TID_GUARD(6)
//#error This file should only be compiled with iccavr or aavr whith processor option -v6
#endif /* TID_GUARD(6) */
И инклудим напрямик ioxm128a1.h, а не ioavr.h
Результат:
CODE
#include "ioxm128a1.h"
#include "stdafx.h"
#pragma optimize=no_inline
__x_z void mcpy(UINT8 *d, UINT8 *s, UREG c)
{
do
{
*d++=*s++;
}
while(--c);
}
volatile UINT32 cnt;
#pragma vector=PORTA_INT0_vect
__interrupt void intproc(void)
{
cnt++;
}
int main( void )
{
mcpy((UINT8*)1234,(UINT8*)5678,124);
return 0;
}
CODE
1 #include "ioxm128a1.h"
2 #include "stdafx.h"
3
4 #pragma optimize=no_inline
\ In segment FARCODE, align 2, keep-with-next
5 __x_z void mcpy(UINT8 *d, UINT8 *s, UREG c)
\ mcpy:
\ ??mcpy_0:
6 {
7 do
8 {
9 *d++=*s++;
\ 00000000 9111 LD R17, Z+
\ 00000002 931D ST X+, R17
10 }
11 while(--c);
\ 00000004 950A DEC R16
\ 00000006 F7E1 BRNE ??mcpy_0
12 }
\ 00000008 9508 RET
13
\ In segment NEAR_Z, align 1, keep-with-next
\ 00000000 REQUIRE `?<Segment init: NEAR_Z>`
14 volatile UINT32 cnt;
\ cnt:
\ 00000000 DS8 4
15
16 #pragma vector=PORTA_INT0_vect
\ In segment FARCODE, align 2, keep-with-next
17 __interrupt void intproc(void)
\ intproc:
18 {
\ 00000000 93FA ST -Y, R31
\ 00000002 93EA ST -Y, R30
\ 00000004 934A ST -Y, R20
\ 00000006 933A ST -Y, R19
\ 00000008 932A ST -Y, R18
\ 0000000A 931A ST -Y, R17
\ 0000000C 930A ST -Y, R16
\ 0000000E B74F IN R20, 0x3F
19 cnt++;
\ 00000010 .... LDI R30, LOW(cnt)
\ 00000012 .... LDI R31, (cnt) >> 8
\ 00000014 8100 LD R16, Z
\ 00000016 8111 LDD R17, Z+1
\ 00000018 8122 LDD R18, Z+2
\ 0000001A 8133 LDD R19, Z+3
\ 0000001C 5F0F SUBI R16, 255
\ 0000001E 4F1F SBCI R17, 255
\ 00000020 4F2F SBCI R18, 255
\ 00000022 4F3F SBCI R19, 255
\ 00000024 8300 ST Z, R16
\ 00000026 8311 STD Z+1, R17
\ 00000028 8322 STD Z+2, R18
\ 0000002A 8333 STD Z+3, R19
20 }
\ 0000002C BF4F OUT 0x3F, R20
\ 0000002E 9109 LD R16, Y+
\ 00000030 9119 LD R17, Y+
\ 00000032 9129 LD R18, Y+
\ 00000034 9139 LD R19, Y+
\ 00000036 9149 LD R20, Y+
\ 00000038 91E9 LD R30, Y+
\ 0000003A 91F9 LD R31, Y+
\ 0000003C 9518 RETI
21
\ In segment FARCODE, align 2, keep-with-next
22 int main( void )
\ main:
23 {
\ 00000000 93BA ST -Y, R27
\ 00000002 93AA ST -Y, R26
24 mcpy((UINT8*)1234,(UINT8*)5678,124);
\ 00000004 E70C LDI R16, 124
\ 00000006 E2EE LDI R30, LOW(5678)
\ 00000008 E1F6 LDI R31, (5678) >> 8
\ 0000000A EDA2 LDI R26, LOW(1234)
\ 0000000C E0B4 LDI R27, (1234) >> 8
\ 0000000E .... RCALL mcpy
25 return 0;
\ 00000010 E000 LDI R16, 0
\ 00000012 E010 LDI R17, 0
\ 00000014 91A9 LD R26, Y+
\ 00000016 91B9 LD R27, Y+
\ 00000018 9508 RET
26 }
\ In segment INTVEC, offset 0x108, root
\ `??intproc??INTVEC 264`:
\ 00000108 ........ JMP intproc
Уже терпимо

Цитата(Xenia @ Aug 11 2009, 13:34)

Дык вышли давно такие версии: 5.20 и 5.30.
Я, кстати, имел в виду еще более новых. Я за обновлениями слежу.