Цитата(virfis @ Jul 16 2018, 12:01)
Проблема обнаружилась когда проект с 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 ( 2.16 килобайт )
Кол-во скачиваний: 9Как видно - всё ок.
У Вас в листинге вижу очень похожий код, но без 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.