-
- Может быть в этой ветке 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)