-
- Перенес потому что 1) тема действительно шире 2)столкнулся с непонятным поведением компилятора MSP430 Vladimir Ljaschko(497 знак., 28.03.2013 11:19)
- Может быть в этой ветке state.i - константа или в массиве properties всюду стоит 3-й бит? - vmp(28.03.2013 11:23)
- +1. Если во время компиляции значение константы, расположенной в любом месте, известно компилятору, то IAR подставляет это значение по месту использование. Неоднократно уже наступал на такие грабли, поэтому делаю примерно так. rezident(366 знак., 28.03.2013 11:46 - 11:59)
- ++1. Наступал с IAR MSP430 на такое. Тема уже раньше обсуждалась на сахаре. sbb(270 знак., 28.03.2013 16:02)
- В данном конкретном случае можно вынести инициализацию constMSG в отдельный файл и запретить многофайловую компиляцию. В остальных файлах просто ссылаться на extern const uint8_t constMsg[20];, без значений. - vmp(28.03.2013 12:24)
- А как в IAR запретить многофайловую компиляцию? - rezident(28.03.2013 12:33)
- Снять галочку с "multi-file compilation" в верхней части окна C/C++ Compiler опций проекта. - vmp(28.03.2013 12:46)
- Ага. Я ее никогда и не устанавливал. - rezident(28.03.2013 13:04)
- Ну тогда должно хватить выноса инициализации в отдельный файл. - vmp(28.03.2013 13:30)
- Проверил. Не катит этот способ :( При любом уровне оптимизации. rezident(406 знак., 28.03.2013 14:15 - 14:28)
- А в include-файле присутсвует ее описание как extern const? vmp(180 знак., 28.03.2013 14:31)
- extern прямо в текст main.c добавил. Никаких плюсов. Обычный Си. - rezident(28.03.2013 14:36)
- Небылицы. Ужмите демку до 20 строчек законченного кода, а мы тут поковыряем. - SciFi(28.03.2013 14:27, ссылка)
- Это не демка. Я один из простеньких проектов попробовал подрихтовать по совету vmp, вынеся определения константной структуры из main.c в отдельный файл main_info.c. Соответственно в main.c я заменил ее определение на extern. Предваряя вопрос rezident(198 знак., 28.03.2013 14:33)
- Попробуйте добавить строчку с extern и в файл main_info.c. В целой куче проектов использую extern const, с проблемами не сталкивался. Чистый Си, без каких-либо расширений. - vmp(28.03.2013 14:44)
- Вы уже сильно отклонились от стандарта Си (__no_init, наложение переменных), поэтому рассчитывать на его выполнение тут не приходится. И зачем всё это извращение? - SciFi(28.03.2013 14:36)
- Вы не поняли. Как раз с наложением данных все работает. Структура констант при необходимости может обновляться по связи в режиме настройки. Исходно программа работает с уставками по умолчанию. Дополнительная настройка устройства после rezident(120 знак., 28.03.2013 14:41)
- Ну понятно. Если может обновляться, то это уже не const. Отсюда и косяки. Я бы даже сказал, что это volatile, SciFi(90 знак., 28.03.2013 14:46 - 14:57)
- const нужен для размещения их во Flash. Ну и по логике выполнения программы это действительно константы, которые по ходу выполнения вычислений с ними не изменяются. Настройка это отдельный/специальный режим работы. - rezident(28.03.2013 14:57)
- Компилятор на знает, что есть отдельный режим. Есть одна программа, и теоретически он может кэшировать значение const переменной (константа же), но на практике это маловероятно. SciFi(281 знак., 28.03.2013 15:04 - 15:10)
- Использование указателей не спасает. Это я уже пробовал. Если значение константы известно на этапе компиляции, то компилятор подставляет это значение по месту использования при любом способе обращения к константе. - rezident(28.03.2013 15:07)
- Что-то это мне напоминает Vit(259 знак., 28.03.2013 17:06)
- А пробовали volatile const? Думаю это именно то - константа значение которой нельзя подставлять и кешировать. - amx(28.03.2013 15:38)
- [РЕШЕНО] Через указатель получилось! :) ih(284 знак., 19.04.2017 13:44 - 13:48)
- 4 года и проблема решена :)))) Codavr(46 знак., 19.04.2017 16:30)
- Компилятор не разрешает потому, что по смыслу это две противоположности - переменная не может быть одновременно изменчивой (volatile) и неизменной (constant). rezident(276 знак., 28.03.2013 15:43)
- А разве read-only регистр (например периферии) не ложится на это определение как родной? amx(368 знак., 28.03.2013 15:46 - 15:54, ссылка)
- Кстати, да, даже в стандарте есть такой пример. SciFi(321 знак., 28.03.2013 15:56)
- Дык тут компилятор ругается на инициализированную константу. Говорит, что
либо крест сними, либо трусы наденьтакое сочетание квалификаторов только для неинициализированной константы допустимо. - rezident(28.03.2013 17:09)- Дык внутри модуля без volatile напиши и проинициализируй, а в *.h файле включаемом в другие модули -- extern const volatile... - fk0(28.03.2013 17:58)
- Хренасе. От товарища в буденовке такого не ожидал. Это ж будет индусский говнокод тогда: не по
уставустандарту ни разу. - SciFi(28.03.2013 18:08)- А где отступление от стандарта-то? Не на всех платформах заработает (гарвардская архитектура не позволит, где const==flash, например pic18). - fk0(28.03.2013 18:57)
- это чалма - Snaky(28.03.2013 18:10)
- foil helmet. - fk0(28.03.2013 18:57)
- Вы явно не читали эту ветку с начала :) - rezident(28.03.2013 18:02)
- Хренасе. От товарища в буденовке такого не ожидал. Это ж будет индусский говнокод тогда: не по
- Дык внутри модуля без volatile напиши и проинициализируй, а в *.h файле включаемом в другие модули -- extern const volatile... - fk0(28.03.2013 17:58)
- Дык тут компилятор ругается на инициализированную константу. Говорит, что
- Регистр быть может. Для структуры констант (как у меня) не катит почему-то. - rezident(28.03.2013 15:55)
- Кстати, да, даже в стандарте есть такой пример. SciFi(321 знак., 28.03.2013 15:56)
- А разве read-only регистр (например периферии) не ложится на это определение как родной? amx(368 знак., 28.03.2013 15:46 - 15:54, ссылка)
- [РЕШЕНО] Через указатель получилось! :) ih(284 знак., 19.04.2017 13:44 - 13:48)
- Так в том случае, если константы выносятся в отдельный файл, то компилятор их не знает во время компиляции остальных файлов. vmp(197 знак., 28.03.2013 15:21)
- Враки. Вы даже не попробовали мой вариант. - SciFi(28.03.2013 15:09)
- Попробовал. rezident(1343 знак., 28.03.2013 15:26 - 15:29)
- Во-первых, SciFi(260 знак., 28.03.2013 15:30)
- Да, без прагмы компилируется без ошибок. - rezident(28.03.2013 15:57)
- Ну теперь можно начинать пляски с бубном: как поиметь профит от этой прагмы и не потерять профит от стандарта Си. SciFi(346 знак., 28.03.2013 16:00 - 16:03)
- +1. Вместо явного указания адреса в программе предпочитаю в программе задать имя сегмента (#pragma location="имя_сегмента"), а его расположение указать в линкере в *.icf - файле (если для ARM). - vmp(28.03.2013 15:52)
- Да, похоже использование #pragma constseg = INFOA вместо #pragma location = 0x1000 избавило от ошибки определения. Надо будет поглубже покопать в этом направлении, когда будет время. - rezident(28.03.2013 16:22)
- Все обсуждают ошибки компилятора, а ведь нормальный линкер по сложности ненамного уступает компилятору. - vmp(28.03.2013 16:30)
- Гы-гы. Размер исполняемого файла - неплохая мера сложности: SciFi(240 знак., 28.03.2013 16:47 - 16:49)
- Все обсуждают ошибки компилятора, а ведь нормальный линкер по сложности ненамного уступает компилятору. - vmp(28.03.2013 16:30)
- Да, похоже использование #pragma constseg = INFOA вместо #pragma location = 0x1000 избавило от ошибки определения. Надо будет поглубже покопать в этом направлении, когда будет время. - rezident(28.03.2013 16:22)
- Да, без прагмы компилируется без ошибок. - rezident(28.03.2013 15:57)
- Во-первых, SciFi(260 знак., 28.03.2013 15:30)
- Попробовал. rezident(1343 знак., 28.03.2013 15:26 - 15:29)
- Использование указателей не спасает. Это я уже пробовал. Если значение константы известно на этапе компиляции, то компилятор подставляет это значение по месту использования при любом способе обращения к константе. - rezident(28.03.2013 15:07)
- Компилятор на знает, что есть отдельный режим. Есть одна программа, и теоретически он может кэшировать значение const переменной (константа же), но на практике это маловероятно. SciFi(281 знак., 28.03.2013 15:04 - 15:10)
- const нужен для размещения их во Flash. Ну и по логике выполнения программы это действительно константы, которые по ходу выполнения вычислений с ними не изменяются. Настройка это отдельный/специальный режим работы. - rezident(28.03.2013 14:57)
- Ну понятно. Если может обновляться, то это уже не const. Отсюда и косяки. Я бы даже сказал, что это volatile, SciFi(90 знак., 28.03.2013 14:46 - 14:57)
- Вы не поняли. Как раз с наложением данных все работает. Структура констант при необходимости может обновляться по связи в режиме настройки. Исходно программа работает с уставками по умолчанию. Дополнительная настройка устройства после rezident(120 знак., 28.03.2013 14:41)
- Это не демка. Я один из простеньких проектов попробовал подрихтовать по совету vmp, вынеся определения константной структуры из main.c в отдельный файл main_info.c. Соответственно в main.c я заменил ее определение на extern. Предваряя вопрос rezident(198 знак., 28.03.2013 14:33)
- А в include-файле присутсвует ее описание как extern const? vmp(180 знак., 28.03.2013 14:31)
- Проверил. Не катит этот способ :( При любом уровне оптимизации. rezident(406 знак., 28.03.2013 14:15 - 14:28)
- Ну тогда должно хватить выноса инициализации в отдельный файл. - vmp(28.03.2013 13:30)
- Ага. Я ее никогда и не устанавливал. - rezident(28.03.2013 13:04)
- Снять галочку с "multi-file compilation" в верхней части окна C/C++ Compiler опций проекта. - vmp(28.03.2013 12:46)
- А как в IAR запретить многофайловую компиляцию? - rezident(28.03.2013 12:33)
- 1) Речь идет о массиве, индекс которого неизвестен в момент проверки. 2) Идентичный механизм успешно наботает в IAR Renesas R8C - Vladimir Ljaschko(28.03.2013 12:10)
- Из "огрызка" вашего примера п.1 вовсе не очевиден. Если я не ошибаюсь, то у Renesas R8C гарвардская, а не фон-неймановская архитектура. Этот факт нужно учитывать в п.2. - rezident(28.03.2013 12:16)
- state.i - это собственно состояние автомата. Что из откушенного приложить, чтобы п.1 стал однозначен? R8C - это классический фон-Нейман с единым адресным пространством - Vladimir Ljaschko(28.03.2013 12:32)
- Из общих соображений в споре "кто дурак: компилятор или я?" в 99% случаев выигрывает компилятор. Так что презумпция виновности - на вас, отдувайтесь :-) - SciFi(28.03.2013 12:39)
- Про шансы стер :) приведен дизассемблер более полного куска. Проверка вроде есть выше, дизассемблер не отобразил сишный текст. Остальное нужно проверять на устройстве, сейчас я от него отъехал. Vladimir Ljaschko(28.03.2013 12:53 - 12:59)
- А по адресу 0x6D9C не искомая ли проверка находится? - rezident(28.03.2013 12:59)
- Угу, уже увидел. Выясню, что не работало - отпишусь. - Vladimir Ljaschko(28.03.2013 13:01)
- Признаюсь, дурак - я. При таком подходе нельзя в первом входе в обработчик состояния менять состояние. Неточность в отладчике (пропажа строки С) спровоцировала меня на необоснованные обвинения к компилятору. Пора вести счет :) - Vladimir Ljaschko(28.03.2013 15:58)
- мне наш программист (он до нас в Agilent работал) на вопрос почему уже несколько лет не обновляют gcc-тулчейн сказал что было уже много случаев когда думали что наткнулись на баг компилятора, но в итоге выяснялось что сами накосячили. - Snaky(28.03.2013 16:02)
- Да я статистику знаю, но тут повелся под общее настроение :) - Vladimir Ljaschko(28.03.2013 16:12)
- Для поднятия общего настроения. Вот реальный пример бага компилятора. Техподдержка признала ошибку, в следуюшей версии она была исправлена. Сразу предупреждаю - история древняя. vmp(3052 знак., 28.03.2013 16:26)
- А я вот на такой баг натолкнулся при попытке изменить data alignment вложенных структур. rezident(1063 знак., 28.03.2013 16:59 - 17:05)
- Получить Internal error просто при некорректном использовании кавычек. Vladimir Ljaschko(189 знак., 28.03.2013 17:50 - 18:35)
- А я вот на такой баг натолкнулся при попытке изменить data alignment вложенных структур. rezident(1063 знак., 28.03.2013 16:59 - 17:05)
- Для поднятия общего настроения. Вот реальный пример бага компилятора. Техподдержка признала ошибку, в следуюшей версии она была исправлена. Сразу предупреждаю - история древняя. vmp(3052 знак., 28.03.2013 16:26)
- Да я статистику знаю, но тут повелся под общее настроение :) - Vladimir Ljaschko(28.03.2013 16:12)
- мне наш программист (он до нас в Agilent работал) на вопрос почему уже несколько лет не обновляют gcc-тулчейн сказал что было уже много случаев когда думали что наткнулись на баг компилятора, но в итоге выяснялось что сами накосячили. - Snaky(28.03.2013 16:02)
- Признаюсь, дурак - я. При таком подходе нельзя в первом входе в обработчик состояния менять состояние. Неточность в отладчике (пропажа строки С) спровоцировала меня на необоснованные обвинения к компилятору. Пора вести счет :) - Vladimir Ljaschko(28.03.2013 15:58)
- Угу, уже увидел. Выясню, что не работало - отпишусь. - Vladimir Ljaschko(28.03.2013 13:01)
- А по адресу 0x6D9C не искомая ли проверка находится? - rezident(28.03.2013 12:59)
- Про шансы стер :) приведен дизассемблер более полного куска. Проверка вроде есть выше, дизассемблер не отобразил сишный текст. Остальное нужно проверять на устройстве, сейчас я от него отъехал. Vladimir Ljaschko(28.03.2013 12:53 - 12:59)
- Из общих соображений в споре "кто дурак: компилятор или я?" в 99% случаев выигрывает компилятор. Так что презумпция виновности - на вас, отдувайтесь :-) - SciFi(28.03.2013 12:39)
- state.i - это собственно состояние автомата. Что из откушенного приложить, чтобы п.1 стал однозначен? R8C - это классический фон-Нейман с единым адресным пространством - Vladimir Ljaschko(28.03.2013 12:32)
- Из "огрызка" вашего примера п.1 вовсе не очевиден. Если я не ошибаюсь, то у Renesas R8C гарвардская, а не фон-неймановская архитектура. Этот факт нужно учитывать в п.2. - rezident(28.03.2013 12:16)
- Первое, что проверил. ИАР4 и ИАР5 одинаково. - Vladimir Ljaschko(28.03.2013 11:35)
- +1. Если во время компиляции значение константы, расположенной в любом месте, известно компилятору, то IAR подставляет это значение по месту использование. Неоднократно уже наступал на такие грабли, поэтому делаю примерно так. rezident(366 знак., 28.03.2013 11:46 - 11:59)
- Может быть в этой ветке state.i - константа или в массиве properties всюду стоит 3-й бит? - vmp(28.03.2013 11:23)
- Уважаемому MBedder'у показалось что тема чисто АРМовская? - nanorobot(25.03.2013 17:29)
- Я отдаю себе отчет в том, что компиляторы для разных семейств МК весьма разные, поэтому и перенес. Не угодил - возьми и перенеси туда, куда считаешь оптимальным - MBedder(25.03.2013 17:54)
- Вы как ТС можете перенести свою тему в другой раздел. - rezident(25.03.2013 17:36)
- Давно принял для себя правило. Программа должна работать при всех уровнях оптимизации. Это как начальный тест на правильность. Dir(439 знак., 23.03.2013 21:19)
- Что значит "должна работать"? amusin(355 знак., 24.03.2013 14:48)
- Статический анализ кода и чистая компиляция - это совсем не одно и тоже. Иначе, зачем бы были нужны статические анализаторы? А по теме поддерживаю Dir - прога должна работать при всех уровнях оптимизации. - Alex B.(24.03.2013 23:33)
- Я бы с этим не согласился. Если предположить, что если программа работает изначально без оптимизации, то Bill(530 знак., 28.03.2013 15:02)
- Если используются ассемблерные модули (в т.ч. RTOS) могут возникнуть трудности, т.к. calling convention для нулевой оптимизации может отличаться. Сталкивался с тем, что компилятор начинает передавать все параметры через стек, и ассемблерные модули =AlexD=(26 знак., 28.03.2013 13:26)
- Первое. Я же сказал, что "первоначальная оценка" правильности программы. Это как реакция на то, что появляются глюки при оптимизации ;) Dir(128 знак., 24.03.2013 16:46)
- Статический анализ кода и чистая компиляция - это совсем не одно и тоже. Иначе, зачем бы были нужны статические анализаторы? А по теме поддерживаю Dir - прога должна работать при всех уровнях оптимизации. - Alex B.(24.03.2013 23:33)
- При всех уровнях оптимизации проверять вряд ли есть смысл. Я для всех программ всегда ставлю самый высокий уровень оптимизации и никогда его не меняю. - Леонид Иванович(23.03.2013 23:22)
- При всех уровнях, согласен, нереально. А вот скомпилировать при самом высоком уровне оптимизации в режимах оптимизации по размеру, по скорости, балансная оптимизация + кросс-файловая оптимизация всегда очень полезно. Dir(363 знак., 24.03.2013 12:53)
- Как я понял, Вы предлагаете попробовать скомпилировать при самой высокой оптимизации, а потом вернуться на более низкую. Зачем? - Леонид Иванович(24.03.2013 13:18)
- при включенной оптимизации бывают сложности с отладкой. Поэтому вначале отлаживаюсь при отключенной оптимизации, потом включаю для отлаженных модулей и проверяю, всё ли работает - koyodza(24.03.2013 19:23)
- Нет. Просто "самый высокий" разный бывает. По размеру, по скорости и т.д. В свою очередь эти модификации включают разные приемы оптимизации. Dir(243 знак., 24.03.2013 13:26 - 13:31)
- Все проекты всегда компилирую с максимальной оптимизацией по скорости. - Леонид Иванович(24.03.2013 13:35)
- аналогично - Snaky(25.03.2013 02:16)
- И это - правильно. Обращайте внимание на все warning - и. - tesla(24.03.2013 22:44)
- Все проекты всегда компилирую с максимальной оптимизацией по скорости. - Леонид Иванович(24.03.2013 13:35)
- Как я понял, Вы предлагаете попробовать скомпилировать при самой высокой оптимизации, а потом вернуться на более низкую. Зачем? - Леонид Иванович(24.03.2013 13:18)
- Я бы предпочёл -Os в одних случаях, -O3 в других где с -O2 точно хуже, в остальных случаях таки и -O2 ибо не факт, чтоб при слишком хорошей оптимизации не вскроются ошибки компилятора и/или программиста, и точно не факт, что они будут обнаружены fk0(59 знак., 23.03.2013 23:45 - 23:52)
- Ошибки компилятора - это миф, а ошибки программиста нужно вычищать. Поэтому всегда только самый высокий уровень оптимизации. - Леонид Иванович(24.03.2013 10:29)
- Увы, не миф Chum_A(295 знак., 25.03.2013 09:08, ссылка)
- Леонид, вы наверно больших программ на микроСи для пик18 не писали :) - scorpion(24.03.2013 22:17)
- Нашёл баг C18 от Микрочипа. Их тех. поддержка со мной согласилась. Если бы мне объяснили где я накосячил по ссылке, был бы сильно признателен. - amx(24.03.2013 14:48, ссылка)
- Извините, гуру(искренне), я тоже придерживаюсь этого мнения. Да и порядок процесса - отладка без оптимизации - проверка с полной оптимизацией. Меня больше напрягали не мои тупости с неиспользованием волатайл, а стыковка аппаратуры с ядром в армах. Белый Жрец из Краснодара(332 знак., 24.03.2013 12:51, )
- Еще одна причина разочарований - использование слишком широкого подмножества языка Си. Некоторые конструкции сами по себе малопонятны, а без них вполне можно обойтись. Например, указатели нужны только в очень редких случаях. - Леонид Иванович(24.03.2013 13:21)
- из "малопонятных" мне нравятся примерно такие:) *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; - Vit(24.03.2013 13:45, ссылка)
- Тут с месяц назад был вопрос, который остался без ответа. Товарищ подставляет отрицательное значение индекса и удивляется, почему компилятор неправильно вычисляет смещение? Я не понял, откуда он такой способ вычислений смещения взял? - rezident(24.03.2013 14:11, ссылка)
- Я не понял, почему некоторые товарищи считают отрицательные числа -- нечислами. В языке C выражение вида p[x] это лишь syntactic sugar для *(p+x). PS: где-то у классиков, кстати, встречается использование отрицательных индексов, fk0(27 знак., 24.03.2013 14:56)
- Не нужно полунамеков :) Я возражал вам по поводу отрицательных чисел лишь в одном случае, когда знаковым типом переменной исчисляется время. Потому, что у времени только одно направление для изменения - вперед. rezident(448 знак., 24.03.2013 15:32)
- за double difftime(time_t time2, time_t time1) ...нужно сжигать на костре(С) - Vit(24.03.2013 16:11)
- Да, есть такая проблема. Мотивация скорей в том, что разность должна быть скалярным типом однозначно, а вот сам time_t возможно, может быть и указателем на структуру, например. И скалярным целым разницу не представить в принципе (из-за fk0(88 знак., 24.03.2013 21:52)
- с диффом разрыв шаблона - почему не long long? - Vit(24.03.2013 22:56)
- Да, есть такая проблема. Мотивация скорей в том, что разность должна быть скалярным типом однозначно, а вот сам time_t возможно, может быть и указателем на структуру, например. И скалярным целым разницу не представить в принципе (из-за fk0(88 знак., 24.03.2013 21:52)
- за double difftime(time_t time2, time_t time1) ...нужно сжигать на костре(С) - Vit(24.03.2013 16:11)
- Не нужно полунамеков :) Я возражал вам по поводу отрицательных чисел лишь в одном случае, когда знаковым типом переменной исчисляется время. Потому, что у времени только одно направление для изменения - вперед. rezident(448 знак., 24.03.2013 15:32)
- Я не понял, почему некоторые товарищи считают отрицательные числа -- нечислами. В языке C выражение вида p[x] это лишь syntactic sugar для *(p+x). PS: где-то у классиков, кстати, встречается использование отрицательных индексов, fk0(27 знак., 24.03.2013 14:56)
- Тут с месяц назад был вопрос, который остался без ответа. Товарищ подставляет отрицательное значение индекса и удивляется, почему компилятор неправильно вычисляет смещение? Я не понял, откуда он такой способ вычислений смещения взял? - rezident(24.03.2013 14:11, ссылка)
- из "малопонятных" мне нравятся примерно такие:) *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; - Vit(24.03.2013 13:45, ссылка)
- Еще одна причина разочарований - использование слишком широкого подмножества языка Си. Некоторые конструкции сами по себе малопонятны, а без них вполне можно обойтись. Например, указатели нужны только в очень редких случаях. - Леонид Иванович(24.03.2013 13:21)
- C30 фирмы microchip, версия предшествующая текущей (не путать с XC30). С -O2 "не работала половина программ" -- fk0(328 знак., 24.03.2013 12:27)
- Это только в контроллерах профессионального уровня, там всё по-другому. - Леонид Иванович(24.03.2013 12:36)
- C30 основан на GCC. GCC же массово применяется для контроллеров любительского уровня --> глюкодром! - fk0(24.03.2013 12:51)
- я раньше почему вредный был - потому что у меня
велосипедаплюсов не было - Snaky(24.03.2013 14:05, ссылка) - Всё, что бесплатное, хорошим быть не может по определению. Никто "за так" не будет вкладывать в продукт душу. - Леонид Иванович(24.03.2013 13:23)
- Ну а мне вот ровно наоборот представляется. Если цель – деньги, душу как раз вкладывать ни к чему. Сделал как начальник приказал, манюшки получил – mission aссomplished. А когда человек бесплатно работает, у него одна мотивация – сделать так, йцукен(27 знак., 24.03.2013 15:45, )
- Работать бесплатно быстро надоедает. За это время можно сделать лишь сырой продукт. - Леонид Иванович(24.03.2013 17:04)
- +1. Возможно, при наличии независимого источника доходов было бы иначе - koyodza(24.03.2013 19:10)
- Работать бесплатно быстро надоедает. За это время можно сделать лишь сырой продукт. - Леонид Иванович(24.03.2013 17:04)
- А при коммунизме всё будет бесплатно, всё будет в кайф! - fk0(24.03.2013 14:59)
- Ну а мне вот ровно наоборот представляется. Если цель – деньги, душу как раз вкладывать ни к чему. Сделал как начальник приказал, манюшки получил – mission aссomplished. А когда человек бесплатно работает, у него одна мотивация – сделать так, йцукен(27 знак., 24.03.2013 15:45, )
- я раньше почему вредный был - потому что у меня
- C30 основан на GCC. GCC же массово применяется для контроллеров любительского уровня --> глюкодром! - fk0(24.03.2013 12:51)
- Это только в контроллерах профессионального уровня, там всё по-другому. - Леонид Иванович(24.03.2013 12:36)
- Ну не то, что-бы миф, пару раз за свою жизнь я сталкивался с ошибками в компиляторах. Но это как правило весьма редкие экзотические случаи. - =AlexD=(24.03.2013 10:49)
- без экзотики встречаются. в кайле для ARM долгое время пробрасывалось "dummyread" для volatile переменных Vit(155 знак., 24.03.2013 10:56)
- Поделитесь, пожалуйста, обнаруженными ошибками компилятора. - Леонид Иванович(24.03.2013 10:52)
- Ошибки компилятора - это миф, а ошибки программиста нужно вычищать. Поэтому всегда только самый высокий уровень оптимизации. - Леонид Иванович(24.03.2013 10:29)
- При всех уровнях, согласен, нереально. А вот скомпилировать при самом высоком уровне оптимизации в режимах оптимизации по размеру, по скорости, балансная оптимизация + кросс-файловая оптимизация всегда очень полезно. Dir(363 знак., 24.03.2013 12:53)
- так и надо - koyodza(23.03.2013 21:40)
- Не надо широко обобщать. Радиолюбителю, к примеру, это не надо. Но как дополнительное средство тестирования с минимальными телодвижениями - для многих полезно, да. - SciFi(23.03.2013 21:46)
- радиолюбители обычно пользуются codevision - koyodza(24.03.2013 11:22)
- Не надо широко обобщать. Радиолюбителю, к примеру, это не надо. Но как дополнительное средство тестирования с минимальными телодвижениями - для многих полезно, да. - SciFi(23.03.2013 21:46)
- Что значит "должна работать"? amusin(355 знак., 24.03.2013 14:48)
- На 6.40 было раз странное пропускание кусков кода, даже отладочный вывод туда совал - жопничало. Ясно что оптимизация, стал по очереди снимать галки, пока не дошел до Common subexpression elimination. После этого как рукой сняло. Теперь боюсь ее Юра(11 знак., 23.03.2013 19:25, )
- Учить что такое volatile! Nikolay801_(66 знак., 23.03.2013 16:46)
- Глюков в IAR полно, особенно при работе со структурами даже без всякой оптимизации, даже на простых STM32F100. Таки да, SciFi прав, надо брать камень пожирнее и не делать оптимизацию. - Любитель51(23.03.2013 13:07, )
- Почему у одних людей глюки в IAR есть, а у других - нет? Приведите пример глюка, а то верится с трудом. - Леонид Иванович(23.03.2013 16:37)
- IAR генерит хорошего качества код для ARM7/9, а вот back-end в IAR для Cortex M0/3/4 просто плохой. - yuri_t(23.03.2013 19:09)
- Леонид Иванович, куда положить часть примера, дело в том, что код часть большого проекта работающего с радиосетью, Вы не сможете проверить если у Вас нет СС2520 портированого на STM32F100RC. Глюк проявился при чтении принятого пакета данных и Любитель51(70 знак., 23.03.2013 18:00, )
- Достаточно выложить строчку на Си и во что она скомпилилась на ассемблере. - Леонид Иванович(23.03.2013 18:40)
- Извините, ассемблером не пользуюсь, версия IAR 6.40.2// Рабочий вариант программы/***********************************************************************************//uint8 basicRfBuildHeader(uint8* buffer, uint16 destAddr, uint8 Любитель51(2795 знак., 23.03.2013 19:59, )
- Ну как обычно, выравнивание полей структуры считают багом компилятора. - AD(23.03.2013 20:18)
- Ога. Любитель51, курите pragma pack и не морочьте людЯм голову. - йцу(23.03.2013 20:41, )
- Для того, чтобы пользоваться тегами и прочими фичами форума, нужно зарегистрироваться. См. примечание в Правилах форума. - rezident(23.03.2013 20:07, ссылка)
- Ну как обычно, выравнивание полей структуры считают багом компилятора. - AD(23.03.2013 20:18)
- Извините, ассемблером не пользуюсь, версия IAR 6.40.2// Рабочий вариант программы/***********************************************************************************//uint8 basicRfBuildHeader(uint8* buffer, uint16 destAddr, uint8 Любитель51(2795 знак., 23.03.2013 19:59, )
- Достаточно выложить строчку на Си и во что она скомпилилась на ассемблере. - Леонид Иванович(23.03.2013 18:40)
- Глюки только у тех, кто звёздочками пользуется :) - йцукен(23.03.2013 17:57, )
- Почему у одних людей глюки в IAR есть, а у других - нет? Приведите пример глюка, а то верится с трудом. - Леонид Иванович(23.03.2013 16:37)
- Мне кажется, для начала нужно выяснить чей это "глюк": программиста или компилятора. Все дело в том, что Bill(596 знак., 23.03.2013 12:18)
- Пишу в таких случаях так: ut1wpr(86 знак., 23.03.2013 14:26)
- если i локальная, то может выбросить, и будет прав - koyodza(23.03.2013 17:11)
- В таких случаях обрамляют нужную часть кода #pragma optimize ххххх, отключающую оптимизацию. - AZ.(23.03.2013 20:33)
- Может лучше переменную как volatile объявить? Букв меньше... - Apтём(23.03.2013 20:45)
- В таких случаях используют аппаратные таймеры, для формирования задержек. - Скрипач(23.03.2013 20:43)
- #pragma optimize пригодна не только для программных задержек. - AZ.(23.03.2013 20:52)
- Кто бы спорил. Есть целый сайт, посвященный подобным приемам - Скрипач(23.03.2013 20:58, ссылка)
- #pragma optimize пригодна не только для программных задержек. - AZ.(23.03.2013 20:52)
- В таких случаях обрамляют нужную часть кода #pragma optimize ххххх, отключающую оптимизацию. - AZ.(23.03.2013 20:33)
- если i локальная, то может выбросить, и будет прав - koyodza(23.03.2013 17:11)
- Или нет. :) Потому, шта: volatile i; - Юрий_СВ(23.03.2013 13:13)
- А почему i должна быть обязательно volatile? - Bill(23.03.2013 13:14)
- Пишу в таких случаях так: ut1wpr(86 знак., 23.03.2013 14:26)
- А можно ли описать глюки, которые у вас возникают? Может это и не глюки, а фичи оптимизации. В любом случае, задача кодера - объяснить компилятору в понятных ему рамках правил, чего вы от него хотите? - rezident(22.03.2013 21:44)
- Ни разу не сталкивался с тем, чтобы оптимизация в IAR приводила к глюкам. Правда, работаю на AVR. Поэтому это скорее всего сам STM32 глючный. - Леонид Иванович(22.03.2013 20:50)
- сталкивался с глюками IAR для AVR неоднократно, но после внимательного изучения вопроса всегда оказывалось, что сам дурак. В том смысле, что компилятор всё делал правильно - koyodza(23.03.2013 17:12)
- Эту потому что ветку AVR уже вылизали как следует, и в архитектуру свистелок не добавляли. - amx(23.03.2013 12:28)
- нее ... STM32 - супер, про АВР и вспоминать не хочется... а оптимизация - в крайнем случае и лоу обойдемся. - nanorobot(22.03.2013 20:52)
- 1) Не полагаться на время выполнения куска кода (программные задержки и т.п.). 2) Ставить volatile там, где без него нельзя. - SciFi(22.03.2013 20:31)
- volatile это практически как перекреститься. Не факт, что поможет. - fk0(22.03.2013 20:31)
- Ну если в случайном месте его поставить, то конечно. А если понимать, что делаешь, то и вопрос у топикстартера не возник бы, наверное :-) - SciFi(22.03.2013 20:34)
- Ранее(года 3 назад)тема "глюки ИАРа при высоких уровнях оптимизации" была весьма популярна. Тему можно понимать как голосование: 1.Я сам дурак 2. ИАР опять с оптимизацией накосячил. - nanorobot(22.03.2013 20:50)
- 1) ;) у меня есть пара проектов, у которых без полной оптимизации вообще нет шансов. И не потому что ресурсы на пределы - просто оптимизация дает массу удобств в кодировании. - Vladimir Ljaschko(22.03.2013 21:19)
- В смысле "не нужно подсказывать компилятору, как генерить более оптимальный код"? Другими словами, "ресурсы таки на пределе, надо брать камень пожирнее" :-) - SciFi(22.03.2013 22:14 - 22:18)
- Ни фига не на пределе, просто использую макросы + инлайны вместо того, чтобы писать а-ля ассемблер. Например вот так. Имею право? Хочу им пользоваться! :) Vladimir Ljaschko(2626 знак., 23.03.2013 12:56)
- Прошу прощения - а как вы относитесь к высказыванию: код должен быть самодокументирующимся? - Белый Жрец из Краснодара(24.03.2013 12:53, )
- У меня программисты так хотят писать, а я им по рукам, по рукам. Хитрый Китаец(102 знак., 26.03.2013 19:44)
- конечно, такой стиль намного лучше koyodza(256 знак., 26.03.2013 20:40)
- Это нормальный стиль. С короткими переменными. Переменные и нужны для того, чтобы длинным понятиям дать короткие обозначения. Иначе ни в голове не помещается, ни на листе бумаги. А комментарии нужно писать в комментариях, а не в имени переменной. - fk0(27.03.2013 08:47)
- ви будите смияца, но там все переменные были глобальные - koyodza(27.03.2013 12:07)
- лучше, но некомпактно. с запятыми меньше строк ;> Snaky(231 знак., 27.03.2013 02:37)
- Это нормальный стиль. С короткими переменными. Переменные и нужны для того, чтобы длинным понятиям дать короткие обозначения. Иначе ни в голове не помещается, ни на листе бумаги. А комментарии нужно писать в комментариях, а не в имени переменной. - fk0(27.03.2013 08:47)
- конечно, такой стиль намного лучше koyodza(256 знак., 26.03.2013 20:40)
- Я думаю, что из приведенного текста видно, что я абсолютно поддерживаю это высказывание и тупо следую ему. Можете предложить лучше SetFlag(data_error) ? То-то! ;) - Vladimir Ljaschko(24.03.2013 16:54)
- Думаю, на ассемблере было бы понятнее. - АПМ(27.03.2013 10:26)
- На каком ассемблере? Код кочует из проекта в проект на 5 семействах. - Vladimir Ljaschko(27.03.2013 10:34)
- Пару советов, как писать код для перехода с семейства на семейство. Пока пришел к такому: модуль основной микросхемы + его аппаратная часть. К примеру DS3231.c + DS3231_Hardware.c - Constantin24(20.04.2017 12:47)
- Так вы про переносимость. А я - про читаемость. - АПМ(27.03.2013 10:48)
- И я про читаемость, но для любого проекта. Я вынужден экономить свои жизненные силы. - Vladimir Ljaschko(27.03.2013 11:04)
- На каком ассемблере? Код кочует из проекта в проект на 5 семействах. - Vladimir Ljaschko(27.03.2013 10:34)
- Думаю, на ассемблере было бы понятнее. - АПМ(27.03.2013 10:26)
- Если бы он ещё был самопишущимся... - fk0(24.03.2013 12:56)
- HiAsm. правда рисовать ещё надо уметь)))) - Белый Жрец из Краснодара(24.03.2013 13:12, )
- У меня программисты так хотят писать, а я им по рукам, по рукам. Хитрый Китаец(102 знак., 26.03.2013 19:44)
- вот это вот я и называю программированием ради программирования. многоэтажные конструкции описывающие по сути примитивные действия. Mahagam(104 знак., 24.03.2013 12:13)
- Птичий язык, аднака. Но право имеете, да :-) SciFi(98 знак., 23.03.2013 21:23 - 21:25)
- Если вернуться на "человеческий язык", то загрузка не выше 30-50% процентов независимо от уровня оптимизации. Значит ресурсов хватает. - Vladimir Ljaschko(24.03.2013 08:47)
- Ну так и пишите на здоровье, при чем здесь оптимизация? - Леонид Иванович(23.03.2013 16:33)
- Прошу прощения - а как вы относитесь к высказыванию: код должен быть самодокументирующимся? - Белый Жрец из Краснодара(24.03.2013 12:53, )
- Ни фига не на пределе, просто использую макросы + инлайны вместо того, чтобы писать а-ля ассемблер. Например вот так. Имею право? Хочу им пользоваться! :) Vladimir Ljaschko(2626 знак., 23.03.2013 12:56)
- Как это, дает массу удобств? Для программиста ведь совершенно незаметно, включена оптимизация, или нет. Если не брать в расчет затрудненную отладку, конечно. - Леонид Иванович(22.03.2013 21:40)
- Т.е. оптимизация вообще не нужна и ее можно отключить? - Bill(23.03.2013 13:13)
- Где логика? Я говорил только, что оптимизация никак не влияет на стиль программирования. Оптимизация нужна только для того, чтобы программа влезала в память и работала быстрее. - Леонид Иванович(23.03.2013 16:31)
- при небрежном, не очень грамотном программировании часто при оптимизации могут быть выброшены некоторые куски, после чего программа может перестать работать. Простейший пример - задержки с использованием пустых циклов koyodza(202 знак., 23.03.2013 17:08)
- часто не важно локальная переменная или нет. Если после цикла её значение должно принять константу и компилятор "понимает", что это безусловно для данных условий компиляции, то переменной просто может присвоиться константа одной командой. при Vit(55 знак., 23.03.2013 17:44)
- Это, скорее, ответ для ТС. - Леонид Иванович(23.03.2013 17:14)
- при небрежном, не очень грамотном программировании часто при оптимизации могут быть выброшены некоторые куски, после чего программа может перестать работать. Простейший пример - задержки с использованием пустых циклов koyodza(202 знак., 23.03.2013 17:08)
- Где логика? Я говорил только, что оптимизация никак не влияет на стиль программирования. Оптимизация нужна только для того, чтобы программа влезала в память и работала быстрее. - Леонид Иванович(23.03.2013 16:31)
- Стиль написания программ можно существенно изменить, упростив понимание того, что написано. Это дает возможность сосредоточиться на главном. Пример выше. - Vladimir Ljaschko(23.03.2013 12:59)
- По-Вашему, без оптимизации стиль изменить нельзя? - Леонид Иванович(23.03.2013 16:34)
- В чём упрощение(я про пример выше)? Запутывание скорей... - Apтём(23.03.2013 16:09)
- Хум хау - Vladimir Ljaschko(23.03.2013 17:34)
- Т.е. оптимизация вообще не нужна и ее можно отключить? - Bill(23.03.2013 13:13)
- В смысле "не нужно подсказывать компилятору, как генерить более оптимальный код"? Другими словами, "ресурсы таки на пределе, надо брать камень пожирнее" :-) - SciFi(22.03.2013 22:14 - 22:18)
- 1) ;) у меня есть пара проектов, у которых без полной оптимизации вообще нет шансов. И не потому что ресурсы на пределы - просто оптимизация дает массу удобств в кодировании. - Vladimir Ljaschko(22.03.2013 21:19)
- Ну в принципе да. Не всякий volatile угоден Богу. - fk0(22.03.2013 20:49, картинка)
- Ранее(года 3 назад)тема "глюки ИАРа при высоких уровнях оптимизации" была весьма популярна. Тему можно понимать как голосование: 1.Я сам дурак 2. ИАР опять с оптимизацией накосячил. - nanorobot(22.03.2013 20:50)
- Ну если в случайном месте его поставить, то конечно. А если понимать, что делаешь, то и вопрос у топикстартера не возник бы, наверное :-) - SciFi(22.03.2013 20:34)
- volatile это практически как перекреститься. Не факт, что поможет. - fk0(22.03.2013 20:31)
- Перенес потому что 1) тема действительно шире 2)столкнулся с непонятным поведением компилятора MSP430 Vladimir Ljaschko(497 знак., 28.03.2013 11:19)