Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Инициализация глобальных переменных
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
worker1
Может кто в курсе. Не инициализируется глобальная переменная в примере 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
А если у переменной global_var тип char заменить на тип int?
или с чаром, но
Код
printf("%hhd", global_var);

Ааааа! У вас ошибка! Нужно %d в кавычки брать.
Код
printf("global_var=%d\n", global_var);
worker1
Цитата(demiurg_spb @ Dec 6 2012, 20:26) *
Ааааа! У вас ошибка! Нужно %d в кавычки брать.

Про ковычки я забыл. Но вопрос не в них, а в способе инициализации переменной. Или я опцию не добавил, или компилятор у меня особенный. На другом компиляторе yagarto и mingw проблем таких не заметил.
demiurg_spb
Вы сюда ваш исходник скопипастите, а не по-памяти набитый текст, тогда глядишь что-нибудь и прояснится.
Для компиляции такого простого кейса никаких опций компилятору не нужно.
Просто достаточно в консольке: gcc main.c и всё!
Ну а т.к. у вас arm-none-eabi, то тут требуется стартап код, который и проинитит ваши глобальные переменные.
По всей видимости у вас он отсутствует.
Выкладывайте ваш makefile.
_Pasha
Цитата(demiurg_spb @ Dec 6 2012, 22:32) *
Выкладывайте ваш makefile.

И стартап
И скрипт линкера
smile3046.gif
worker1
Цитата(demiurg_spb @ Dec 6 2012, 22:32) *
Вы сюда ваш исходник скопипастите, а не по-памяти набитый текст, тогда глядишь что-нибудь и прояснится.
Для компиляции такого простого кейса никаких опций компилятору не нужно.
Просто достаточно в консольке: gcc main.c и всё!
Ну а т.к. у вас arm-none-eabi, то тут требуется стартап код, который и проинитит ваши глобальные переменные.
По всей видимости у вас он отсутствует.
Выкладывайте ваш makefile.

Дело в том, что у меня есть некое устройство в который уже прошит стартаповый код и все библиотечные функции для работы с этим устройсвом.
Я лишь пишу логику и обновляю свою часть программы используя бутлодер.
Отладку провожу с помощью консоли. Поэтому исходник мой не поможет так как в нём нет ничего специфичного, а только логика.
Для меня было просто удивление и разочаровании, что компилятор не может инициализировать переменные как я показал в примере 1 .
У меня есть также ld скрипт. Makefile генерируется автоматически. Эти файлы прикрепил.[attachНажмите для просмотра прикрепленного файлаment=73282:nbproject.zip]
Контроллер stm32F103zdt6
_Pasha
При чем тута компилятор?
Вероятнее всего, тот самый стартап не пишет содержимое usr.data
demiurg_spb
Цитата(worker1 @ Dec 6 2012, 23:10) *
Дело в том, что у меня есть некое устройство в который уже прошит стартаповый код и все библиотечные функции для работы с этим устройсвом.
Я лишь пишу логику и обновляю свою часть программы используя бутлодер.
как вы себе представляете откуда "прошитый стартаповый код" будет знать о существовании ваших глобальных переменных? И компилятор тут не причём. Вы откройте свой MAP файл, посмотрите в какую секцию складываются ваши глобальные переменные и что потом с этой секцией происходит перед вызовом main. Скачайте примеры SCMRTOS под CM3 и/или CMSIS найдите там примеры стартап файлов под gcc - изучите что да как.
Ну и конечно неплохо было бы узнать что у вас там уже прошито и с чем его едят...
worker1
Извиняюсь за дезинформацию. В девайс не прошит стартап и библиотеки.
Стартап файла *.s в проекте нет, но есть файлы которые были производителем устройства даны для подключения в проект
apmain.o, syscalls.o, ctosapi.a
Прикрепил проект где нет ничего лишнего. Там также есть map файл. Может по нём можно понять что не-так.
Нажмите для просмотра прикрепленного файла
_Pasha
Кстати (размышлизмы)...
Можно и со стартапом чуждым и с либами. Только вызовы - через SVC и соглашения по user.data скидывать в фиксированные адреса программы.
MBR
Цитата(worker1 @ Dec 7 2012, 12:42) *
Стартап файла *.s в проекте нет, но есть файлы которые были производителем устройства даны для подключения в проект

Задача стартапа не только инициализация железа, но и, в том числе, скопировать инициализированные глобальные переменные из флеша в рам. Прочитайте документацию по линкерным скриптам, посмотрите по листингам, куда попадают глобальные переменные и напишите небольшую асмовскую вставку, которая скопирует эти данные. Либо возьмите готовый скрипт и выкиньте оттуда лишнее.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.