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

Инициализация глобальных переменных

Может кто в курсе. Не инициализируется глобальная переменная в примере 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); //ответ верный

)

 

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


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

А если у переменной global_var тип char заменить на тип int?

или с чаром, но

printf("%hhd", global_var);

Ааааа! У вас ошибка! Нужно %d в кавычки брать.

printf("global_var=%d\n", global_var);

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


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

Ааааа! У вас ошибка! Нужно %d в кавычки брать.

Про ковычки я забыл. Но вопрос не в них, а в способе инициализации переменной. Или я опцию не добавил, или компилятор у меня особенный. На другом компиляторе yagarto и mingw проблем таких не заметил.

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


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

Вы сюда ваш исходник скопипастите, а не по-памяти набитый текст, тогда глядишь что-нибудь и прояснится.

Для компиляции такого простого кейса никаких опций компилятору не нужно.

Просто достаточно в консольке: gcc main.c и всё!

Ну а т.к. у вас arm-none-eabi, то тут требуется стартап код, который и проинитит ваши глобальные переменные.

По всей видимости у вас он отсутствует.

Выкладывайте ваш makefile.

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


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

Вы сюда ваш исходник скопипастите, а не по-памяти набитый текст, тогда глядишь что-нибудь и прояснится.

Для компиляции такого простого кейса никаких опций компилятору не нужно.

Просто достаточно в консольке: gcc main.c и всё!

Ну а т.к. у вас arm-none-eabi, то тут требуется стартап код, который и проинитит ваши глобальные переменные.

По всей видимости у вас он отсутствует.

Выкладывайте ваш makefile.

Дело в том, что у меня есть некое устройство в который уже прошит стартаповый код и все библиотечные функции для работы с этим устройсвом.

Я лишь пишу логику и обновляю свою часть программы используя бутлодер.

Отладку провожу с помощью консоли. Поэтому исходник мой не поможет так как в нём нет ничего специфичного, а только логика.

Для меня было просто удивление и разочаровании, что компилятор не может инициализировать переменные как я показал в примере 1 .

У меня есть также ld скрипт. Makefile генерируется автоматически. Эти файлы прикрепил.[attachQP3000App.zipment=73282:nbproject.zip]

Контроллер stm32F103zdt6

nbproject.zip

Изменено пользователем worker1

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


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

При чем тута компилятор?

Вероятнее всего, тот самый стартап не пишет содержимое usr.data

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


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

Дело в том, что у меня есть некое устройство в который уже прошит стартаповый код и все библиотечные функции для работы с этим устройсвом.

Я лишь пишу логику и обновляю свою часть программы используя бутлодер.

как вы себе представляете откуда "прошитый стартаповый код" будет знать о существовании ваших глобальных переменных? И компилятор тут не причём. Вы откройте свой MAP файл, посмотрите в какую секцию складываются ваши глобальные переменные и что потом с этой секцией происходит перед вызовом main. Скачайте примеры SCMRTOS под CM3 и/или CMSIS найдите там примеры стартап файлов под gcc - изучите что да как.

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

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


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

Извиняюсь за дезинформацию. В девайс не прошит стартап и библиотеки.

Стартап файла *.s в проекте нет, но есть файлы которые были производителем устройства даны для подключения в проект

apmain.o, syscalls.o, ctosapi.a

Прикрепил проект где нет ничего лишнего. Там также есть map файл. Может по нём можно понять что не-так.

small_test.zip

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


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

Кстати (размышлизмы)...

Можно и со стартапом чуждым и с либами. Только вызовы - через SVC и соглашения по user.data скидывать в фиксированные адреса программы.

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


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

Стартап файла *.s в проекте нет, но есть файлы которые были производителем устройства даны для подключения в проект

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

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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