-
- Проверил. Не катит этот способ :( При любом уровне оптимизации. 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)