Перейти к содержанию
    

memcpy я нигде не использую, компилятор вставляет ее сам (например, при присваивании структур). Линкер не может найти.

1. я бы на месте компиллера тоже самое сделал. наверно хотя это не его собачче дело функции вызывать, код генерить копирующий да, но функции...

2. однакож... я если честно не знал что в С структуры можно присваивать.... век живи век учись...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

правильно я думаю, что принеобходимости 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

век живи век учись...
Это да...

 

Ну так стандартная функция 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)
{
}

С чего бы такие ограничения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо за ответы.

 

Про gcc я так и думал - мол, делает все за всех о чем его надо просить ключиками. Не ясно почему не работает ld, но сейчас это уже не актуально - надеюсь, со временем осознание придет.

 

так)

 

Проект компилируется и даже работает код в железе (причем используются прерывания).

Теперь не могу найти откуда берется таблица векторов прерываний (или весь startup).

По сути мне нужно прописать новое прерывание (для SDIO), в файле stm32f10x_it.c его нет.

Где почитать по этому вопросу (редактирование таблицы векторов прерываний, стартап и т.п.)?

+ где почитать о том, что делается до функции main (инициализация переменных и т.п.)

+ как задавать размер стека и его положение (сейчас жестко задаю размер и положение; как хотя бы приблизительно узнать необходимый размер стека)?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Жаль что нельзя инициализировать структуру константой после её объявления:

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 ему их подсовывает от себя.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2. однакож... я если честно не знал что в С структуры можно присваивать.... век живи век учись...

Присваивать-то можно, но не факт что оптимально будет присваиваться.

Всё-таки memcpy() предпочтительнее

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, оно даже так работает

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. Так что присваивание структур компилировалось оптимально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну это вы напрасно:) Думаю, что значительно более половины тутошних виндузятников сидит под ХР 32-бит, и ещё какое-то время никуда не двинутся. Особенно в свете того, что, как я читал, 7-я винда не даёт ставить неподписанные дрова (прощайте LPT-шные программаторы с giveio, прощай olimex MSP430-JTAG-TINY, и ещё куча интересных железок.)

Ну или, если говорить только про себя, то лично я пока сижу под ХР 32-бит:)

Мне админ поставил 7-ку на пару недель, потом полетел винт, и на новый вернул опять ХР.

Брезгует семёрка нормально работать в сети с 2003 Server, хочет 2008...

По идее конечно, надо переходить на 64, но только не винду..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

C99 6.5.2.5 Compound literals

Иногда пользуюсь.

О! Не знал. Спасибо!

Ну батенька, Вам мёд, да ещё и ложкой :-)
Ага! Каштановый медок обожаю!:-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо за ответы.

 

Про gcc я так и думал - мол, делает все за всех о чем его надо просить ключиками. Не ясно почему не работает ld, но сейчас это уже не актуально - надеюсь, со временем осознание придет.

 

так)

 

Проект компилируется и даже работает код в железе (причем используются прерывания).

Теперь не могу найти откуда берется таблица векторов прерываний (или весь startup).

По сути мне нужно прописать новое прерывание (для SDIO), в файле stm32f10x_it.c его нет.

Где почитать по этому вопросу (редактирование таблицы векторов прерываний, стартап и т.п.)?

+ где почитать о том, что делается до функции main (инициализация переменных и т.п.)

+ как задавать размер стека и его положение (сейчас жестко задаю размер и положение; как хотя бы приблизительно узнать необходимый размер стека)?

 

Разобрался. Все меня интересующее было в файлике stm32f10x_vector.c.

 

Проект с Keil успешно переведен под gcc! Осталось только причесать, но с этим справлюсь самостоятельно.

)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне админ поставил 7-ку на пару недель, потом полетел винт, и на новый вернул опять ХР.

Брезгует семёрка нормально работать в сети с 2003 Server, хочет 2008...

По идее конечно, надо переходить на 64, но только не винду..

#define offtop_mode

да Вы что??! =0 у меня на работе стояла семерка, а файлопомойка вообще на 2000 винде была. и ничего, все нормально ходило.

это примерно как на позапрошлой работе у меня вся контора (а это без малого полторы тысячи человек) сидела на 2000 винде только потому, что админ (линуксоид просто супер, а вот в винде...) не знал, что хрюшу можно завтавить пускать на шару не только под гостевой учеткой... ;)

#undef offtop_mode

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

свежак для армов

...

32bit host

 

Работает (at91sam7sxxx).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

дорогое удовольствие (код размотки исключений + вся их инфраструктура
Там, если я правильно понял, не только код, но и на стеке дополнительная информация для размотчика должна быть, т.е. ОЗУ тоже полетит.

Для AVR не вижу возможности применять. Разве что на самых толстых, но тут уже не вижу смысла их самих применять (кроме, разве что, atxmega).

 

я для авр сборки не выкладываю не потому что забил, потому что не получается c отладочной информацией elf заставить gcc генерить :(

если нада я могу свежак собрать - я уверен что код будет генерится хороший но в AVRStudio можно будет только по асму ползать при симуляции.

По студиям не ползаю.

 

Только мне бы сборочки AVR и ARM под Linux-64… Всё лень самому научиться это делать…

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...