Перейти к содержанию

    

Ошибка компилятора IAR 8.xx

Проблема обнаружилась когда проект с Lwip был перенесен на компилятор 8-й версии. Через некоторое время после установления соединения по TCP и обмена данными прекращался обмен. Тот же проект скомпилированный на 7-й версии работает нормально. Разбираясь и копаясь нашел что "восьмерка" создает неверный (на мой взгляд) код в функции tcp_receive при включенной оптимизации. Я сделал тестовые проекты под версии 7.80 и 8.30. Взгляните на результат вывода printf в обеих версиях. В папке два проекта. Проект test - это для 8.30, test7_80.eww - для 7.80 соответственно.

test.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Проблема обнаружилась когда проект с Lwip был перенесен на компилятор 8-й версии. Через некоторое время после установления соединения по TCP и обмена данными прекращался обмен. Тот же проект скомпилированный на 7-й версии работает нормально. Разбираясь и копаясь нашел что "восьмерка" создает неверный (на мой взгляд) код в функции tcp_receive при включенной оптимизации. Я сделал тестовые проекты под версии 7.80 и 8.30. Взгляните на результат вывода printf в обеих версиях. В папке два проекта. Проект test - это для 8.30, test7_80.eww - для 7.80 соответственно.

Попробовал скомпилить Ваш проект. Только у меня "IAR ANSI C/C++ Compiler V8.20.1.14183/W32 for ARM".

Результат:

  tcpwnd_size_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd);          
??test_0: (+1)                                                                     
            MULS     R2,R2,R2                                                      
0xF2F1      SDIV     R2,R2,R1                                                      
            ADDS     R2,R2,R1                                                      
  if (new_cwnd > pcb->cwnd) {                                                      
            UXTH     R3,R2                                                         
            CMP      R1,R3                                                         
            IT       CC                                                            
            MOVCC    R1,R3                                                         
            STRH     R1,[R0, #+24]                                                 
    pcb->cwnd = new_cwnd;

main.lst_iar8.20.zip

Как видно - всё ок.

У Вас в листинге вижу очень похожий код, но без UXTH, что странно. Возможно баг добавился после моей версии IAR.

Ещё что странно: Ваш проект открылся с ключами "Cortex-M3" и "fpu=none", но заглянув в Ваш .lst видно, что в заголовке указано "--cpu=Cortex-M7 -e --fpu=VFPv5_d16". Странно.

Попробовал на IAR8.20 скомпилить этот проект и для CM3 и для CM7 с FPU - результат в обоих случаях корректный.

Файлы проекта я использовал ваши, только удалил из них ключ "NULINK_ID" - IAR8.20 не захотел его понимать.

 

PS: Так что баг похоже добавился недавно и наверное скоро исправят. Пока можно пользоваться IAR8.20.

PPS: В любом случае - спасибо за предупреждение! Теперь не будем обновлять версии IAR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел 8.22.2 версию. Действительно открылся проект как М3, ничего не менял, просто перебилдил.

          if ((tcpwnd_size_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
        0x27e: 0x1852         ADDS      R2, R2, R1
        0x280: 0xb293         UXTH      R3, R2
        0x282: 0x4299         CMP       R1, R3
        0x284: 0xd208         BCS.N     0x298
            pcb->cwnd += pcb->mss;
        0x286: 0xe006         B.N       0x296
          tcpwnd_size_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd);
        0x288: 0x4352         MULS      R2, R2, R2
        0x28a: 0xfb92 0xf2f1  SDIV      R2, R2, R1
        0x28e: 0x1852         ADDS      R2, R2, R1
          if (new_cwnd > pcb->cwnd) {
        0x290: 0x428a         CMP       R2, R1
        0x292: 0xbf38         IT        CC
        0x294: 0x460a         MOVCC     R2, R1
        0x296: 0x8302         STRH      R2, [R0, #0x18]
    return pcb->cwnd;
        0x298: 0x8b00         LDRH      R0, [R0, #0x18]
        0x29a: 0x4770         BX        LR

 

А где бы раздобыть версию 8.20?

Изменено пользователем virfis

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
А где бы раздобыть версию 8.20?

На местном FTP должна быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
На местном FTP должна быть.

Да я как бы не имею доступа

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Да я как бы не имею доступа

Отправил в личку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, подтверждаю. На 8.20.1 компилирует нормально. Свой проект перекомпилировал - тоже всё отлично работает.

Так что баг похоже добавился недавно и наверное скоро исправят.
Для этого им надо о нём узнать. А сообщить может только тот у кого лицензия есть.

 

В этой версии кстати, еще в файле STM32H7xx.dmac ошибка. Отладчик ругается при запуске, но указывает конкретное место в строке 203. Я лишнюю открывающую скобку убрал и нормально стало.

Изменено пользователем virfis

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Для этого им надо о нём узнать. А сообщить может только тот у кого лицензия есть.

Как немного освобожусь, надо будем им написать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Как немного освобожусь, надо будем им написать.

Вы не писали им случайно?

Версия 8.30.2 - проблема устранена!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Вы не писали им случайно?

Версия 8.30.2 - проблема устранена!!!

Не, не писал. Так и не нашёл времени ;)

Да и пользуюсь 7.80.4.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти