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

 
 
> Оптимизация кода IAR С++ v5.10 компилятора, весьма странный код... :(
sonycman
сообщение May 18 2008, 15:47
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Всем привет.
Не даёт покоя один момент в коде программы.
Вкратце - есть прога на С, которую компилирует IAR C/C++ Compiler for AVR
5.10A/W32 (5.10.1.5).
Оптимизация на макс. скорость.
Вот фрагмент сгенерированного кода:

Код
159                  for (a = length; a>0; a--)
   \   00000028   2F01               MOV     R16, R17
    160                  {
    161                      *pBuffer++    =    *text++;
   \                     ??usartSendCommand_4:
   \   0000002A   01F9               MOVW    R31:R30, R19:R18
   \   0000002C   9115               LPM     R17, Z+
   \   0000002E   019F               MOVW    R19:R18, R31:R30
   \   00000030   931D               ST      X+, R17
    162                  }
   \   00000032   950A               DEC     R16
   \   00000034   F7D1               BRNE    ??usartSendCommand_4


Вот думаю, для чего надо выполнять каждую итерацию цикла команды MOVW?
Почему бы не выполнять их один раз перед/после цикла?
Не подскажете, уважаемые, каким образом образумить тупонький компилятор? 07.gif
А то запарил он повсюду создавать подобную конструкцию...

ЗЫ: вспомнил, что по ИАРу есть отдельная ветка, если нужно, то пусть модераторы перекинут тему туда, извиняюсь...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rst7
сообщение May 19 2008, 14:04
Сообщение #2


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

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



Цитата
...попробовал вот так:

из этого никак не могло
Цитата
..но получилось тоже самое:


Приведите Вашу функцию целиком

Забыл - желательно так, чтобы ее можно было откомпилить.


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


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Rst7 @ May 19 2008, 19:04) *
из этого никак не могло
Приведите Вашу функцию целиком

Забыл - желательно так, чтобы ее можно было откомпилить.


Почему же не могло? Инлайн функция...
Проект специально собрал простой, для теста, всего два файла:

main.h
Код
typedef    unsigned long    dword;
typedef    unsigned short    word;
typedef    unsigned char    byte;
typedef char const __flash fbyte;

#define    USART_TEXT    10
#define    FALSE    0
#define    TRUE    1
#define    BAUD(x)    (QUARTZ/(16UL*x)-1)
#define    RX_SEEK    0
#define    RX_RUNNING    1
#define    USART_PREFFIX    2
#define    USART_HEADER    (USART_PREFFIX + 2)
#define    USART_FRONTEND    (USART_HEADER + 1)
#define    USART_MAXDATALENGTH    (sizeof(comm_buffer) - USART_FRONTEND)
#define    USART_TEXT    10

static struct    usart_rx_status
{
    byte    counter:    8;
    byte    mode:    8;
    volatile bool data_available:    1;
    bool    frame_err:    1;
    bool    ovrun_err:    1;
    bool    parity_err:    1;
    bool    length_err:    1;
    bool    lock_err:    1;
}    statusRx;

static struct    usart_tx_status
{
    byte    pointer:    8;
    byte    queue:    8;
    byte    length:    8;
//    volatile    bool    tx_active:    1;
//    bool    frame_err:    1;
//    bool    ovrun_err:    1;
//    bool    parity_err:    1;
    bool    length_err:    1;
//    bool    lock_err:    1;
}    statusTx;

static    byte    rx_buffer[16];
static    byte    tx_buffer[32];
static    byte    comm_buffer[sizeof(tx_buffer)];

#pragma    inline    =    forced
__x_z    void    copymem_P(fbyte __flash*    source, byte*    dest, byte len);

byte    CalculateCRC(const byte    *arr, byte size);
bool usartSendCommand(byte command, const void* pointer = 0, byte length = 0);

и main.cpp
Код
#include <ioavr.h>
#include <inavr.h>
#include <iom88.h>
#include <pgmspace.h>
#include    "main.h"
#include    <string.h>


__x_z    void    copymem_P(fbyte __flash*    source, byte*    dest, byte len)
{
    while(len--)
    {
        *dest++    =    *source++;
    }
}

byte    CalculateCRC(const byte    *arr, byte size)
{
    byte    crc    =    0;
    byte    bits;
    while(size--)
    {
        bits    =    *arr++;
        for(byte    k=0; k<8; k++)
        {
            if ((bits ^ crc)&0x01)
            {
                crc    >>=    1;
                crc    ^=    0x8c;
            }
            else
            {
                crc    >>=    1;
            }
            bits    >>=    1;
        }
    }
    return crc;
}


bool    usartSendData(const byte    *buffer, byte    length)
{
    byte    a, len;
    byte    *pBuffer;
    if (length > sizeof(tx_buffer) || length == 0)
    {
        statusTx.length_err    =    TRUE;
        return FALSE;
    }
    while (statusTx.length);
//    memcpy(tx_buffer, buffer, length);
    while    ((byte)(sizeof(tx_buffer) - (byte)statusTx.queue) < length);
    len    =    length;
    a = sizeof(tx_buffer) - statusTx.pointer;
    if (length > a)
    {
        len -= a;
        pBuffer    =    tx_buffer + statusTx.pointer;
        for (;a > 0;a--) *pBuffer++ = *buffer++;
        statusTx.pointer    =    0;
    }
    pBuffer    =    tx_buffer + statusTx.pointer;
    statusTx.pointer    +=    len;
    for (;len > 0;len--) *pBuffer++ = *buffer++;
    statusTx.length    =    length;
    UCSR0B    |=    1 << UDRIE0;
    statusTx.length_err    =    FALSE;
    return    TRUE;
}
    
bool    usartSendString(fbyte __flash    *pointer)
{
    return usartSendCommand(USART_TEXT, (const void*)pointer, strlen_P(pointer));
}

bool    usartSendCommand(byte command, const void* pointer, byte length)
{
    byte    a;
    byte    *pBuffer;

    switch (command)
    {
    case    USART_TEXT:
        if (!length || length > USART_MAXDATALENGTH) return FALSE;
        fbyte    __flash*    text;
        text    =    (fbyte __flash*)pointer;
        pBuffer    =    comm_buffer + USART_PREFFIX;
        *pBuffer++    =    command;
        *pBuffer++    =    length;

//        copymem_P(text, pBuffer, length);
        
        for (a = length; a>0; a--)
        {
            *pBuffer++    =    *text++;
        }
        
        *pBuffer    =    CalculateCRC(pBuffer    -    length, length);
        break;
    default:
        return    FALSE;
    }
    pBuffer    =    comm_buffer;
    *pBuffer++    =    'S';
    *pBuffer    =    'N';
    return usartSendData(comm_buffer, length + USART_FRONTEND);
}

int main()
{
    usartSendString("some text");
    
  return 0;
}


Проц - мега88, опции проекта:
--string_literals_in_flash
и установить галочку Enable bit definitions in include files...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sonycman   Оптимизация кода IAR С++ v5.10 компилятора   May 18 2008, 15:47
- - Diz   Может, попробовать через стандартную memcpy ?   May 18 2008, 15:58
|- - sonycman   Цитата(Diz @ May 18 2008, 20:58) Может, п...   May 18 2008, 16:06
- - SasaVitebsk   Похоже указатель *text объявлен как volatile. Попр...   May 18 2008, 16:42
|- - sonycman   Цитата(SasaVitebsk @ May 18 2008, 21:42) ...   May 18 2008, 17:33
- - Diz   Если не ошибаюсь, в IAR для флеша есть memcpy_P.   May 18 2008, 17:47
- - vet   с флэш работает memcpy_P(). её объявление содержит...   May 18 2008, 17:47
|- - sonycman   Цитата(Diz @ May 18 2008, 22:47) Если не ...   May 18 2008, 17:51
|- - zltigo   Цитата(sonycman @ May 18 2008, 19:51) ......   May 18 2008, 21:04
- - IgorKossak   Если речь идёт конкретно об IAR и функция не может...   May 19 2008, 05:44
|- - sonycman   Цитата(zltigo @ May 19 2008, 02:04) Не ог...   May 19 2008, 13:40
|- - KRS   Цитата(sonycman @ May 19 2008, 17:40) ......   May 19 2008, 15:03
|- - sonycman   Цитата(KRS @ May 19 2008, 20:03) так в да...   May 19 2008, 15:10
|- - zltigo   Цитата(sonycman @ May 19 2008, 17:10) Опт...   May 19 2008, 15:31
|- - sonycman   Цитата(zltigo @ May 19 2008, 20:31) Ну ещ...   May 19 2008, 15:55
- - Rst7   ЦитатаОптимизации, мать их так Ну попробуйте тако...   May 19 2008, 16:29
|- - sonycman   Цитата(Rst7 @ May 19 2008, 21:29) Ну попр...   May 19 2008, 16:52
||- - sonycman   Да, чудесным образом лишние инструкции исчезли...   May 19 2008, 18:05
||- - zltigo   Цитата(sonycman @ May 19 2008, 20:05) Да-...   May 19 2008, 18:09
|- - singlskv   Цитата(Rst7 @ May 19 2008, 20:29) Тут мно...   May 19 2008, 18:36
- - Rst7   ЦитатаПроблемы только с переносимостью между компи...   May 20 2008, 07:01
|- - singlskv   Цитата(Rst7 @ May 20 2008, 11:01) Это пок...   May 20 2008, 07:31
|- - sonycman   Цитата(Rst7 @ May 20 2008, 11:01) делаем ...   May 20 2008, 11:58
|- - singlskv   Цитата(sonycman @ May 20 2008, 15:58) Хм,...   May 20 2008, 12:09
|- - sonycman   Цитата(singlskv @ May 20 2008, 16:09) Там...   May 20 2008, 12:18
- - Andreas1   Еще непонятки с оптимизацией, правда в IAR AVR 4.3...   May 21 2008, 12:54
|- - Сергей Борщ   Цитата(Andreas1 @ May 21 2008, 15:54) P.S...   May 21 2008, 14:32
|- - sonycman   Цитата(Сергей Борщ @ May 21 2008, 19:32) ...   May 26 2008, 17:12
- - Rst7   Цитата3 варианта одного и того-же Местные телепат...   May 21 2008, 13:06
- - Waso   Немного не в тему, потому как речь о версии ИАР 4....   Nov 26 2010, 18:30
|- - demiurg_spb   А если так: Кодunion { // для доступа к одной я...   Nov 27 2010, 18:25
|- - Dog Pawlowa   Цитата(Waso @ Nov 26 2010, 21:30) Немного...   Nov 28 2010, 06:37
- - Xenia   Вот так напишите и будет вам щастье: Кодvoid ma...   Nov 28 2010, 07:37
- - Waso   demiurg_spb, неа, не канает. Xenia, Dog Pawlowa, ...   Nov 28 2010, 19:33
|- - rezident   Цитата(Waso @ Nov 29 2010, 00:33) Где про...   Nov 28 2010, 20:43
|- - Сергей Борщ   QUOTE (rezident @ Nov 28 2010, 22:43) В с...   Nov 28 2010, 22:18
- - Waso   Спасибо. Каюсь. Грешен. Ненавижу читать стандарты...   Nov 29 2010, 08:17


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 21:44
Рейтинг@Mail.ru


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