-
- всё правильно, так и делается, нужно только иметь возможность запуска на хосте кода целевой платформы - 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, )