vitbvv12 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 · Жалоба Может кто в курсе. Не инициализируется глобальная переменная в примере 1. В примере 2 всё хорошо. Но мне надо работающий пример 1. Версия компилятора: $ ./gcc -v Using built-in specs. Target: arm-none-eabi Configured with: ../configure --target=arm-none-eabi --prefix=/usr/local/cross-c ortex --enable-interwork --enable-multilib --enable-languages=c,c++ --with-newli b --without-headers --disable-shared --with-gnu-as --with-gnu-ld Thread model: single gcc version 4.4.3 (GCC) Пример 1 сhar global_var=109; Void Main () { Printf (%d, global_var); //ответ неверный ) Пример 2 сhar global_var; Void Main () { global_var=109; Printf (%d, global_var); //ответ верный ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 · Жалоба А если у переменной global_var тип char заменить на тип int? или с чаром, но printf("%hhd", global_var); Ааааа! У вас ошибка! Нужно %d в кавычки брать. printf("global_var=%d\n", global_var); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitbvv12 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 · Жалоба Ааааа! У вас ошибка! Нужно %d в кавычки брать. Про ковычки я забыл. Но вопрос не в них, а в способе инициализации переменной. Или я опцию не добавил, или компилятор у меня особенный. На другом компиляторе yagarto и mingw проблем таких не заметил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 · Жалоба Вы сюда ваш исходник скопипастите, а не по-памяти набитый текст, тогда глядишь что-нибудь и прояснится. Для компиляции такого простого кейса никаких опций компилятору не нужно. Просто достаточно в консольке: gcc main.c и всё! Ну а т.к. у вас arm-none-eabi, то тут требуется стартап код, который и проинитит ваши глобальные переменные. По всей видимости у вас он отсутствует. Выкладывайте ваш makefile. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 · Жалоба Выкладывайте ваш makefile. И стартап И скрипт линкера :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitbvv12 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 (изменено) · Жалоба Вы сюда ваш исходник скопипастите, а не по-памяти набитый текст, тогда глядишь что-нибудь и прояснится. Для компиляции такого простого кейса никаких опций компилятору не нужно. Просто достаточно в консольке: gcc main.c и всё! Ну а т.к. у вас arm-none-eabi, то тут требуется стартап код, который и проинитит ваши глобальные переменные. По всей видимости у вас он отсутствует. Выкладывайте ваш makefile. Дело в том, что у меня есть некое устройство в который уже прошит стартаповый код и все библиотечные функции для работы с этим устройсвом. Я лишь пишу логику и обновляю свою часть программы используя бутлодер. Отладку провожу с помощью консоли. Поэтому исходник мой не поможет так как в нём нет ничего специфичного, а только логика. Для меня было просто удивление и разочаровании, что компилятор не может инициализировать переменные как я показал в примере 1 . У меня есть также ld скрипт. Makefile генерируется автоматически. Эти файлы прикрепил.[attachQP3000App.zipment=73282:nbproject.zip] Контроллер stm32F103zdt6 nbproject.zip Изменено 6 декабря, 2012 пользователем worker1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 6 декабря, 2012 Опубликовано 6 декабря, 2012 · Жалоба При чем тута компилятор? Вероятнее всего, тот самый стартап не пишет содержимое usr.data Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 7 декабря, 2012 Опубликовано 7 декабря, 2012 · Жалоба Дело в том, что у меня есть некое устройство в который уже прошит стартаповый код и все библиотечные функции для работы с этим устройсвом. Я лишь пишу логику и обновляю свою часть программы используя бутлодер. как вы себе представляете откуда "прошитый стартаповый код" будет знать о существовании ваших глобальных переменных? И компилятор тут не причём. Вы откройте свой MAP файл, посмотрите в какую секцию складываются ваши глобальные переменные и что потом с этой секцией происходит перед вызовом main. Скачайте примеры SCMRTOS под CM3 и/или CMSIS найдите там примеры стартап файлов под gcc - изучите что да как. Ну и конечно неплохо было бы узнать что у вас там уже прошито и с чем его едят... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitbvv12 0 7 декабря, 2012 Опубликовано 7 декабря, 2012 · Жалоба Извиняюсь за дезинформацию. В девайс не прошит стартап и библиотеки. Стартап файла *.s в проекте нет, но есть файлы которые были производителем устройства даны для подключения в проект apmain.o, syscalls.o, ctosapi.a Прикрепил проект где нет ничего лишнего. Там также есть map файл. Может по нём можно понять что не-так. small_test.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 7 декабря, 2012 Опубликовано 7 декабря, 2012 · Жалоба Кстати (размышлизмы)... Можно и со стартапом чуждым и с либами. Только вызовы - через SVC и соглашения по user.data скидывать в фиксированные адреса программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mbr 0 10 декабря, 2012 Опубликовано 10 декабря, 2012 · Жалоба Стартап файла *.s в проекте нет, но есть файлы которые были производителем устройства даны для подключения в проект Задача стартапа не только инициализация железа, но и, в том числе, скопировать инициализированные глобальные переменные из флеша в рам. Прочитайте документацию по линкерным скриптам, посмотрите по листингам, куда попадают глобальные переменные и напишите небольшую асмовскую вставку, которая скопирует эти данные. Либо возьмите готовый скрипт и выкиньте оттуда лишнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться