-
- Всем привет, подниму тему. kuzulis(1697 знак., 18.10.2019 14:29)
- UPD: Попробовал Ваш фикс с асм-файлом - оно не работает для меня. Кажется, что добиться того-же (переместить начало кода на нужный адрес) можно было модифицировав файл-скрипл линкера lnk51ew_CY7C68013A.xcl: kuzulis(242 знак., 18.10.2019 15:01)
- да, с линкером это делать правильней, но я в настройках линкера не силён. sladkoejka(174 знак., 19.10.2019 23:43)
- У Keil и IAR на 8051 индейцы разные. Может в этом дело? - LightElf(18.10.2019 14:36 - 14:40)
- В смысле? - kuzulis(18.10.2019 15:02)
- usb_word_msb_get(pdesc), usb_word_lsb_get(pdesc) как реализованы для случая IAR и для случая Keil? Keil хранит многобайтовые переменные в Big-Endian формате, а IAR - в Little-Endian - LightElf(18.10.2019 17:39)
- Ахх, чЁрт, точно то ведь! Я же знал об этом, но что-то затупил.. Спасибо, тебе, мил человек, я попробую это проверить (респект тебе и уважуха, реально, от чистого сердца). :) - kuzulis(19.10.2019 10:59)
- Не, что-то не помогло и это. - kuzulis(21.10.2019 12:31)
- Ахх, чЁрт, точно то ведь! Я же знал об этом, но что-то затупил.. Спасибо, тебе, мил человек, я попробую это проверить (респект тебе и уважуха, реально, от чистого сердца). :) - kuzulis(19.10.2019 10:59)
- usb_word_msb_get(pdesc), usb_word_lsb_get(pdesc) как реализованы для случая IAR и для случая Keil? Keil хранит многобайтовые переменные в Big-Endian формате, а IAR - в Little-Endian - LightElf(18.10.2019 17:39)
- В смысле? - kuzulis(18.10.2019 15:02)
- UPD: Попробовал Ваш фикс с асм-файлом - оно не работает для меня. Кажется, что добиться того-же (переместить начало кода на нужный адрес) можно было модифицировав файл-скрипл линкера lnk51ew_CY7C68013A.xcl: kuzulis(242 знак., 18.10.2019 15:01)
- Ну так чо, вышел пак с исправлениями? На прошлый твой багрепорт они за 2 дня обернулись :) - Codavr(07.07.2018 11:06, ссылка)
- я к ним пока не обращался. Посмотрим что Cypress скажет, пока молчат. sladkoejka(239 знак., 07.07.2018 15:25)
- Тогда это баг не компилера, а процессора. В еррате ничего на эту тему? - Codavr(07.07.2018 15:30)
- это фича процессора. А у компиллера баг, т.к. он эту фичу не поддерживает. Хотя официально заявлена поддержка этого процессора. - sladkoejka(07.07.2018 16:18)
- Компилер код генерит корректный? За неделю уже бы можно было ассемблерный код глянуть. - Codavr(07.07.2018 16:22)
- за неделю можно было перечитать всю ветку и понять, что ассемблерный код давно изучен и причина локализована. - sladkoejka(07.07.2018 18:33)
- Итак, в каком месте генерятся неверные команды, и какие должны генериться. - Codavr(07.07.2018 18:37)
- проблема происходит при попадании кода в область адресов 0x00-0x55. В частности, судя по поведению, искажается содержимое ячейки с адресом 0x55 (соответствует младшему байту адреса autovector прерывания от IE4 [GPIF / FIFOs / INT4 Pin]) - sladkoejka(07.07.2018 19:08)
- Исче раз. Пох что и как искажается. Компилер какой код неверно генерит? Скажем должно быть MOV a,b а он генерит MOV a,c. Если такое есть, то виновен IAR, если нет, то он ни при делах. - Codavr(07.07.2018 19:22 - 19:28)
- компиллер должен генерить код за пределами таблицы векторов прерываний. А он генерит код прямо поверх таблицы. - sladkoejka(08.07.2018 00:29)
- Исче раз. Пох что и как искажается. Компилер какой код неверно генерит? Скажем должно быть MOV a,b а он генерит MOV a,c. Если такое есть, то виновен IAR, если нет, то он ни при делах. - Codavr(07.07.2018 19:22 - 19:28)
- проблема происходит при попадании кода в область адресов 0x00-0x55. В частности, судя по поведению, искажается содержимое ячейки с адресом 0x55 (соответствует младшему байту адреса autovector прерывания от IE4 [GPIF / FIFOs / INT4 Pin]) - sladkoejka(07.07.2018 19:08)
- Итак, в каком месте генерятся неверные команды, и какие должны генериться. - Codavr(07.07.2018 18:37)
- за неделю можно было перечитать всю ветку и понять, что ассемблерный код давно изучен и причина локализована. - sladkoejka(07.07.2018 18:33)
- Компилер код генерит корректный? За неделю уже бы можно было ассемблерный код глянуть. - Codavr(07.07.2018 16:22)
- это фича процессора. А у компиллера баг, т.к. он эту фичу не поддерживает. Хотя официально заявлена поддержка этого процессора. - sladkoejka(07.07.2018 16:18)
- Тогда это баг не компилера, а процессора. В еррате ничего на эту тему? - Codavr(07.07.2018 15:30)
- я к ним пока не обращался. Посмотрим что Cypress скажет, пока молчат. sladkoejka(239 знак., 07.07.2018 15:25)
- А что скажет уважаемый KEIL? - seryy(03.07.2018 15:16)
- Корректный код генерируется в обоих случаях Bill(2501 знак., 03.07.2018 08:04 - 08:12)
- Обнаружил интересное различие в коде который не работает и коде, который работает. Вот сам код примера: sladkoejka(2434 знак., 05.07.2018 13:49 - 14:00)
- Удивительно что он вообще такой добрый, ваш оптимизатор. Ну кто же счетчик в delay делает не volatile? - Petrovich(05.07.2018 13:57, )
- а зачем его volatile делать, если это локальная переменная и никто кроме локального кода её менять не может? sladkoejka(427 знак., 05.07.2018 14:06 - 14:11)
- без volatile оптимизатор без проблем может выкинут цикл - 0men(05.07.2018 14:36)
- Тело цикла компилятор выбрасывает не из-за volatile, а из-за того что он ничего не делает. Так все оптимизирующие компиляторы работают. Чтобы цикл не выбрасывался, в его теле явно прописано выполнение NOP. Именно для того чтобы цикл не sladkoejka(329 знак., 05.07.2018 14:45 - 14:50)
- Это Ваша гипотеза. Практика показывает, что некоторые компиляторы даже с nop выбрасывают цикл. Поэтому как сказали выше или volatile или встроенные intrinsic функции типа delay_cycles(size_t). И вообще это плохая практика, т.к. например, на разной Хитрый Китаец(55 знак., 09.07.2018 01:49)
- а вот это уже стрёмный компилятор, если выбрасывает полезный код. Можно пример - какие компиляторы занимаются подобным вредительством? - sladkoejka(10.07.2018 09:47)
- Вопрос в критериях полезности. Видимо, Вы не смогли донести до компилятора свои критерии или в коде есть другая ошибка. VLLV(150 знак., 10.07.2018 10:08)
- Ну так покажите ошибку в коде, тут всего 21 строка, но код зависает: sladkoejka(624 знак., 14.07.2018 15:54)
- Код, скомпилированный чем-то другим, работает? - VLLV(16.07.2018 10:29)
- да, код скомпилированный в SDCC и в Keil, работает без проблем. Хотя... в SDCC вроде какая-то другая проблема была - уже не помню, но код работал. - sladkoejka(17.07.2018 00:29 - 00:32)
- Не знаю зачем, но в компиляторе XC16 от Микрочипа предусмотрен квалификатор volatile даже для ассемблерной вставки. Nikolay_Po(119 знак., 16.07.2018 10:08 - 10:14)
- Код, скомпилированный чем-то другим, работает? - VLLV(16.07.2018 10:29)
- Ну так покажите ошибку в коде, тут всего 21 строка, но код зависает: sladkoejka(624 знак., 14.07.2018 15:54)
- Вопрос в критериях полезности. Видимо, Вы не смогли донести до компилятора свои критерии или в коде есть другая ошибка. VLLV(150 знак., 10.07.2018 10:08)
- а вот это уже стрёмный компилятор, если выбрасывает полезный код. Можно пример - какие компиляторы занимаются подобным вредительством? - sladkoejka(10.07.2018 09:47)
- ну как ничего не делает )) он декрементирует константу. volatile более правильно - 0men(05.07.2018 14:47)
- volatile в данном случае бесполезен, т.к. к переменная локальная и никто её изменить не может. Volatile говорит компилятору что переменная может измениться и при её использовании нужно всегда перечитывать, а не использовать закешированное в sladkoejka(20 знак., 05.07.2018 14:52)
- Ну ты всё правильно типа написал, только забыл сделать правильные практические выводы из собственного знания :-)) - =AlexD=(05.07.2018 15:00)
- volatile говорит компилятору, что эта переменная может измениться в любой момент и код с ее участием не следует оптимизировать. Кеширование тут ни при чем вообще. - 0men(05.07.2018 14:55)
- И при другом уровне или профиле оптимизации подобранная задержка для delay бывает летит к чертям :) - Petrovich(05.07.2018 15:00, )
- volatile предназначена исключительно для того, чтобы компилятор не кэшировал значение этой переменной в регистрах, а каждый раз вычитывал её значение. Другого смысла у volatile нет. Все эти попытки использовать volatile для циклов - это от sladkoejka(183 знак., 05.07.2018 15:14)
- )) ну ну - 0men(05.07.2018 15:16)
- volatile предназначена исключительно для того, чтобы компилятор не кэшировал значение этой переменной в регистрах, а каждый раз вычитывал её значение. Другого смысла у volatile нет. Все эти попытки использовать volatile для циклов - это от sladkoejka(183 знак., 05.07.2018 15:14)
- И при другом уровне или профиле оптимизации подобранная задержка для delay бывает летит к чертям :) - Petrovich(05.07.2018 15:00, )
- volatile в данном случае бесполезен, т.к. к переменная локальная и никто её изменить не может. Volatile говорит компилятору что переменная может измениться и при её использовании нужно всегда перечитывать, а не использовать закешированное в sladkoejka(20 знак., 05.07.2018 14:52)
- Это Ваша гипотеза. Практика показывает, что некоторые компиляторы даже с nop выбрасывают цикл. Поэтому как сказали выше или volatile или встроенные intrinsic функции типа delay_cycles(size_t). И вообще это плохая практика, т.к. например, на разной Хитрый Китаец(55 знак., 09.07.2018 01:49)
- Тело цикла компилятор выбрасывает не из-за volatile, а из-за того что он ничего не делает. Так все оптимизирующие компиляторы работают. Чтобы цикл не выбрасывался, в его теле явно прописано выполнение NOP. Именно для того чтобы цикл не sladkoejka(329 знак., 05.07.2018 14:45 - 14:50)
- Volatile более сложный объект, чем кажется. Впрочем, большинство здешних обитателей его освоило - Petrovich(05.07.2018 14:15, )
- в чём сложность? Кстати, проверил под симулятором. Оба варианта (с INC R6 и без него) работают одинаково и дают абсолютно одинаковую задержку. Что с volatile, что без. Но с volatile задержка в 2.28 раза больше. При этом вариант, где код начинается sladkoejka(79 знак., 05.07.2018 14:42)
- Вот по этоой статье учились поколения :) Petrovich(58 знак., 05.07.2018 14:50, )
- Ничего нового в этой статье нет. Насчет использования volatile в циклах - это очень неудачный совет. Лучше использовать какое-либо полезное действие в теле цикла (например NOP). И вот почему. sladkoejka(1041 знак., 05.07.2018 15:02 - 15:06)
- Сравнивайте Bill(3498 знак., 05.07.2018 16:24)
- Что сравнивать? В вашем примере ошибка - вы закоментили вызов __no_operation(). Без этого вызова цикл должен быть удалён. То, что с volatile не удаляет - это результат плохой оптимизации. Мозгов у компилятора не хватает чтобы отследить, что sladkoejka(667 знак., 05.07.2018 17:19)
- Я не о зависаниях. Я - о недостаточной "сообразительности" компилятора. - Bill(05.07.2018 18:04)
- "То, что с volatile не удаляет - это результат плохой оптимизации" 0men(471 знак., 05.07.2018 17:36)
- Прочитайте вашу цитату из стандарта внимательнее. В ней речь идёт об "объекте, который может быть модифицирован". В случае-же с локальной переменной volatile, никто её модифицировать не может, время её жизни ограничено временем выполнения функции. sladkoejka(420 знак., 05.07.2018 18:09 - 18:13)
- Вы не до конца перевели фразу. 0men(320 знак., 05.07.2018 18:21)
- Тут не фантазия, а логика. Если код ничего не делает и ни на что не влияет, то его можно удалять и никакие volatile в этом коде этому не помеха. В стандарте речь идёт о случаях, когда такое удаление может повлиять на наблюдаемое поведение. - sladkoejka(05.07.2018 18:36)
- не надо собственной ущербной логикой заменять строгие требования стандарта :-)) - =AlexD=(06.07.2018 08:10)
- поциент слился - SciFi(06.07.2018 08:47, ссылка, ссылка)
- Я не вижу смысла с вами спорить. Насчёт volatile указателей пример я вам привел. Продублирую и тут: sladkoejka(887 знак., 06.07.2018 15:07 - 15:15)
- Кстати у тебя скорй всего компилятор ещё та паделка: fk0(571 знак., 07.07.2018 00:11)
- Замени на extern volatile int x и сразу оптимизация пропадёт. - fk0(07.07.2018 00:09)
- обдурить оптимизатор можно, т.к. он не все случаи анализирует, но от этого код не становится оптимальным... - sladkoejka(07.07.2018 10:59)
- Keil C 8051: Bhg2(1600 знак., 06.07.2018 15:18)
- Я не вижу смысла с вами спорить. Насчёт volatile указателей пример я вам привел. Продублирую и тут: sladkoejka(887 знак., 06.07.2018 15:07 - 15:15)
- поциент слился - SciFi(06.07.2018 08:47, ссылка, ссылка)
- весь смысл volatile в указании невозможности для компилятора определить, могут затрагивающие эту переменную оптимизации повлиять на поведение или не могут. - AlexG(05.07.2018 19:00)
- не надо собственной ущербной логикой заменять строгие требования стандарта :-)) - =AlexD=(06.07.2018 08:10)
- Тут не фантазия, а логика. Если код ничего не делает и ни на что не влияет, то его можно удалять и никакие volatile в этом коде этому не помеха. В стандарте речь идёт о случаях, когда такое удаление может повлиять на наблюдаемое поведение. - sladkoejka(05.07.2018 18:36)
- Это фантазии, ничего подобного там не написано. Вы что-то прочитали между строк? - SciFi(05.07.2018 18:11)
- это не фантазии, а то что написано в стандарте. Читайте внимательнее, вы видите "may be modified in ways unknown to the implementation or have other unknown side effects"? Локальная переменная ограничена областью видимости по стандарту и никому sladkoejka(248 знак., 05.07.2018 18:23)
- Тогда было бы написано так: "An object that has volatile-qualified type may be modified in ways unknown to the implementation or have other unknown side effects. When that is the case, any expression referring to such an object shall be SciFi(131 знак., 05.07.2018 18:27)
- Тем не менее, компиляторы удаляют код volatile указателей на не volatile данные, которые были удалены оптимизатором. И такое поведение признано соответствующим стандарту. Однако в вашей интерпретации такое удаление недопустимо, т.к. указатель sladkoejka(24 знак., 05.07.2018 18:50)
- Ссылку в студию. Если от объекта берётся адрес, и он реально используется, не надо удалять такой объект. - SciFi(05.07.2018 19:41)
- Вам лень открыть компилятор и попробовать? Почему я должен это делать за вас? sladkoejka(121 знак., 06.07.2018 15:03)
- Нещитово. Приведение к типу volatile - это совсем не создание объекта типа volatile. Попробуйте так: int x = 123; int *volatile y = &x; y = y; - SciFi(06.07.2018 15:11)
- Попробовал - результат тот-же самый, компилятор полностью удаляет код, вместе с объектом указателя, помеченного как volatile. См. скриншот. Дальнейшие изыскания предлагаю проводить самостоятельно. sladkoejka(06.07.2018 15:21)
- Вы попробовали не тот код, который я написал. Зачем так делать? Ну и, согласно информации по ссылке, это таки вражеский компилятор. SciFi(726 знак., 06.07.2018 15:36, ссылка)
- В вашем примере происходит модификация данных помеченных как volatile. Компилятор в этом случае не может быть уверен, что эту модификацию данных никто не увидит и она ни на что не повлияет. Поэтому код удалять не будет. sladkoejka(06.07.2018 15:48 - 15:53)
- Как пример, чтение внешней памяти может использоваться для сброса сторожа - замешивается на дешифраторе адрес и строб RD, а с выхода получаем сигнал сброса. Если указатель на volatile, то компилятор не должен оптимизировать обращение. Хотя Vit(261 знак., 06.07.2018 16:24)
- тут тоже согласен, для контроллеров это критично, поэтому даже чтение через volatile указатель удалять не стоит. Однако если volatile помечена локальная переменная, не являющаяся указателем, то её можно удалять. Т.к. хранится локальная переменная sladkoejka(95 знак., 06.07.2018 18:14)
- тут тоже согласен, для контроллеров это критично, поэтому даже чтение через volatile указатель удалять не стоит. Однако если volatile помечена локальная переменная, не являющаяся указателем, то её можно удалять. Т.к. хранится локальная переменная sladkoejka(95 знак., 06.07.2018 18:14)
- Дык в этом весь смысл и есть - отключается оптимизация обращения к данным помеченным как volatile, если же к ним обращения нет, то код вполне может выпиливаться. - =AlexD=(06.07.2018 16:01)
- Как пример, чтение внешней памяти может использоваться для сброса сторожа - замешивается на дешифраторе адрес и строб RD, а с выхода получаем сигнал сброса. Если указатель на volatile, то компилятор не должен оптимизировать обращение. Хотя Vit(261 знак., 06.07.2018 16:24)
- В вашем примере происходит модификация данных помеченных как volatile. Компилятор в этом случае не может быть уверен, что эту модификацию данных никто не увидит и она ни на что не повлияет. Поэтому код удалять не будет. sladkoejka(06.07.2018 15:48 - 15:53)
- Вот в другом компиляторе ничего не удаляется даже в вашем первом примере Bhg2(31 знак., 06.07.2018 15:26, ссылка)
- все компиляторы не обязаны производить максимальную оптимизацию. Каждый оптимизирует по своему. Но компилятор имеет полное право удалять такой код при оптимизации. Это соответствует стандарту. - sladkoejka(06.07.2018 15:28)
- Кстати, еще есть небольшое уточнение : Bhg2(345 знак., 06.07.2018 16:04)
- volatile указатель - это для компилятора данные. Инициализация такого указателя требует модификации данных. А если указатель помечен как volatile, то компилятор ограничен в выводах может ли такая модификация на чтото повлиять или не может. Поэтому sladkoejka(430 знак., 06.07.2018 16:30)
- С точки зрения даже абстрактной машины, локальная переменная - это переменная в памяти, а не в регистре. Нет никаких таких регистров в языке Си. А volatile обозначает именно внешние побочные эффекты в памяти. Всё, финита. Никакие =AlexD=(76 знак., 06.07.2018 16:46)
- В порядке уточнения. Переменные могут быть размещены в регистрах, для этого существует специальный квалификатор класса памяти - register. Только по-моему, современные компиляторы его игнорируют. Или нет? - Bill(06.07.2018 18:20)
- это просто рекомендация компилятору хранить переменную в регистре. Компилятор может её не придерживаться. - sladkoejka(06.07.2018 18:29)
- Соглашусь, но это действительно только при условии, что код модифицирует данные данные через volatile указатель. Через указатель можно изменить любую ячейку памяти, которая доступна другому коду. А если не модифицирует, то на данные никак не sladkoejka(40 знак., 06.07.2018 18:03 - 18:11)
- В порядке уточнения. Переменные могут быть размещены в регистрах, для этого существует специальный квалификатор класса памяти - register. Только по-моему, современные компиляторы его игнорируют. Или нет? - Bill(06.07.2018 18:20)
- С точки зрения даже абстрактной машины, локальная переменная - это переменная в памяти, а не в регистре. Нет никаких таких регистров в языке Си. А volatile обозначает именно внешние побочные эффекты в памяти. Всё, финита. Никакие =AlexD=(76 знак., 06.07.2018 16:46)
- volatile указатель - это для компилятора данные. Инициализация такого указателя требует модификации данных. А если указатель помечен как volatile, то компилятор ограничен в выводах может ли такая модификация на чтото повлиять или не может. Поэтому sladkoejka(430 знак., 06.07.2018 16:30)
- Строго говоря, цитате из стандарта не соответствует. SciFi подметил верно. Но здравому смыслу соответствует. Я за такую оптимизацию. Но тут нужно быть осторожным, это отступление от буквы стандарта. Огромное спасибо за примеры! - Nikolay_Po(06.07.2018 15:33)
- А в чём собственно несоответствие? Я считаю все соответствует. В цитате оговаривается случай, когда переменная может быть кем-то модифицирована и это может привести к изменению наблюдаемого поведения. В данном-же случае, даже если ктото изменит sladkoejka(39 знак., 06.07.2018 15:41)
- Согласен, что в стандарте слишком кратко сказано. Тема приведения к volatile не раскрыта. Есть, однако ещё один официальный документ "обоснование", там эта тема затрагивается, и яр нарушает то, что там написано. Впрочем, они могут притвориться SciFi(67 знак., 06.07.2018 16:12, ссылка)
- Здесь Nikolay_Po(217 знак., 06.07.2018 15:55)
- А в чём собственно несоответствие? Я считаю все соответствует. В цитате оговаривается случай, когда переменная может быть кем-то модифицирована и это может привести к изменению наблюдаемого поведения. В данном-же случае, даже если ктото изменит sladkoejka(39 знак., 06.07.2018 15:41)
- Кстати, еще есть небольшое уточнение : Bhg2(345 знак., 06.07.2018 16:04)
- все компиляторы не обязаны производить максимальную оптимизацию. Каждый оптимизирует по своему. Но компилятор имеет полное право удалять такой код при оптимизации. Это соответствует стандарту. - sladkoejka(06.07.2018 15:28)
- Вы попробовали не тот код, который я написал. Зачем так делать? Ну и, согласно информации по ссылке, это таки вражеский компилятор. SciFi(726 знак., 06.07.2018 15:36, ссылка)
- Попробовал - результат тот-же самый, компилятор полностью удаляет код, вместе с объектом указателя, помеченного как volatile. См. скриншот. Дальнейшие изыскания предлагаю проводить самостоятельно. sladkoejka(06.07.2018 15:21)
- Нещитово. Приведение к типу volatile - это совсем не создание объекта типа volatile. Попробуйте так: int x = 123; int *volatile y = &x; y = y; - SciFi(06.07.2018 15:11)
- Вам лень открыть компилятор и попробовать? Почему я должен это делать за вас? sladkoejka(121 знак., 06.07.2018 15:03)
- Ссылку в студию. Если от объекта берётся адрес, и он реально используется, не надо удалять такой объект. - SciFi(05.07.2018 19:41)
- Тем не менее, компиляторы удаляют код volatile указателей на не volatile данные, которые были удалены оптимизатором. И такое поведение признано соответствующим стандарту. Однако в вашей интерпретации такое удаление недопустимо, т.к. указатель sladkoejka(24 знак., 05.07.2018 18:50)
- читайте до конца - или иметь другие неизвестные побочные эффекты - 0men(05.07.2018 18:25)
- локальная переменная доступна только внутри тела функции и только на время её выполнения. Если эта функция ничего не делает и никак не влияет на данные доступные другому коду, её можно спокойно удалять вместе со всеми volatile локальными sladkoejka(174 знак., 05.07.2018 18:32)
- фраза про побочные эффекты означает, что разработчик лучше знает, что делать компилятору. Компилятору нужно ничего не трогать. Стандарт об этом прямо говорит. Все ваши разделение на локальные и глобальные это только ваши фантазии, в стандарте 0men(22 знак., 05.07.2018 18:46)
- не нужно ничего выдумывать. Логика стандарта проста. Если объект никому не доступен, его можно удалять для оптимизации, т.к. это никак не повлияет на поведение системы. volatile действует только на данные, которые могут быть кому-то потенциально sladkoejka(65 знак., 05.07.2018 18:56)
- Это ты просто рафинированный программист, который тупо смотрит на код, и делает какие-то свои выводы, исходя из абстрактной вычислительной системы в вакууме. В реальной жизни у микропроцессора есть всякие там шины памяти, кеши, ПДП и пр. вещи, =AlexD=(486 знак., 06.07.2018 08:23 - 08:48)
- Строго говоря, компилятор действует в рамках абстрактной вычислительной машины. Для него важно чтобы наблюдаемое поведение соответствовало указанному в программе. Эффективность кэширования его не волнует. Конечно при условии, что это не повлияет sladkoejka(67 знак., 06.07.2018 16:04)
- бред, ты вообще не понял что тебе говорят. Если компилер будет выкидывать volatile, то половина тестов железа просто перестанут работать. Этого никто не допустит ни в теории, ни на практике. - =AlexD=(06.07.2018 16:37 - 16:40)
- тест, у которого результат не зависит от того что он делает никому нафик не нужен. Такой тест можно смело удалять. А если результат есть и зависит от удаления переменной, то такая переменная оптимизации не подлежит. - sladkoejka(06.07.2018 18:37 - 18:39)
- Пффффррр, мля, ну ты даёшь. Да почти все тесты измеряют ВРЕМЯ, и им вообще не нужен никакой результат :-))) , либо результат с точки зрения ЯЗЫКА бессмысленен, например проверка памяти через запись-чтение. - =AlexD=(16.07.2018 10:28)
- тест, у которого результат не зависит от того что он делает никому нафик не нужен. Такой тест можно смело удалять. А если результат есть и зависит от удаления переменной, то такая переменная оптимизации не подлежит. - sladkoejka(06.07.2018 18:37 - 18:39)
- бред, ты вообще не понял что тебе говорят. Если компилер будет выкидывать volatile, то половина тестов железа просто перестанут работать. Этого никто не допустит ни в теории, ни на практике. - =AlexD=(06.07.2018 16:37 - 16:40)
- Строго говоря, компилятор действует в рамках абстрактной вычислительной машины. Для него важно чтобы наблюдаемое поведение соответствовало указанному в программе. Эффективность кэширования его не волнует. Конечно при условии, что это не повлияет sladkoejka(67 знак., 06.07.2018 16:04)
- А чё спорить-то, сделайте иначе бомж(178 знак., 05.07.2018 22:49)
- Ну да, конечно, восьмой gcc: fk0(64 знак., 06.07.2018 09:03)
- :-))) - SciFi(06.07.2018 09:59)
- гениально :) - sladkoejka(06.07.2018 03:08)
- Ну да, конечно, восьмой gcc: fk0(64 знак., 06.07.2018 09:03)
- Интересное вышло обсуждение. Ранее не задумывался, но мне близка позиция Сладкоежки. Эффект от исполнения кода наступает лишь в двух случаях: Nikolay_Po(1136 знак., 05.07.2018 22:11)
- Не надо ничего выдумывать. Читайте текст стандарта. Компиляторостроители читают именно его. - SciFi(05.07.2018 22:13)
- логика стандарта совсем иная - если переменная имеет квалификатор volatile, то действия с этой переменной не подлежат оптимизации и должны быть представлены кодом как есть. Ни каких слов про доступнай, область видимости и жизни в стандарте нет - 0men(05.07.2018 19:00)
- Это ты просто рафинированный программист, который тупо смотрит на код, и делает какие-то свои выводы, исходя из абстрактной вычислительной системы в вакууме. В реальной жизни у микропроцессора есть всякие там шины памяти, кеши, ПДП и пр. вещи, =AlexD=(486 знак., 06.07.2018 08:23 - 08:48)
- не нужно ничего выдумывать. Логика стандарта проста. Если объект никому не доступен, его можно удалять для оптимизации, т.к. это никак не повлияет на поведение системы. volatile действует только на данные, которые могут быть кому-то потенциально sladkoejka(65 знак., 05.07.2018 18:56)
- фраза про побочные эффекты означает, что разработчик лучше знает, что делать компилятору. Компилятору нужно ничего не трогать. Стандарт об этом прямо говорит. Все ваши разделение на локальные и глобальные это только ваши фантазии, в стандарте 0men(22 знак., 05.07.2018 18:46)
- локальная переменная доступна только внутри тела функции и только на время её выполнения. Если эта функция ничего не делает и никак не влияет на данные доступные другому коду, её можно спокойно удалять вместе со всеми volatile локальными sladkoejka(174 знак., 05.07.2018 18:32)
- Тогда было бы написано так: "An object that has volatile-qualified type may be modified in ways unknown to the implementation or have other unknown side effects. When that is the case, any expression referring to such an object shall be SciFi(131 знак., 05.07.2018 18:27)
- это не фантазии, а то что написано в стандарте. Читайте внимательнее, вы видите "may be modified in ways unknown to the implementation or have other unknown side effects"? Локальная переменная ограничена областью видимости по стандарту и никому sladkoejka(248 знак., 05.07.2018 18:23)
- Вы не до конца перевели фразу. 0men(320 знак., 05.07.2018 18:21)
- Прочитайте вашу цитату из стандарта внимательнее. В ней речь идёт об "объекте, который может быть модифицирован". В случае-же с локальной переменной volatile, никто её модифицировать не может, время её жизни ограничено временем выполнения функции. sladkoejka(420 знак., 05.07.2018 18:09 - 18:13)
- Что сравнивать? В вашем примере ошибка - вы закоментили вызов __no_operation(). Без этого вызова цикл должен быть удалён. То, что с volatile не удаляет - это результат плохой оптимизации. Мозгов у компилятора не хватает чтобы отследить, что sladkoejka(667 знак., 05.07.2018 17:19)
- компилятор НИКОГДА не удалит цикл с volatile переменной. Более того, он никогда не соптимизирует такой цикл - 0men(05.07.2018 15:18)
- Ну уж нет. Если он удалит переменную volatile, то это будет вражеский компилятор (хотя всякие бывают, конечно). Но тут __no_operation() убирает необходимость в volatile, потому что __no_operation() "вызывает побочные эффекты", т.е. не может быть SciFi(72 знак., 05.07.2018 15:06)
- "Сделает" для delay - это оставит время выполнения похожим независимо от оптимизации. А без volatile декремент переменной цикла delay может быть выполнен кучей разных способов(и за разное время) при какой-нибудь галочке типа cross call Petrovich(14 знак., 05.07.2018 15:42, )
- ничего вражеского нет, в достаточно умных оптимизаторах такие вещи в порядке вещей. Если тело цикла пустое, а volatile переменную гарантированно никто не видит (нет возможности получить ссылку), то такой цикл можно спокойно удалять. Пользы от него sladkoejka(223 знак., 05.07.2018 15:19 - 15:22)
- На современном gcc не воспроизводимо. - fk0(06.07.2018 09:07)
- фантазёр - =AlexD=(06.07.2018 08:07)
- пример в студию - 0men(05.07.2018 15:19)
- Сравнивайте Bill(3498 знак., 05.07.2018 16:24)
- Ничего нового в этой статье нет. Насчет использования volatile в циклах - это очень неудачный совет. Лучше использовать какое-либо полезное действие в теле цикла (например NOP). И вот почему. sladkoejka(1041 знак., 05.07.2018 15:02 - 15:06)
- Вот по этоой статье учились поколения :) Petrovich(58 знак., 05.07.2018 14:50, )
- в чём сложность? Кстати, проверил под симулятором. Оба варианта (с INC R6 и без него) работают одинаково и дают абсолютно одинаковую задержку. Что с volatile, что без. Но с volatile задержка в 2.28 раза больше. При этом вариант, где код начинается sladkoejka(79 знак., 05.07.2018 14:42)
- без volatile оптимизатор без проблем может выкинут цикл - 0men(05.07.2018 14:36)
- а зачем его volatile делать, если это локальная переменная и никто кроме локального кода её менять не может? sladkoejka(427 знак., 05.07.2018 14:06 - 14:11)
- while( n-- > 0 )!!! тоже самое, но без мутотени... while(n--) - seryy(05.07.2018 13:56)
- это не принципиально, просто по привычке из другого языка, где более жесткая типизация, прописываю все условия явно... - sladkoejka(05.07.2018 14:08)
- Это я про дизайн текста. Так когда качнёте кэйл и закроем тему? - seryy(05.07.2018 14:11)
- текст подгонялся таким образом, чтобы при простом коде воспроизвести проблему. sladkoejka(62 знак., 05.07.2018 14:19)
- Таблетку предоставлю. - seryy(05.07.2018 14:21)
- текст подгонялся таким образом, чтобы при простом коде воспроизвести проблему. sladkoejka(62 знак., 05.07.2018 14:19)
- Это я про дизайн текста. Так когда качнёте кэйл и закроем тему? - seryy(05.07.2018 14:11)
- это не принципиально, просто по привычке из другого языка, где более жесткая типизация, прописываю все условия явно... - sladkoejka(05.07.2018 14:08)
- Удивительно что он вообще такой добрый, ваш оптимизатор. Ну кто же счетчик в delay делает не volatile? - Petrovich(05.07.2018 13:57, )
- только размещается этот "корректный код" по некорректным адерсам (в таблицу векторов). Вследствии чего при заливке в реальный девайс такой "корректный код" глючит или вообще не работает. (как повезет, если LJMP неудачно ляжет в таблицу векторов, sladkoejka(24 знак., 03.07.2018 10:10)
- Обнаружил интересное различие в коде который не работает и коде, который работает. Вот сам код примера: sladkoejka(2434 знак., 05.07.2018 13:49 - 14:00)
- В начале 2000-х я нашел баг в ихнем компилере. Настрочил багрепорт, Codavr(188 знак., 30.06.2018 16:31 - 01.07.2018 13:19)
- В середине 2000-х находил баг в IAR MSP430 при работе с банальными битовыми операциями. sladkoejka(170 знак., 01.07.2018 00:31)
- Везет тебе на баги. Может ты где-нить на форумах описывал это свое похождение, а то на сахаре ты человек новый, а тут публика пасется уже не первый десяток лет но никто пока не делился такой бедой. А сказки для детей и юношества я разлюбил лет 40 Codavr(11 знак., 01.07.2018 13:15 - 13:18)
- был я на форуме тогда и отписывался об этом, только форум тогда вроде не так назывался. sladkoejka(89 знак., 01.07.2018 19:44)
- Ну ты сравнил жопу с пальцем - это интернет так же назывался, а Сахара к телесиськам никакого отношения никогда не имела, и никогда так же позорно не выглядела - MBedder(01.07.2018 19:47)
- лукавишь же.... когда форум телесистем окончательно задолбал своими постоянными падениями, пропаданием сообщений и пр. генерал сделал тут форум по образу и подобию точно такой же, но типа лишь как запасной вариант, на время неработы телесистем. jaga-jaga(141 знак., 01.07.2018 23:37, ссылка)
- было время, когда они существовали одновременно. Но ТАМ стали всех подряд банить и народ постепенно перебирался сюда. Ну по крайней мере я на сахаре появился именно так. :-) - Лагунов(03.07.2018 08:38)
- А кто, кроме меня, ещё "нашёл" форум телесистем по третьей книге Бориса Горбунова? mut(149 знак., 02.07.2018 08:28 - 21:19, ссылка)
- Это в честь его названа Горбушка? - Крок(02.07.2018 22:08)
- ну звиняйте, я не в курсе. А чего форум на телесистемах закрыли? - sladkoejka(01.07.2018 20:54)
- Его не закрыли, он просто вконец опаскудился благодаря усилиям тамошних клоунов и абсолютному похуизму владельцев. Сайт мигрировал --> - MBedder(01.07.2018 21:56, ссылка)
- Да, активность там зашибительская - 1 сообщение в месяц. - Evgeny_CD(02.07.2018 18:49)
- Кого пытаетесь обмануть? Телесиськи умерли из-за идиота цензора, который банил налево и направо без разбора. Следующий идиот умудрился убить архив страниц. Это был далеко не первый форум, который умер после введения регистации. Когда-нибудь Экспериментатор(70 знак., 02.07.2018 18:46, )
ГенералПутин? Я согласен с Mbedder'ом - пофигизм и клоунство. Здесь тоже было непросто. - VLLV(02.07.2018 18:58)- В одной деревне когда-то жили шестеро слепых. Как-то они услышали: «Эй, к нам пришёл слон!» Слепые не имели ни малейшего представления о том, что такое слон, и как он может выглядеть. Они решили: «Раз мы не можем его увидеть, мы пойдём и хотя бы Экспериментатор(1080 знак., 02.07.2018 19:07, )
- мудрая притча - VLLV(02.07.2018 20:19)
- Как сказать много и ничего по существу, даже пол животного мудрец не определил :) - mut(02.07.2018 21:14)
- мудрая притча - VLLV(02.07.2018 20:19)
- В одной деревне когда-то жили шестеро слепых. Как-то они услышали: «Эй, к нам пришёл слон!» Слепые не имели ни малейшего представления о том, что такое слон, и как он может выглядеть. Они решили: «Раз мы не можем его увидеть, мы пойдём и хотя бы Экспериментатор(1080 знак., 02.07.2018 19:07, )
- Его не закрыли, он просто вконец опаскудился благодаря усилиям тамошних клоунов и абсолютному похуизму владельцев. Сайт мигрировал --> - MBedder(01.07.2018 21:56, ссылка)
- лукавишь же.... когда форум телесистем окончательно задолбал своими постоянными падениями, пропаданием сообщений и пр. генерал сделал тут форум по образу и подобию точно такой же, но типа лишь как запасной вариант, на время неработы телесистем. jaga-jaga(141 знак., 01.07.2018 23:37, ссылка)
- Ну ты сравнил жопу с пальцем - это интернет так же назывался, а Сахара к телесиськам никакого отношения никогда не имела, и никогда так же позорно не выглядела - MBedder(01.07.2018 19:47)
- был я на форуме тогда и отписывался об этом, только форум тогда вроде не так назывался. sladkoejka(89 знак., 01.07.2018 19:44)
- Везет тебе на баги. Может ты где-нить на форумах описывал это свое похождение, а то на сахаре ты человек новый, а тут публика пасется уже не первый десяток лет но никто пока не делился такой бедой. А сказки для детей и юношества я разлюбил лет 40 Codavr(11 знак., 01.07.2018 13:15 - 13:18)
- Обычно так и бывает, но недавно я сталкивался с глюком, который по условиям проявления и по способу устранения выглядит полным бредом, но, т.к. в ассемблер разбираться я не полез, воздержусь от обвинений IAR. - AlexG(30.06.2018 16:45)
- все-же непонятно, как заставить компилятор класть код начиная с адреса 0x69, а не в таблицу векторов? sladkoejka(176 знак., 01.07.2018 00:38)
- Правьте linker configuraion file (.icf). Через него можно можно легко разметить память МК. - evgeniy1294(02.07.2018 15:24)
- насколько понимаю, у IAR EW 8051 нет icf файлов. Вместо них i51 файлы. sladkoejka(2159 знак., 02.07.2018 18:05 - 18:36)
- Не нужно ничего на асм задавать, все на Си прекрасно работает. Bill(154 знак., 03.07.2018 07:39)
- это то, с чего я начал. Такой обработчик работает. Однако чтобы код заработал, нужно на асме вручную прописать вектора. Иначе код попадает в таблицу векторов и на реальном девайсе не работает. sladkoejka(779 знак., 03.07.2018 10:14 - 10:27)
- Все правильно. Одно из двух: либо вы используете Си, либо используете ассемблер. Вопрос: какой формат выходного кода используется в опциях линкера? У нас код не работал, когда был задан формат intel-extended. Всё заработало после замены на Bill(16 знак., 03.07.2018 10:50)
- Вы для Cypress CY7C68013A код собираете? Попробуйте скомпилить на си код в IAR под этот процессор, так чтобы он работал на реальном железе, тогда поймёте в чём проблема. sladkoejka(323 знак., 03.07.2018 10:58 - 11:01)
- Контроллер - 1882ВЕ53У. Хотя большой разницы быть не должно. Архитектура-то одна и та же. Или нет? - Bill(03.07.2018 11:02)
- Ваш контроллер использует autovector? Это когда в LJMP инструкции расположенной в таблице векторов стоит адрес новой таблицы векторов, а процессор подменяет младший байт под соответствующий суб-вектор. Т.е. когда приходит прерывание от USB, в LJMP sladkoejka(82 знак., 03.07.2018 11:07 - 11:10)
- Вообще-то, примеры примеры были сделаны для вашего контроллера. Bill(25833 знак., 03.07.2018 11:17)
- Во первых ваш пример ничего не делает, поэтому понять работает он или нет на железе нет возможности. Во вторых (читать внутри)... sladkoejka(1324 знак., 03.07.2018 11:45 - 11:51)
- Вообще-то, примеры примеры были сделаны для вашего контроллера. Bill(25833 знак., 03.07.2018 11:17)
- Ваш контроллер использует autovector? Это когда в LJMP инструкции расположенной в таблице векторов стоит адрес новой таблицы векторов, а процессор подменяет младший байт под соответствующий суб-вектор. Т.е. когда приходит прерывание от USB, в LJMP sladkoejka(82 знак., 03.07.2018 11:07 - 11:10)
- Контроллер - 1882ВЕ53У. Хотя большой разницы быть не должно. Архитектура-то одна и та же. Или нет? - Bill(03.07.2018 11:02)
- Вы для Cypress CY7C68013A код собираете? Попробуйте скомпилить на си код в IAR под этот процессор, так чтобы он работал на реальном железе, тогда поймёте в чём проблема. sladkoejka(323 знак., 03.07.2018 10:58 - 11:01)
- Вы точно уверены, что вам нужен компилятор, а не более простой транслятор?! :) - mut(03.07.2018 10:16)
- Все правильно. Одно из двух: либо вы используете Си, либо используете ассемблер. Вопрос: какой формат выходного кода используется в опциях линкера? У нас код не работал, когда был задан формат intel-extended. Всё заработало после замены на Bill(16 знак., 03.07.2018 10:50)
- это то, с чего я начал. Такой обработчик работает. Однако чтобы код заработал, нужно на асме вручную прописать вектора. Иначе код попадает в таблицу векторов и на реальном девайсе не работает. sladkoejka(779 знак., 03.07.2018 10:14 - 10:27)
- У вас какой тип проекта: Debug или Release? - Bill(02.07.2018 19:36)
- и тот и другой. Разницы в коде там особо нет (сравнивал по инструкциям). В чип заливаю код от release. - sladkoejka(02.07.2018 19:49)
- Не нужно ничего на асм задавать, все на Си прекрасно работает. Bill(154 знак., 03.07.2018 07:39)
- насколько понимаю, у IAR EW 8051 нет icf файлов. Вместо них i51 файлы. sladkoejka(2159 знак., 02.07.2018 18:05 - 18:36)
- Дык там стартапа асмовского в проект не добавляется что ле? В нем обычно все вектора и резервируется - Petrovich(02.07.2018 09:43, )
- добавляется, но походу в нём нет векторов, только вектор сброса. Вот посмотрел в исходнике: sladkoejka(1151 знак., 02.07.2018 10:58 - 11:30)
- И что тут не так? - Bill(02.07.2018 13:59)
- не так то, что компилятор кладёт код в область таблицы векторов прерываний. И код этот начинает чудить. По сути не работает. sladkoejka(387 знак., 02.07.2018 18:18)
- И что тут не так? - Bill(02.07.2018 13:59)
- добавляется, но походу в нём нет векторов, только вектор сброса. Вот посмотрел в исходнике: sladkoejka(1151 знак., 02.07.2018 10:58 - 11:30)
- Правьте linker configuraion file (.icf). Через него можно можно легко разметить память МК. - evgeniy1294(02.07.2018 15:24)
- все-же непонятно, как заставить компилятор класть код начиная с адреса 0x69, а не в таблицу векторов? sladkoejka(176 знак., 01.07.2018 00:38)
- В середине 2000-х находил баг в IAR MSP430 при работе с банальными битовыми операциями. sladkoejka(170 знак., 01.07.2018 00:31)
- Ну так посмотрите сгенерированный код. Какие проблемы? - Bill(01.07.2018 06:55)
- Проблемы в том, что IAR генерирует некорректный код. И вообще, похоже IAR не поддерживает контроллер CY7C68013A, несмотря на заявленную поддержку. sladkoejka(628 знак., 02.07.2018 12:11)
- 1. Проверить в настройках проекта какой именно printf formatter выбран. Мелкий может не понимать %i (не уверен, но не удивлюсь). LightElf(77 знак., 30.06.2018 11:57)
- стоял авто, пробовал все варианты, ни в одном %i не работает :) - sladkoejka(01.07.2018 00:32)
- 1. a55ku(446 знак., 29.06.2018 14:06, )
- пробовал даже так: sladkoejka(3075 знак., 30.06.2018 02:47 - 14:42)
- Всем привет, подниму тему. kuzulis(1697 знак., 18.10.2019 14:29)