реклама на сайте
подробности

 
 
> XMEGA и IAR5.11B, оптимизатор
koljakh
сообщение Aug 11 2009, 10:11
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 108
Регистрация: 14-07-09
Из: Украина, Киев
Пользователь №: 51 248



Добрый день, всем! Есть один вопрос. Сейчас занимаюсь оптимизацией кода под ATXMEGA128A1,
и вот на что я наткнулся. Внешняя память у меня не подключена, все находится внутри. Следовательно
регистры RAMPD,RAMPX,RAMPZ,RAMPY у меня всегда равны нулю. Но компилер упорно их все время обнуляет и в фоне, и в прерываниях.
При этом для сохранения в прерываниях он использует обычные регистры, которые он перед этим сохраняет, а потом восстанавливает.
Т.к. прерываний у меня дофига, хотелось как-то убрать лишние действия. Вопрос, кто-нить делал это? В стартапе я их обнулю, и дальше компилятор забывает об их существовании.
У компилятора есть предопределенные символы __HAS_RAMPX__, ..., но отенить их #undef нельзя, к сожалению. Или на винавр переходить,
как там дела с этим обстоят?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rst7
сообщение Aug 11 2009, 10:55
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Вот только исправлен ли там этот баг, я не знаю, т.к. с 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


Уже терпимо smile.gif

Цитата(Xenia @ Aug 11 2009, 13:34) *
Дык вышли давно такие версии: 5.20 и 5.30.


Я, кстати, имел в виду еще более новых. Я за обновлениями слежу.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
koljakh
сообщение Aug 11 2009, 11:25
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 108
Регистрация: 14-07-09
Из: Украина, Киев
Пользователь №: 51 248



Цитата(Rst7 @ Aug 11 2009, 12:55) *
Это не баг, а недоделка. Не доделана.

Но это не повод сильно материться. Только что глянул и придумал способ.

Ставим в версии 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


Уже терпимо smile.gif



Я, кстати, имел в виду еще более новых. Я за обновлениями слежу.



Спасибо, это уже другое дело. Люблю я напильником компиляторы шлифовать smile.gif

Цитата(Rst7 @ Aug 11 2009, 13:11) *
Можете не торопиться. Только что проверил, накатив патчи. Один хрен. Так что пока способ борьбы - это описанный мною выше.


Ща попробую, получается что все-таки тип проца другой у младшего семейства, это радует smile.gif
А не скажите, где свойства проца находятся в каком-нить XML? Если добавить еще один файл, ну что-бы красиво было, типа ATXMEGA128A1_MY smile.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- koljakh   XMEGA и IAR5.11B   Aug 11 2009, 10:11
- - aesok   Цитата(koljakh @ Aug 11 2009, 14:11) сожа...   Aug 11 2009, 10:15
|- - koljakh   Цитата(aesok @ Aug 11 2009, 12:15) Точно ...   Aug 11 2009, 10:28
|- - koljakh   Ядро одинаковое Цитата(Xenia @ Aug 11 2009, ...   Aug 11 2009, 10:37
|- - Xenia   Цитата(koljakh @ Aug 11 2009, 13:37) Ядро...   Aug 11 2009, 10:48
|- - koljakh   Цитата(Xenia @ Aug 11 2009, 12:48) Трудно...   Aug 11 2009, 11:08
- - Rst7   ЦитатаНо компилер упорно их все время обнуляет и в...   Aug 11 2009, 10:22
|- - Xenia   Цитата(Rst7 @ Aug 11 2009, 13:22) Ждем но...   Aug 11 2009, 10:34
|- - Xenia   Цитата(Rst7 @ Aug 11 2009, 13:55) Я, кста...   Aug 11 2009, 11:02
|- - aesok   Цитата(koljakh @ Aug 11 2009, 15:18) Спас...   Aug 11 2009, 11:27
- - Rst7   ЦитатаА какая версия еще новее, чем EWAVR-5.30 ? ...   Aug 11 2009, 11:05
- - Rst7   ЦитатаОгромное спасибо, буду качать Можете не тор...   Aug 11 2009, 11:11
- - Rst7   ЦитатаВыкинте в корзину этот совет, вы получите не...   Aug 11 2009, 11:29
|- - aesok   Цитата(Rst7 @ Aug 11 2009, 15:29) Да ну? ...   Aug 11 2009, 11:31
- - Rst7   ЦитатаЩа попробую, получается что все-таки тип про...   Aug 11 2009, 11:31
|- - koljakh   Цитата(Rst7 @ Aug 11 2009, 13:31) Не тип ...   Aug 11 2009, 11:46
- - Rst7   ЦитатаС RAMPZ сложнее, он используеться для адреса...   Aug 11 2009, 11:56
- - koljakh   Цитата(Rst7 @ Aug 11 2009, 13:56) Либо хр...   Aug 11 2009, 12:08


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 17:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.0142 секунд с 7
ELECTRONIX ©2004-2016