klen 1 24 ноября, 2010 Опубликовано 24 ноября, 2010 · Жалоба memcpy я нигде не использую, компилятор вставляет ее сам (например, при присваивании структур). Линкер не может найти. 1. я бы на месте компиллера тоже самое сделал. наверно хотя это не его собачче дело функции вызывать, код генерить копирующий да, но функции... 2. однакож... я если честно не знал что в С структуры можно присваивать.... век живи век учись... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 25 ноября, 2010 Опубликовано 25 ноября, 2010 · Жалоба правильно я думаю, что принеобходимости gcc сам вызовет ld (например, для выполнения скрипта линкера)?gcc (gcc.exe) это не компилятор а программа управления компиляторами. Весь пакет GCC — это GnuCompilerCollection, а исполняемый файл gcc это сокрее GnuCompilerController. Он вызывает ld всегда, если его не попросить специально этого не делать ключиками -c, -S, -E. Не вызывает компилятор, если на входе указаны только объектные файлы. Вызывает ассемблер, если на входе файл .s Зная заданные при сборке пути, сам их подставляет куда надо (запуская препроцесор, компилятор, линкер). И так далее. Т.е. делает много вещей по умолчанию, которые иначе пришлось бы делать вручную. Даже оптимизация может выполняться отдельными исполняемыми файлами и cc вызывает их только если оптимизация задана. А по поводу -l, насколько я понимаю, дело в этом The only difference between using an -l option and specifying a file name is that -l surrounds library with `lib' and `.a' and searches several directories.Задавая через -l Вы просите его поискать библиотеку и в каталогах по умолчанию. Задавая в командной строке полное имя библиотеки — взять библиотеку в текущем каталоге либо в указанных по -L Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 25 ноября, 2010 Опубликовано 25 ноября, 2010 · Жалоба век живи век учись...Это да... Ну так стандартная функция div ведь возвращает структуру, которая присваивается структуре. div_t x = div(n, 10U); Жаль что нельзя инициализировать структуру константой после её объявления: div_t x = {10, 10}; // можно div_t y; y = {10, 10}; // нельзя Жаль что нельзя сравнивать структуры на равенство: div_t x = {10,10}; div_t y = {10,10}; if (x==y) { } С чего бы такие ограничения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 25 ноября, 2010 Опубликовано 25 ноября, 2010 · Жалоба спасибо за ответы. Про gcc я так и думал - мол, делает все за всех о чем его надо просить ключиками. Не ясно почему не работает ld, но сейчас это уже не актуально - надеюсь, со временем осознание придет. так) Проект компилируется и даже работает код в железе (причем используются прерывания). Теперь не могу найти откуда берется таблица векторов прерываний (или весь startup). По сути мне нужно прописать новое прерывание (для SDIO), в файле stm32f10x_it.c его нет. Где почитать по этому вопросу (редактирование таблицы векторов прерываний, стартап и т.п.)? + где почитать о том, что делается до функции main (инициализация переменных и т.п.) + как задавать размер стека и его положение (сейчас жестко задаю размер и положение; как хотя бы приблизительно узнать необходимый размер стека)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 25 ноября, 2010 Опубликовано 25 ноября, 2010 · Жалоба Жаль что нельзя инициализировать структуру константой после её объявления: div_t x = {10, 10}; // можно div_t y; y = {10, 10}; // нельзя C99 6.5.2.5 Compound literals Иногда пользуюсь. struct foo { int a, b; }; struct foo foo1; void moo() { foo1 = (struct foo){1, 2}; } gcc -O2 -S -std=c89 --pedantic stru.c str.c: In function ‘moo’: stru.c:9: warning: ISO C90 forbids compound literals gcc -O2 -S -std=c99 --pedantic stru.c cat stru.s .file "stru.c" .text .p2align 4,,15 .globl moo .type moo, @function moo: .LFB0: .cfi_startproc movl $1, foo1(%rip) movl $2, foo1+4(%rip) ret .cfi_endproc .LFE0: Жаль что нельзя сравнивать структуры на равенство: ... С чего бы такие ограничения? Ну батенька, Вам мёд, да ещё и ложкой :-) Не ясно почему не работает ld,Задать каталоги библиотек компилятора через ключ -L пробовали? gcc ему их подсовывает от себя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 25 ноября, 2010 Опубликовано 25 ноября, 2010 · Жалоба 2. однакож... я если честно не знал что в С структуры можно присваивать.... век живи век учись... Присваивать-то можно, но не факт что оптимально будет присваиваться. Всё-таки memcpy() предпочтительнее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 25 ноября, 2010 Опубликовано 25 ноября, 2010 · Жалоба Кстати, оно даже так работает void baa( struct foo *p); void kwa() { baa( &(struct foo){ 5, 6} ); } Создаёт на стеке временную переменную типа struct foo, заполняет её и адрес передаёт. Вот avr-gcc. Ничем не отличается от явного указания локальной переменной с её инициализацией. .global kwa .type kwa, @function kwa: push r29 push r28 rcall . rcall . in r28,__SP_L__ in r29,__SP_H__ /* prologue: function */ /* frame size = 4 */ ldi r24,lo8(5) ldi r25,hi8(5) std Y+2,r25 std Y+1,r24 ldi r24,lo8(6) ldi r25,hi8(6) std Y+4,r25 std Y+3,r24 movw r24,r28 adiw r24,1 rcall baa /* epilogue start */ pop __tmp_reg__ pop __tmp_reg__ pop __tmp_reg__ pop __tmp_reg__ pop r28 pop r29 ret Именно так и пользовался — для инициализиации записей в EEPROM значениями по умолчанию при слёте CRC (ну, тех записей, которые можно было просто переинициализировать). Присваивать-то можно, но не факт что оптимально будет присваиваться. Всё-таки memcpy() предпочтительнее Так выше ж было сказано, что он memcpy для этого и вызывает. Когда-то раньше, кто-то другой, кто не умел по месту разбираться в длине/её константности в вызове memcpy и вызывал именно функцию memcpy всегда, для копирования структур присваиванием прикидывал и либо делал почленное копирования по месту, либо вызывал memcpy. Так что присваивание структур компилировалось оптимально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 25 ноября, 2010 Опубликовано 25 ноября, 2010 · Жалоба Ну это вы напрасно:) Думаю, что значительно более половины тутошних виндузятников сидит под ХР 32-бит, и ещё какое-то время никуда не двинутся. Особенно в свете того, что, как я читал, 7-я винда не даёт ставить неподписанные дрова (прощайте LPT-шные программаторы с giveio, прощай olimex MSP430-JTAG-TINY, и ещё куча интересных железок.) Ну или, если говорить только про себя, то лично я пока сижу под ХР 32-бит:) Мне админ поставил 7-ку на пару недель, потом полетел винт, и на новый вернул опять ХР. Брезгует семёрка нормально работать в сети с 2003 Server, хочет 2008... По идее конечно, надо переходить на 64, но только не винду.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 25 ноября, 2010 Опубликовано 25 ноября, 2010 · Жалоба C99 6.5.2.5 Compound literals Иногда пользуюсь. О! Не знал. Спасибо! Ну батенька, Вам мёд, да ещё и ложкой :-)Ага! Каштановый медок обожаю!:-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 26 ноября, 2010 Опубликовано 26 ноября, 2010 · Жалоба спасибо за ответы. Про gcc я так и думал - мол, делает все за всех о чем его надо просить ключиками. Не ясно почему не работает ld, но сейчас это уже не актуально - надеюсь, со временем осознание придет. так) Проект компилируется и даже работает код в железе (причем используются прерывания). Теперь не могу найти откуда берется таблица векторов прерываний (или весь startup). По сути мне нужно прописать новое прерывание (для SDIO), в файле stm32f10x_it.c его нет. Где почитать по этому вопросу (редактирование таблицы векторов прерываний, стартап и т.п.)? + где почитать о том, что делается до функции main (инициализация переменных и т.п.) + как задавать размер стека и его положение (сейчас жестко задаю размер и положение; как хотя бы приблизительно узнать необходимый размер стека)? Разобрался. Все меня интересующее было в файлике stm32f10x_vector.c. Проект с Keil успешно переведен под gcc! Осталось только причесать, но с этим справлюсь самостоятельно. ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spym 0 13 декабря, 2010 Опубликовано 13 декабря, 2010 · Жалоба klen, скажите, а как обстоят дела с поддержкой C++ исключений на AVR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 14 декабря, 2010 Опубликовано 14 декабря, 2010 · Жалоба klen, скажите, а как обстоят дела с поддержкой C++ исключений на AVR? а четр его знает, я не пробывал. тут и без с++ исключений тяжко - во превых никак не могут в транке поченить складывание отладочной информации dwarf в бинарник, во вторых с++ на AVR это для лично для меня из области сферически-вакумных коней, а уж исключения... их на больших машинах иногда отключают - дорогое удовольствие (код размотки исключений + вся их инфраструктура во всех моих проектах была больше (~44k) чем целевой код, в итоге я таки научился вместе скомпиллером все это отключать). в третих - буквально в воскресенье позвонил старый сослуживец, мы сним начинали делать аппарат прозвонка на 1000 контактов (кабельные пауки тестить), так вот я начинал делать на модулях с кортексами, я уволился, он не имея опыта по армам все переделал на атмегах1280. решение орг проблем по девайсу заняло 9 месяцев - теперь он в панике просит все переделать в зад на кортексах потому как с мегами жопа начилась. неможет их купить, а нада сотнями штук! короце друзья - с авэров я слез окончательно и бесповоротно чего и вам желаю. возможно все вышесказанное не относится к AVR32. я для авр сборки не выкладываю не потому что забил, потому что не получается c отладочной информацией elf заставить gcc генерить :( если нада я могу свежак собрать - я уверен что код будет генерится хороший но в AVRStudio можно будет только по асму ползать при симуляции. свежак для армов 64bit host http://www.klen.org/Files/DevTools/kgp-arm...-64_20101212.7z 32bit host http://www.klen.org/Files/DevTools/kgp-arm...-32_20101212.7z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
garlands 0 14 декабря, 2010 Опубликовано 14 декабря, 2010 · Жалоба Мне админ поставил 7-ку на пару недель, потом полетел винт, и на новый вернул опять ХР. Брезгует семёрка нормально работать в сети с 2003 Server, хочет 2008... По идее конечно, надо переходить на 64, но только не винду.. #define offtop_mode да Вы что??! =0 у меня на работе стояла семерка, а файлопомойка вообще на 2000 винде была. и ничего, все нормально ходило. это примерно как на позапрошлой работе у меня вся контора (а это без малого полторы тысячи человек) сидела на 2000 винде только потому, что админ (линуксоид просто супер, а вот в винде...) не знал, что хрюшу можно завтавить пускать на шару не только под гостевой учеткой... ;) #undef offtop_mode Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 14 декабря, 2010 Опубликовано 14 декабря, 2010 · Жалоба свежак для армов ... 32bit host Работает (at91sam7sxxx). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 14 декабря, 2010 Опубликовано 14 декабря, 2010 · Жалоба дорогое удовольствие (код размотки исключений + вся их инфраструктураТам, если я правильно понял, не только код, но и на стеке дополнительная информация для размотчика должна быть, т.е. ОЗУ тоже полетит. Для AVR не вижу возможности применять. Разве что на самых толстых, но тут уже не вижу смысла их самих применять (кроме, разве что, atxmega). я для авр сборки не выкладываю не потому что забил, потому что не получается c отладочной информацией elf заставить gcc генерить :( если нада я могу свежак собрать - я уверен что код будет генерится хороший но в AVRStudio можно будет только по асму ползать при симуляции. По студиям не ползаю. Только мне бы сборочки AVR и ARM под Linux-64… Всё лень самому научиться это делать… Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться