-
- Легко определяется экспериментально: создать структуру из двух переменных типа char, а потом спросить разность между их поинтерами. - Ксения(10.02.2011 13:53)
- Поинтеры нельзя, до линковки адреса не известны. Надо offsetof() использовать, но не все компиляторы (в том числе GCC) позволяют его совать в #if. (Кстати, второй элемент структуры д.б. int, иначе компилятор два char'а может спаковать) - testerplus(10.02.2011 14:39 - 14:42)
- Тогда спросить sizeof этой структуры. - Ксения(11.02.2011 01:47)
- С sizeof() то же самое - testerplus(11.02.2011 02:16)
- А что мешает проверять не препроцессором, а прямо в коде? в if() с константным выражением нормальный оптимизатор выкинет неиспользуемую ветку. - Cepгeй Бopщ(11.02.2011 11:13)
- Так целевой компилятор (для пик16) не имеет нормального оптимизатора (зато он-то как раз позволяет sizeof'ы и offsetof'ы использовать в #if'ах) - testerplus(11.02.2011 12:28)
- В исходном вопросе фигурировал язык С, а не компилятор "языка, похожего на С". - Cepгeй Бopщ(11.02.2011 16:12)
- Для PIC1x, как и для подавляющего большинства других восьмибитников, endianness определяется не архитектурой ядра, а реализацией конкретного компилятора, и может быть любым - MBedder(11.02.2011 13:24)
- Хер! Z80 например. LD HL, (xx) <-- какая ендианность? И у многих есть инструкции работы с указателями и 16-битными операндами. У некоторых правда нет (вон у x51 и KEIL ендианность вовсе для разных типов данных -- разная). - fk0(11.02.2011 14:41)
- Четай вдумчивей - специально указал "для подавляющего большинства", имея в виду, что в семье не без урода - MBedder(11.02.2011 18:37)
- Так вопрос не про endianness был, а про alignement - testerplus(11.02.2011 13:43)
- Для восьмибитников проблема выровненности отсутствует принципиально, ибо обращения всегда идут к объектам МИНИМАЛЬНОГО размера - MBedder(11.02.2011 18:35)
- Вот он и хочет 8-битнику подсунуть код попроще с приведением типа по невыровненному указателю - testerplus(11.02.2011 19:02, ссылка)
- Пафтаряйу: у восьмибитников невыровненного доступа быть не может по определению патамушта байты у них уже выровнены генетикой и проверены электроникой - MBedder(11.02.2011 19:48)
- У МИПСов-то не выровнены. Ему надо из потока байтов по невыровненному указателю вытащить long. Смотри: на МИПСе этого не сделать иначе, как testerplus(388 знак., 11.02.2011 21:17 - 22:03)
- Проверил из любопытства: PICC на оба варианта генерит примерно одинаковую херню. Так что смысла изворачиваться нет. - testerplus(11.02.2011 21:23 - 21:35)
- Подставился - AVR! ;) - Vladimir Ljaschko(11.02.2011 20:39)
- У МИПСов-то не выровнены. Ему надо из потока байтов по невыровненному указателю вытащить long. Смотри: на МИПСе этого не сделать иначе, как testerplus(388 знак., 11.02.2011 21:17 - 22:03)
- Пафтаряйу: у восьмибитников невыровненного доступа быть не может по определению патамушта байты у них уже выровнены генетикой и проверены электроникой - MBedder(11.02.2011 19:48)
- Вот он и хочет 8-битнику подсунуть код попроще с приведением типа по невыровненному указателю - testerplus(11.02.2011 19:02, ссылка)
- Кажется, уже не важно, о чём вопрос. Уже "всё смешалось: кони, люди" :-) - SciFi(11.02.2011 13:59)
- Для восьмибитников проблема выровненности отсутствует принципиально, ибо обращения всегда идут к объектам МИНИМАЛЬНОГО размера - MBedder(11.02.2011 18:35)
- Хер! Z80 например. LD HL, (xx) <-- какая ендианность? И у многих есть инструкции работы с указателями и 16-битными операндами. У некоторых правда нет (вон у x51 и KEIL ендианность вовсе для разных типов данных -- разная). - fk0(11.02.2011 14:41)
- Так целевой компилятор (для пик16) не имеет нормального оптимизатора (зато он-то как раз позволяет sizeof'ы и offsetof'ы использовать в #if'ах) - testerplus(11.02.2011 12:28)
- А что мешает проверять не препроцессором, а прямо в коде? в if() с константным выражением нормальный оптимизатор выкинет неиспользуемую ветку. - Cepгeй Бopщ(11.02.2011 11:13)
- С sizeof() то же самое - testerplus(11.02.2011 02:16)
- Тогда спросить sizeof этой структуры. - Ксения(11.02.2011 01:47)
- Поинтеры нельзя, до линковки адреса не известны. Надо offsetof() использовать, но не все компиляторы (в том числе GCC) позволяют его совать в #if. (Кстати, второй элемент структуры д.б. int, иначе компилятор два char'а может спаковать) - testerplus(10.02.2011 14:39 - 14:42)
- alignof, sizeof packedSubj - gcc(10.02.2011 02:10, )
- Не то. Топикстартер на этапе компиляции хочет понять, поддерживает ли проц невыровненное обращение, и в зависимости от этого компилить тот или иной код. - Evgeny_CD(10.02.2011 13:08)
- я не понял, код уже написан и не знаем как дефайн назвать? :) - ALIGNMENT(11.02.2011 01:17, )
- Да. - fk0(11.02.2011 10:02)
- я не понял, код уже написан и не знаем как дефайн назвать? :) - ALIGNMENT(11.02.2011 01:17, )
- Не то. Топикстартер на этапе компиляции хочет понять, поддерживает ли проц невыровненное обращение, и в зависимости от этого компилить тот или иной код. - Evgeny_CD(10.02.2011 13:08)
- Легко делается генератором мэйкфайлов (cmake, automake, scons, etc). Я делал в cmake, но видел похожее и в automake. При герерации мэйкфайла создается и компиляется маленькая программка которая запускается. Программка должна упасть при xarcass@home(273 знак., 09.02.2011 13:59, )
- всё правильно, так и делается, нужно только иметь возможность запуска на хосте кода целевой платформы - embedded(14.02.2011 02:13, )
- Да, это действительно красиво для *nix машин. Но состав *любой* среды automake и scons могут и не входить. Так что, видимо, лучше global_config.h с комментариями - что каждый параметр означает. Стандартного определения в стандартном или Evgeny_CD(47 знак., 09.02.2011 14:13)
- А вообще должен признать - я затупил. Никакой генератор не запустит эту тестовую программку на *целевой* платформе. Он просто определит выполнение условия на хосте где собирается - для эмбеддерства такой подход не годится. - xarcass@home(09.02.2011 14:23, )
- Ну не скажи :) Если среда продвинутая, дебаггер у нее "сриптованный", и отладочная плата с целевым процом подключена к кампуку, скрипт, который проверит код *на целевой платформе* организовать можно :) - Evgeny_CD(09.02.2011 14:26)
- Не надо дебагера, в файле написать с=*((char *)((int)&var +1)); Линкер должен на это ругаться, если так нельзя. - AlexBi(09.02.2011 17:32)
- Наверное, первый тоже должен быть int. Только максимум мы получим варнинг, да и то - не во всех компиляторах - testerplus(09.02.2011 17:39)
- Как-то все наборот надо. к int надо приводить указатель на int, сдвинутый на один char. - Evgeny_CD(09.02.2011 18:12)
- Не, именно к указателю на инт надо приводить нечетный инт, а потом звездочкой брать значение по этому нечетному указателю: c = *((int*)((int)&var+1)) (сама переменная var должна быть int16 или int32) - testerplus(09.02.2011 18:24 - 18:26)
- проходили. Там, где невыровненные данные не работают, этот приём ничего не давал, подставлялась одна 32-битная выборка, а не собиралось слово из отдельных байт. Да и сами посмотрите: Вы просто несколько раз преобразовываете тип указателя, но koyodza(27 знак., 09.02.2011 18:30)
- А если в несколько операций? Считать по указателю в переменную. Пошаманить с переменой. Указатель в чар и считать по адресу. +1 на указатель. Снова считать. Указатель в инт. Ну и записать по нему что-то вычисленное ранее. Все переменные volitile, Evgeny_CD(34 знак., 09.02.2011 20:05)
- всю глубину мысли ниасилил. Но если правильно понял, примерно так и делалось - koyodza(09.02.2011 20:29)
- Просто, чтобы компилятор поменьше оптимизировал, я предложил разнести это в несколько строк. И в несколько неоптимизиремых действий. - Evgeny_CD(09.02.2011 20:51)
- ну да, в первом приближении так koyodza(134 знак., 09.02.2011 21:10)
- Так топикстартер хочет определить на этапе компиляции. Я так понял, что для того, чтобы мелкому 8-битнику подсунуть менее ресурсоемкую функцию. - testerplus(09.02.2011 20:59)
- Просто, чтобы компилятор поменьше оптимизировал, я предложил разнести это в несколько строк. И в несколько неоптимизиремых действий. - Evgeny_CD(09.02.2011 20:51)
- всю глубину мысли ниасилил. Но если правильно понял, примерно так и делалось - koyodza(09.02.2011 20:29)
- Да я тоже думаю, что не будет давать ни ошибок ни варнингов. Сейчас открыт С для PIC32, компилятор молча съел, а при дебаге программа улетела по exception'у testerplus(298 знак., 09.02.2011 18:44)
- Переменная должна быть статическая, тогда у линкера будет конкретный адрес, который к инструкции не подойдет. Можно было написать *((int *)1), но не известно по каким адресам есть память, т.е. со статической переменной более универсально. - AlexBi(09.02.2011 18:51)
- Не, даже на static volatile int никак не ругается. (И на c = *((int*)1) тоже молчит.) По-моему тут никак, кроме как писал SciFi (тестировать марку компилятора) не выкрутиться. - testerplus(09.02.2011 18:56)
- Видать нужную опцию при сборке гнутых тулзов под PIC32 не поставили... - Evgeny_CD(09.02.2011 19:16)
- Не, даже на static volatile int никак не ругается. (И на c = *((int*)1) тоже молчит.) По-моему тут никак, кроме как писал SciFi (тестировать марку компилятора) не выкрутиться. - testerplus(09.02.2011 18:56)
- Переменная должна быть статическая, тогда у линкера будет конкретный адрес, который к инструкции не подойдет. Можно было написать *((int *)1), но не известно по каким адресам есть память, т.е. со статической переменной более универсально. - AlexBi(09.02.2011 18:51)
- А если в несколько операций? Считать по указателю в переменную. Пошаманить с переменой. Указатель в чар и считать по адресу. +1 на указатель. Снова считать. Указатель в инт. Ну и записать по нему что-то вычисленное ранее. Все переменные volitile, Evgeny_CD(34 знак., 09.02.2011 20:05)
- проходили. Там, где невыровненные данные не работают, этот приём ничего не давал, подставлялась одна 32-битная выборка, а не собиралось слово из отдельных байт. Да и сами посмотрите: Вы просто несколько раз преобразовываете тип указателя, но koyodza(27 знак., 09.02.2011 18:30)
- Не, именно к указателю на инт надо приводить нечетный инт, а потом звездочкой брать значение по этому нечетному указателю: c = *((int*)((int)&var+1)) (сама переменная var должна быть int16 или int32) - testerplus(09.02.2011 18:24 - 18:26)
- Как-то все наборот надо. к int надо приводить указатель на int, сдвинутый на один char. - Evgeny_CD(09.02.2011 18:12)
- Идея понятна, но скобочки и звездочки мне надо некоторое время покурить :) - Evgeny_CD(09.02.2011 17:34)
- Наверное, первый тоже должен быть int. Только максимум мы получим варнинг, да и то - не во всех компиляторах - testerplus(09.02.2011 17:39)
- Не надо дебагера, в файле написать с=*((char *)((int)&var +1)); Линкер должен на это ругаться, если так нельзя. - AlexBi(09.02.2011 17:32)
- Ну не скажи :) Если среда продвинутая, дебаггер у нее "сриптованный", и отладочная плата с целевым процом подключена к кампуку, скрипт, который проверит код *на целевой платформе* организовать можно :) - Evgeny_CD(09.02.2011 14:26)
- И не забыть приправить код проверками assert_static() и assert() на случай, если кто-нибудь забудет поправить global_config.h. - SciFi(09.02.2011 14:20)
- А вообще должен признать - я затупил. Никакой генератор не запустит эту тестовую программку на *целевой* платформе. Он просто определит выполнение условия на хосте где собирается - для эмбеддерства такой подход не годится. - xarcass@home(09.02.2011 14:23, )
- Как два пальца об асфальт - #include <datasheet.h> и вперед :)) - MBedder(09.02.2011 13:43)
- А если код общий для PIC-16 и MIPS? - fk0(09.02.2011 13:46)
- Тестировать марку компилятора. Если компилятор неизвестный - #error "разбирайтесь сами". - SciFi(09.02.2011 13:49)
- Дык в datasheet.h делается разбор - #ifdef _PIC16_ #include <PIC16F84.PDF> :)) - MBedder(09.02.2011 13:49)
- Да, я читал, что C-препроцессор -- полноценная тьюринг машина и, следовательно, может разобрать PDF... - fk0(09.02.2011 13:53)
- Ну так: #ifdef PIC16 #define MOZHNO ... #ifdef PIC24 #define NELZA. Или делается мегауниверсальный код, который предполагается собирать для любого МК? (Кстати, а что дальше собираетесь делать, уже определив можно или нельзя?) - testerplus(09.02.2011 13:58)
- Ссылка: fk0(60 знак., 09.02.2011 13:56)
- Да, я читал, что C-препроцессор -- полноценная тьюринг машина и, следовательно, может разобрать PDF... - fk0(09.02.2011 13:53)
- А если код общий для PIC-16 и MIPS? - fk0(09.02.2011 13:46)
- Легко определяется экспериментально: создать структуру из двух переменных типа char, а потом спросить разность между их поинтерами. - Ксения(10.02.2011 13:53)