Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Инструментарий

Инструментарий Тестеры, паяльники, осциллографы, программаторы, IDE.

Ответ
 
Опции темы Опции просмотра
Старый 15.06.2020, 13:28   #1
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,879
Вес репутации: 3760/106
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Вступление

Жил был довольно большой проект.
В нем сотня модулей, тысяча и более хедеров.
Поддержка всяких там микросхем памяти, Ethernet, SD, LwIP внутри и т.д.
Всякие там http серверы и много всего.
Это развивалось несколько лет (много лет).
Использовался IAR 8.2
И тут я заметил что уровень оптимизации стоит Low. Непорядок. Переключил на High(optimized). Все работает. Но....
Появился глюк - http сервер прерывает соединение после некого волшебного размера файла.
Не мало но не более 2-2,2 МБ. Странно.
Ну думаю что делать - буду искать ошибку.
Прошел месяц тяжелой работы(проект то большой).
Много отладчиков и шнуров погибло... но глюк не пойман.

И тут я поставил для пробы IAR 8.5 с сайта (генератор лицензий перестал подходить и пришлось заказывать trial лицензию на 30 дней)
И... глюк пропал на всех уровнях оптимизации...
Т.е. ошибки и не было????? И я зря ее искал...
Ответа нет...

Я не поленился(месяц и так потерян) и начал проверять все версии.
Итак:
На 6.5 глюка нет.
На 7.0 и 8.2 глюк есть. На уровне Low глюка нет (как и было).
На 8.3 8.4 и 8.5 глюка нет при любой оптимизации.
Правда в 8.5 было падение компилятора Internal error
но легко полечилось разбиением одного большого модуля на половинки.

Все доступные Keil - нет глюка.

Конечно никаких варнингов или ошибок.
Конечно полная компиляция всего проекта при смене уровней оптимизации.
Под каждую версию проект (сам файл проекта) конечно делался новый.
Ну точнее новый для версий старее и и так открывался для версий новее.
Речь о IAR for ARM конечно.

И тут вопрос:

Кто что знает о глюках оптимизаторов?
Я конечно делал общеизвестное:
1) volatile для переменных циклов
2) Конечно если я присваиваю переменной const или define то я помню
что будет использовано само значение. Потому между
барьерами оптимизации (вызовами функций к примеру) я использовал
присвоение volatile переменной.
Но это азы. И конечно проект работает. Но...
Кто что про это знает?
Petr вне форума   Ответить с цитированием
Старый 15.06.2020, 13:38   #2
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,879
Вес репутации: 3760/106
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

И еще одна функция для обсуждения:
Код:
//------------------------------------------------------------------------------
//передает очередной блок данных из файла
void Send_DataBL(THttp_State *HS)
{
  unsigned short Len;                                           //количество байт для чтения
  unsigned char  Bf_A[SECTOR_SIZE];                             //буфер данных для чтения
  unsigned char  Bf_B[SECTOR_SIZE*2];                           //буфер данных для отправки
  
  if (!HS->PGetAvLen) return;                                   //если нет ссылки на функцию замера буфера - делать нечего
  
  //берем меньшую величину из буфера или остатка данных
  if (HS->PGetAvLen(HS->pcb) < HS->AFile.Left) Len = HS->PGetAvLen(HS->pcb);
  else                                         Len = HS->AFile.Left;
  //ограничение FAT на единичный блок
  if (Len > SECTOR_SIZE) Len = SECTOR_SIZE;

  if (HS->NeedSeek)                                             //если следует выполнить Seek
  {
    HS->NeedSeek = 0;                                           //требуется только один раз после ~inc:
    MPFSSeek(HS->AFile.FHandle, HS->AFile.RPntr);               //ставим на место точку чтения файла (при откате для ~inc:)
  }

  if (HS->AFile.NoInc && HS->AFile.NoIns)                       //если для этого файла обработка отключена
  {
    MPFSGetArray(HS->AFile.FHandle, Bf_B, Len);                 //читаем очередной блок из файла
    HS->AFile.RPntr += Len;                                     //двигаем указатели
    HS->AFile.Left -= Len;
  }
  //указатели RPntr и Left будут обработаны в Prep_Data
  //оставляем место под заголовок чанка!
  else 
  {    
    MPFSGetArray(HS->AFile.FHandle, Bf_A, Len);                 //читаем очередной блок из файла
    //оставляем место под заголовок чанка!
    Len = Prep_Data(Bf_A, &Bf_B[6], Len, HS);                   //обработка ~~ команд в передаваемых файлах  
  }
  
  if (Len)                                                      //если есть что отправлять
  {
    HS->ActivityTimer = 0;                                      //Timeout keeper
    if (HS->NeedChanks)                                         //если нужно оформление чанков
    {
      //хедер чанка
      UShortToStrHEX(Len, Bf_B);                                //получим размер в виде HEX числа в буфер (4 символа)
      Bf_B[4] = '\r';                                           //конец строки
      Bf_B[5] = '\n';
      //футер чанка
      Bf_B[Len + 6] = '\r';                                     //конец строки
      Bf_B[Len + 7] = '\n';
      Len += 8;                                                 //учли увеличение буфера на оформление чанка
    }
    if (HS->PSend_Inf) HS->PSend_Inf(HS, Bf_B, Len);            //передача блока
  }
}
Так вот не работает на оптимизации выше Low
Но если заменить HS->AFile.Left -= Len;
на HS->AFile.Left = HS->AFile.Left-Len; то работает...
Причем HS->AFile.Left это unsigned long для понимания.
Petr вне форума   Ответить с цитированием
Старый 20.06.2020, 21:47   #3
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,214
Вес репутации: 909/61
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

в первом случае ты изменяешь переменную AFile.Left
во втором ты получаешь результат действий над двумя переменными
SergP01 на форуме   Ответить с цитированием
Старый 21.06.2020, 07:11   #4
AleksBak
Senior Member
 
Аватар для AleksBak
 
Регистрация: 27.02.2007
Адрес: г. Баку
Сообщений: 3,189
Вес репутации: 2934/111
AleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от SergP01 Посмотреть сообщение
в первом случае ты изменяешь переменную AFile.Left
во втором ты получаешь результат действий над двумя переменными
Нет (по-моему). Ему, тут в ф. void Send_DataBL(THttp_State* HS) приходит указатель на структуру типа THttp_State и в этой ф. он модифицирует ее некоторые поля. И мне кажется, что унарная операция как-раз таки "правильнее" работает с указателями:
Код:
HS->AFile.Left -= Len;
И правильнее их модицифирует. А по логике работы программы это оказывается неправильный вариант в итоге. Но это все гадание на кофейной гуще т.к. не приведен дизасм. код, не приведено объявление структуры THttp_State в конце-концов.
И еще по теме тут отвечу - мне вот такое поведение компилятора (тут IAR) очень и очень напоминает поведение компилятора CCS для ПИК-ов. Отличительной чертой CCS компилятора была невероятная оптимизация
и всякие "выкрутасы" по сжатию кода по сравнению с др. компиляторами (микрочивским и HiTech например - про остальные не знаю). Но вот иногда он чего-то "мудрил" слишком сильно и если не знать его некоторых тонкостей и "неправильно" что-то ему написать, то мог натворить дров как говорится (по своему поступить в итоге и безжалостно что-то выкинуть или не сделать). То же самое и тут с IAR компилятором как мне кажется.
AleksBak вне форума   Ответить с цитированием
Старый 21.06.2020, 07:29   #5
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,214
Вес репутации: 909/61
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

ИМХО.... писать надо "дубово" , с закосом на разные компиляторы
не х+=2, а х=х+2
просто хрен его знает как оно там реализовано....
SergP01 на форуме   Ответить с цитированием
Старый 21.06.2020, 08:13   #6
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,967
Вес репутации: 2596/91
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от SergP01 Посмотреть сообщение
ИМХО.... писать надо "дубово" , с закосом на разные компиляторы
не х+=2, а х=х+2
просто хрен его знает как оно там реализовано....

DimaS вне форума   Ответить с цитированием
Старый 21.06.2020, 08:44   #7
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,214
Вес репутации: 909/61
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от DimaS Посмотреть сообщение
во втором случае ты явно указываешь на использование или 2 регистров или 2 ячейки памяти....
а вот в первом..... хз- как связка компилятор - оптимизатор работает. дизасм смотреть надо
SergP01 на форуме   Ответить с цитированием
Старый 21.06.2020, 11:20   #8
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,967
Вес репутации: 2596/91
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

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


P.S. С 99%-й вероятностью, с нормальным компилятором результирующий код от X=X+2; и X+=2; будет тот-же самый.
И два регистра там нафиг не впали, если у процессора есть команда сложения аккумулятора с константой.
А она была и в 70-х, у PIC и 8080.
DimaS вне форума   Ответить с цитированием
Старый 21.06.2020, 11:59   #9
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,214
Вес репутации: 909/61
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от DimaS Посмотреть сообщение
Сергей, Вы еще раз подвердили мое мнение о Вас, жаль только, что я не смог удержатся от ответа.


P.S. С 99%-й вероятностью, с нормальным компилятором результирующий код от X=X+2; и X+=2; будет тот-же самый.
И два регистра там нафиг не впали, если у процессора есть команда сложения аккумулятора с константой.
А она была и в 70-х, у PIC и 8080.
я на ADSP приколов насмотрелся..... там х=х+y будем в памяти делаться а не на уровне регистров
т.е. там компилятор ещё тот был....

вот там реально можно было оптимизатору руки выкручивать вплодь до того что переставало работать
SergP01 на форуме   Ответить с цитированием
Старый 21.06.2020, 12:06   #10
AleksBak
Senior Member
 
Аватар для AleksBak
 
Регистрация: 27.02.2007
Адрес: г. Баку
Сообщений: 3,189
Вес репутации: 2934/111
AleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от DimaS Посмотреть сообщение
Сергей, Вы еще раз подвердили мое мнение о Вас, жаль только, что я не смог удержатся от ответа.


P.S. С 99%-й вероятностью, с нормальным компилятором результирующий код от X=X+2; и X+=2; будет тот-же самый.
И два регистра там нафиг не впали, если у процессора есть команда сложения аккумулятора с константой.
А она была и в 70-х, у PIC и 8080.
1. Тут не просто "сложение аккумулятора с константой" идет, а увеличение указателя, а это нужно "вычислять и предсказывать" компилятору. А зачем ему сложности когда можно просто "сооптимизировать". Поле 'Left' не понятно какого типа и автор не потрудился даже его привести. Зато хвастается "тысячами и более хедеров". Из-за этого наверно и никто не стал тут что-то писать/отвечать. Сергей (SergP01) вот взял и написал несмотря на это. И тема получила развитие. Бывает иногда ситуации в жизни, что только на форуме можно как-то "излить душу". Особенно сейчас в наше гнилое коронавирусное время.
2. Ни кого не стоит никогда обвинять в некомпетентности и пр. т.к. людям всегда свойственно ошибаться. Они могу зевать фигуры в шахматах например. Как многие знаменитые гроссы (М.Таль например!).
3. Тут, пока, непонятно кто прав, а кто нет т.к. автор не потрудился даже привести тип поля структуры и дизасм. код (а сам возможно его давным-давно наблюдал у себя).
AleksBak вне форума   Ответить с цитированием
Старый 21.06.2020, 14:37   #11
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,967
Вес репутации: 2596/91
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от AleksBak Посмотреть сообщение
1. Тут не просто "сложение аккумулятора с константой" идет, а увеличение указателя, а это нужно "вычислять и предсказывать" компилятору.

Размер инкремента указателя = константа, и известен компилятору заранее.
DimaS вне форума   Ответить с цитированием
Старый 21.06.2020, 14:56   #12
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 61
Сообщений: 3,544
Вес репутации: 4234/126
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от SergP01 Посмотреть сообщение
..... там х=х+y будем в памяти делаться
Какое отношение сложение двух переменных имеет к сложению переменной с литералом-константой? В любой архитектуре это принципиально разные инструкции. В одном случае - двухадресные, а в другом - одноадресные. При расчете указателей вообще применяют умножение на константу...
Марк вне форума   Ответить с цитированием
Старый 21.06.2020, 16:05   #13
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 2,214
Вес репутации: 909/61
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от Марк Посмотреть сообщение
Какое отношение сложение двух переменных имеет к сложению переменной с литералом-константой? В любой архитектуре это принципиально разные инструкции. В одном случае - двухадресные, а в другом - одноадресные. При расчете указателей вообще применяют умножение на константу...
HS->AFile.Left -= Len;

я здесь констант не увидел.....
просто пример привёл не удачный....
SergP01 на форуме   Ответить с цитированием
Старый 22.06.2020, 09:47   #14
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,879
Вес репутации: 3760/106
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от SergP01 Посмотреть сообщение
HS->AFile.Left -= Len;

я здесь констант не увидел.....
просто пример привёл не удачный....
А чем же пример неудачный???????????????????
На поиск данного места ушло много времени и это было
именно то место, что создавал проблемы.
А поэтому это не "неудачный пример" а результат удачной работы. И очень удачной.

По ассемблерному коду.
Компиляторы переставлял. Сейчас стоит 8.4 в котором глюка нет при любой оптимизации. Поэтому листинг от него приводить нет смысла.
А ставить 8.2 где глюк был - лень.

В примере я вычитаю из ulong ushort и не вижу каких либо проблем с логикой.
Может проблемы ЕСТЬ, а вот я про них не знаю.
Потому и спрашиваю.
Спрашиваю не "как победить" - уже победил.
Спрашиваю "какие есть глюки оптимизации" и "какие танцы с бубном делать чтобы проблем избежать".
Вот в этом вопрос.
Т.е. какие существуют методы писать код так,
чтобы обходить оптимизацию там где она не нужна.
Я же знаю что оптимизатор код
Код:
  //бит 7
  if (Data & 0x80) OLED_DIN_PORT->BSRR = O_DIN;                 //1
  else             OLED_DIN_PORT->BRR  = O_DIN;                 //0
  __asm volatile ("NOP");
  OLED_CLK_PORT->BSRR = O_CLK_PIN;                              //начался строб
  __asm volatile ("NOP"); __asm volatile ("NOP");
  OLED_CLK_PORT->BRR  = O_CLK_PIN;                              //закончился строб
  //бит 6
  if (Data & 0x40) OLED_DIN_PORT->BSRR = O_DIN;
  else             OLED_DIN_PORT->BRR  = O_DIN;
  __asm volatile ("NOP");
  OLED_CLK_PORT->BSRR = O_CLK_PIN;
  __asm volatile ("NOP"); __asm volatile ("NOP");
  OLED_CLK_PORT->BRR  = O_CLK_PIN;
  //бит 5
  if (Data & 0x20) OLED_DIN_PORT->BSRR = O_DIN;
  else             OLED_DIN_PORT->BRR  = O_DIN;
  __asm volatile ("NOP");
  OLED_CLK_PORT->BSRR = O_CLK_PIN;
  __asm volatile ("NOP"); __asm volatile ("NOP");
  OLED_CLK_PORT->BRR  = O_CLK_PIN;
  //бит 4
  if (Data & 0x10) OLED_DIN_PORT->BSRR = O_DIN;
  else             OLED_DIN_PORT->BRR  = O_DIN;
  __asm volatile ("NOP");
  OLED_CLK_PORT->BSRR = O_CLK_PIN;
  __asm volatile ("NOP"); __asm volatile ("NOP");
  OLED_CLK_PORT->BRR  = O_CLK_PIN;
  //бит 3
  if (Data & 0x08) OLED_DIN_PORT->BSRR = O_DIN;
  else             OLED_DIN_PORT->BRR  = O_DIN;
  __asm volatile ("NOP");
  OLED_CLK_PORT->BSRR = O_CLK_PIN;
  __asm volatile ("NOP"); __asm volatile ("NOP");
  OLED_CLK_PORT->BRR  = O_CLK_PIN;
  //бит 2
  if (Data & 0x04) OLED_DIN_PORT->BSRR = O_DIN;
  else             OLED_DIN_PORT->BRR  = O_DIN;
  __asm volatile ("NOP");
  OLED_CLK_PORT->BSRR = O_CLK_PIN;
  __asm volatile ("NOP"); __asm volatile ("NOP");
  OLED_CLK_PORT->BRR  = O_CLK_PIN;
  //бит 1
  if (Data & 0x02) OLED_DIN_PORT->BSRR = O_DIN;
  else             OLED_DIN_PORT->BRR  = O_DIN;
  __asm volatile ("NOP");
  OLED_CLK_PORT->BSRR = O_CLK_PIN;
  __asm volatile ("NOP"); __asm volatile ("NOP");
  OLED_CLK_PORT->BRR  = O_CLK_PIN;
  //бит 0
  if (Data & 0x01) OLED_DIN_PORT->BSRR = O_DIN;
  else             OLED_DIN_PORT->BRR  = O_DIN;
  __asm volatile ("NOP");
  OLED_CLK_PORT->BSRR = O_CLK_PIN;
  __asm volatile ("NOP"); __asm volatile ("NOP");
  OLED_CLK_PORT->BRR  = O_CLK_PIN;
выбросит!!! если O_CLK_PIN и O_DIN будут константами
а если будут переменными - не выбросит.
Знаю про это и пишу всегда
Код:
volatile unsigned short O_DIN = OLED_DIN_PIN;                   //боремся с оптимизатором
volatile unsigned short O_CLK_PIN = OLED_CLK_PIN;
Где OLED_DIN_PIN и OLED_CLK_PIN константы.

это один из методов сделать код надежным.
Я про это и спрашиваю!
Какие методы знают другие ?
И какое "правило" нарушил я ?
Petr вне форума   Ответить с цитированием
Старый 22.06.2020, 09:51   #15
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,879
Вес репутации: 3760/106
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Был вопрос о структуре.
Она проста.

Код:
//----------
//структура контекста TCP соединения
typedef struct
{
  void                    *pcb;                                 //ссылка на текущее соединение
  TSend_Inf               PSend_Inf;                            //ссылка на функцию передачи данных
  TClConn                 PClConn;                              //ссылка на функцию закрытия соединения
  TClConn                 PSendTok;                             //ссылка на функцию отсылки токена в соединение
  TGetAvLen               PGetAvLen;                            //ссылка на функцию получения размера доступного буфера
  TNextBl                 PNextBl;                              //функция следующего блока
  TFSend                  AFile;                                //активный файл
  TFSend                  NextFile;                             //следующий файл
  unsigned char           Ready;                                //флаг готовности к обработке запроса
  unsigned char           IncLogMode;                           //режим вставки лога
  unsigned char           IncSDMode;                            //режим вставки каталога SD
  unsigned char           LogNumLines;                          //с нумерацией строк или нет
  unsigned char           NeedSeek;                             //флаг необходимости выполнения отката чтения
  unsigned char           NeedChanks;                           //флаг необходимости оформления чанков
  unsigned char           isAuthorized;                         //признак авторизации
  unsigned char           POST_ResMode;                         //режим обработки данных POST
  unsigned char           POST_WrMode;                          //режим записи данных POST
  unsigned long           POST_Len;                             //длина тела POST
  unsigned long           Range;                                //точка докачки
  char                    POST_FName[MAX_KWord];                //имя файла формы POST
  unsigned char           POST_Buf[MAX_POST_Arg];               //буфер текстового содержимого POST
  unsigned short          InBf_WrPntr;                          //точка записи во входном буфере  
  unsigned long           POST_WrPntr;                          //точка записи данных POST
  unsigned short          ActivityTimer;                        //Timeout keeper  
  unsigned char           FExt[4];                              //расширение файла
} THttp_State;
Petr вне форума   Ответить с цитированием
Старый 22.06.2020, 10:02   #16
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,879
Вес репутации: 3760/106
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Вы обсуждаете Len += 8; где 8 константа ????
Так тут ошибки не было!!!!!

Ошибка была в HS->AFile.Left -= Len; где я от ULong отнимаю UShort.

А делаю я это потому что длина файла это ULong а передать я могу не более 512 байт за раз.
Поэтому я не использую избыточную разрядность а именно UShort.
А далее я не увидел проблемы в вычитании для таких разрядностей.....

Более того.
Передается не 65535 байт как можно было бы ожидать при проблемах с
разрядностью.
А более 2 мегабайт и более. Т.е. вычитание давало ноль при вычитании чего то непонятного.

Вот листинга нет.
Да и ладно. Будет время - поставлю глючный компилятор и буду
разбираться в листинге.
Интересно какая была ошибка в С коде???
Petr вне форума   Ответить с цитированием
Старый 22.06.2020, 11:49   #17
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,598
Вес репутации: 4677/102
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Petr
volatile unsigned short O_DIN = OLED_DIN_PIN; //боремся с оптимизатором
volatile unsigned short O_CLK_PIN = OLED_CLK_PIN;
- мне не приходилось бороться с оптимизатором. Не было такого опыта.
В целом размотанный цикл c inline assemly плохой пример для оптимизатора - часто при виде inline assembly в блоке оптимизации для блока отключаются.
Да и непонятно, почему просто не сделать цикл для последовательной передачи. Зачем разматывать и одновременно задержки вставлять?

И какое "правило" нарушил я? - трудно сказать. Я видел уйму кода, который написан с моей точки зрения плохо и у меня в целом к нему нет вопросов.

А делаю я это потому что длина файла это ULong а передать я могу не более 512 байт за раз. Поэтому я не использую избыточную разрядность а именно UShort. А далее я не увидел проблемы в вычитании для таких разрядностей - почему не можете-то? не можете в функцию аргумент передать? еще как можете.
Вы можете гарантировать другим программистам, что не будете передавать определенные аргументы да и то, если это написано в описании функции. Но у Вас нет описания функции.

Но не о том речь - если при замене того, что Вы сказали, на другое, равнозначное, проблема исчезает то проблема в инструментарии.
И дело не в том, хорошо или плохо написано - одинаковое должно работать одинаково.

Кто что знает о глюках оптимизаторов? - компиляторы, бывает, генерируют код с ошибками разной степени упоротости.
С частью их можно ознакомиться в errata.
Keil, ровно как и Iar использовал минимально и мне очень не понравилось.
besogon вне форума   Ответить с цитированием
Старый 22.06.2020, 13:23   #18
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,879
Вес репутации: 3760/106
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от besogon Посмотреть сообщение
Petr
volatile unsigned short O_DIN = OLED_DIN_PIN; //боремся с оптимизатором
volatile unsigned short O_CLK_PIN = OLED_CLK_PIN;
- мне не приходилось бороться с оптимизатором. Не было такого опыта.
В целом размотанный цикл c inline assemly плохой пример для оптимизатора - часто при виде inline assembly в блоке оптимизации для блока отключаются.
Да и непонятно, почему просто не сделать цикл для последовательной передачи. Зачем разматывать и одновременно задержки вставлять?
Для оптимизации. Если сделать цикл - команд больше.
Если вставить больше задержек - нет смысла не сделать цикл.
Но ТУТ задержек меньше чем в цикле.
Именно ЭТОТ код быстрее цикла

Цитата:

И какое "правило" нарушил я? - трудно сказать. Я видел уйму кода, который написан с моей точки зрения плохо и у меня в целом к нему нет вопросов.
А что ИМЕННО не так с кодом? Есть наверно конкретные претензии?
Это для меня важно и интересно.

Цитата:

А делаю я это потому что длина файла это ULong а передать я могу не более 512 байт за раз. Поэтому я не использую избыточную разрядность а именно UShort. А далее я не увидел проблемы в вычитании для таких разрядностей - почему не можете-то? не можете в функцию аргумент передать? еще как можете.
Вы можете гарантировать другим программистам, что не будете передавать определенные аргументы да и то, если это написано в описании функции. Но у Вас нет описания функции.
Это МОЯ функция чтения файла. И в моей голове есть такое описание.
Да и в пояснении к функции это тоже есть
Она НЕ читает более 512 байт за раз.
О чем вы пишете - непонятно.

Цитата:

Но не о том речь - если при замене того, что Вы сказали, на другое, равнозначное, проблема исчезает то проблема в инструментарии.
И дело не в том, хорошо или плохо написано - одинаковое должно работать одинаково.
Ну вот не знаю.
Вы правы. Но я хочу писать ТАК чтобы работало при смене инструментов.
Такие "правила" есть и от них никуда не деться.

Цитата:

Кто что знает о глюках оптимизаторов? - компиляторы, бывает, генерируют код с ошибками разной степени упоротости.
С частью их можно ознакомиться в errata.
Keil, ровно как и Iar использовал минимально и мне очень не понравилось.
А что именно вам не понравилось в Keil?
Не цвет же окон?
Мне вот нравится то, что он следит за пирамидой изменений
и компилирует только те файлы, которые надо а не все подряд.
Даже на быстрой машине это экономит многие часы на большом проекте.
Вот поэтому я предпочитаю его.
А с какими трудностями сталкивались вы?
Что стало причиной "плохизны" ?
Petr вне форума   Ответить с цитированием
Старый 22.06.2020, 13:48   #19
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,967
Вес репутации: 2596/91
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от Petr Посмотреть сообщение

А что именно вам не понравилось в Keil?
Не цвет же окон?
Мне вот нравится то, что он следит за пирамидой изменений
и компилирует только те файлы, которые надо а не все подряд.
Даже на быстрой машине это экономит многие часы на большом проекте.

Как раз IAR компилирует заметно быстрее, даже полную перекомпиляцию.
Но код у Кейла лучше.
DimaS вне форума   Ответить с цитированием
Старый 22.06.2020, 13:49   #20
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,967
Вес репутации: 2596/91
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от besogon Посмотреть сообщение
Keil, ровно как и Iar использовал минимально и мне очень не понравилось.

А что понравилось?
DimaS вне форума   Ответить с цитированием
Старый 22.06.2020, 14:09   #21
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 34
Сообщений: 1,436
Вес репутации: 2632/87
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Наверное не понравилась IDE, я тут сам мелкое задание на днях в IAR делал, чуть не застрелился после VS Code.
Рак вне форума   Ответить с цитированием
Старый 22.06.2020, 16:00   #22
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,879
Вес репутации: 3760/106
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от Рак Посмотреть сообщение
Наверное не понравилась IDE, я тут сам мелкое задание на днях в IAR делал, чуть не застрелился после VS Code.
Ну это вечное "привык/не привык" ну или "вам курицу или рыбу".
В таких делах хорошо бы конкретные аргументы....

Про качество кода наслышан. Но... это субъективно во многом...
Опять таки код различен в разных версиях компилятора (среды).
Вот глюки оптимизатора - аргумент. Но непонятный.
Это вот отличие. Это стоит обсудить. Предметно!!!
А цвета или расположение окон или привычка... - это все пустое.
Petr вне форума   Ответить с цитированием
Старый 22.06.2020, 16:02   #23
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 34
Сообщений: 2,598
Вес репутации: 4677/102
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Рак
да, Вы правы - не понравилась среда. я не нашел как использовать поддержку vim синтаксиса, да и не факт что такое возможно малой кровью.
не понравилась поддержка подсветки синтаксиса. но это все было довольно давно - может быть сейчас всё сильно лучше.
да и установка keil с его всей фигней это головная боль, в то время как что у eclipse, что у netbeans, что у vscode поддержка linux из коробки.

DimaS
А что понравилось? - мне нравится eclipse, мне нравится netbeans, мне нравится neovim для мелких вещей. Из компиляторов Си мне нравится gcc.

Но код у Кейла лучше. - мне обычно не надо лучше. мне надо нормально.

Petr
Для оптимизации. Если сделать цикл - команд больше. - я не готов обсуждать оптимизацию bitbang по скорости исполнения. Марк может с особым трудом это обсуждать. Расскажет как это грамотно написать на asm, чтобы выжать максимум.

А что ИМЕННО не так с кодом? Есть наверно конкретные претензии? - мы сейчас обсуждаем функцию из заголовка? непонятно зачем такую функциональность нужно было запихивать в одну функцию, а не сделать несколько. непонятно где происходит синхронизация, хотя очевидно, что она есть. я негативно отношусь к этим Вашим long, short и.т.д. я люблю u8, s32, stdint и.т.д.

И в моей голове есть такое описание. - я видел уйму раз, когда люди не писали описание и в какой-то момент они использовали свои же функции неправильно, тк. в забывали что они делают.

Вы правы. Но я хочу писать ТАК чтобы работало при смене инструментов. - по факту в решениях, где была переносимость кода я использовал только gcc-основанные. у меня нет опыта, чтобы работало везде.

Что стало причиной "плохизны"? - я не говорил, что плохо - я сказал, что мне очень не понравилось. мне много что не нравится и я стараюсь этого избегать. и, что характерно, мне в основном удается.
besogon вне форума   Ответить с цитированием
Старый 22.06.2020, 16:16   #24
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 47
Сообщений: 1,967
Вес репутации: 2596/91
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от besogon Посмотреть сообщение
DimaS
А что понравилось? - мне нравится eclipse.

Ну, тогда продолжать бесполезно.
К сожалению, иногда приходится сидеть в XTime Composer для процессоров XMOS, а это Эклипс.
По сравнению с vim это конечно наивысшее достижение, но все равно пынгвынами воняет.
DimaS вне форума   Ответить с цитированием
Старый 22.06.2020, 16:20   #25
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,879
Вес репутации: 3760/106
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: IAR vs Keil и танцы с бубном вокруг уровня оптимизации

Цитата:
Сообщение от besogon Посмотреть сообщение
Petr
[А что ИМЕННО не так с кодом? Есть наверно конкретные претензии? - мы сейчас обсуждаем функцию из заголовка? непонятно зачем такую функциональность нужно было запихивать в одну функцию
Мы это не обсуждаем. Вы же не видите весь проект. Даже модуль.
А там тыщонка функций в этом только модуле наберется.
Что обсуждать то?

Цитата:
, а не сделать несколько. непонятно где происходит синхронизация, хотя очевидно, что она есть.
Не понял. Синхронизация чего? Ну пакеты разбираю и обратные вызовы
обрабатываю. О какой синхронизации речь?
О файлах?
Так там много всего...
Просто кусок с глюком... Причем очень тяжело выловленным.

Цитата:
я негативно отношусь к этим Вашим long, short и.т.д. я люблю u8, s32, stdint и.т.д.
А вот это важно.
Я давно размышляю об этом.
Многие любят такие определения. И из либ и сами такое пишут.
Я же пару раз сталкивался в глупыми ошибками когда переопределяли
тип с неправильной размерностью по сути и в названии (оно то любое).
Ну самое классическое - int
Одни определяют int как 8 бит (процессор такой) другие как 16 или 32
(у меня же процессор типа другой)
В итоге код то непереносим по сути.
Вот именно поэтому я ушел к определениям стандарта.
Где четко понятна размерность.
Хотя многие так не делают.
Вы почему любите u8, s32, stdint ? Я серьезно спрашиваю, важно.
Я не говорю что вы определите u8 как signed long
но я лично знаю таких писателей, кто так делает....

Вот ваш stdint это сколько бит??? И подо что?
Petr вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +3, время: 16:04.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot