реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Инициализация глобальных переменных, глобальные переменные не инициализируются по умолчанию
worker1
сообщение Dec 6 2012, 15:07
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-07-06
Пользователь №: 18 707



Может кто в курсе. Не инициализируется глобальная переменная в примере 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); //ответ верный
)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 6 2012, 16:26
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



А если у переменной global_var тип char заменить на тип int?
или с чаром, но
Код
printf("%hhd", global_var);

Ааааа! У вас ошибка! Нужно %d в кавычки брать.
Код
printf("global_var=%d\n", global_var);


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
worker1
сообщение Dec 6 2012, 17:00
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-07-06
Пользователь №: 18 707



Цитата(demiurg_spb @ Dec 6 2012, 20:26) *
Ааааа! У вас ошибка! Нужно %d в кавычки брать.

Про ковычки я забыл. Но вопрос не в них, а в способе инициализации переменной. Или я опцию не добавил, или компилятор у меня особенный. На другом компиляторе yagarto и mingw проблем таких не заметил.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 6 2012, 18:32
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Вы сюда ваш исходник скопипастите, а не по-памяти набитый текст, тогда глядишь что-нибудь и прояснится.
Для компиляции такого простого кейса никаких опций компилятору не нужно.
Просто достаточно в консольке: gcc main.c и всё!
Ну а т.к. у вас arm-none-eabi, то тут требуется стартап код, который и проинитит ваши глобальные переменные.
По всей видимости у вас он отсутствует.
Выкладывайте ваш makefile.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 6 2012, 19:00
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(demiurg_spb @ Dec 6 2012, 22:32) *
Выкладывайте ваш makefile.

И стартап
И скрипт линкера
smile3046.gif
Go to the top of the page
 
+Quote Post
worker1
сообщение Dec 6 2012, 19:10
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-07-06
Пользователь №: 18 707



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

Дело в том, что у меня есть некое устройство в который уже прошит стартаповый код и все библиотечные функции для работы с этим устройсвом.
Я лишь пишу логику и обновляю свою часть программы используя бутлодер.
Отладку провожу с помощью консоли. Поэтому исходник мой не поможет так как в нём нет ничего специфичного, а только логика.
Для меня было просто удивление и разочаровании, что компилятор не может инициализировать переменные как я показал в примере 1 .
У меня есть также ld скрипт. Makefile генерируется автоматически. Эти файлы прикрепил.[attachПрикрепленный файл  QP3000App.zip ( 659 байт ) Кол-во скачиваний: 88
ment=73282:nbproject.zip]
Контроллер stm32F103zdt6

Сообщение отредактировал worker1 - Dec 6 2012, 19:18
Прикрепленные файлы
Прикрепленный файл  nbproject.zip ( 7.14 килобайт ) Кол-во скачиваний: 14
 
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 6 2012, 19:39
Сообщение #7


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



При чем тута компилятор?
Вероятнее всего, тот самый стартап не пишет содержимое usr.data
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 7 2012, 05:34
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(worker1 @ Dec 6 2012, 23:10) *
Дело в том, что у меня есть некое устройство в который уже прошит стартаповый код и все библиотечные функции для работы с этим устройсвом.
Я лишь пишу логику и обновляю свою часть программы используя бутлодер.
как вы себе представляете откуда "прошитый стартаповый код" будет знать о существовании ваших глобальных переменных? И компилятор тут не причём. Вы откройте свой MAP файл, посмотрите в какую секцию складываются ваши глобальные переменные и что потом с этой секцией происходит перед вызовом main. Скачайте примеры SCMRTOS под CM3 и/или CMSIS найдите там примеры стартап файлов под gcc - изучите что да как.
Ну и конечно неплохо было бы узнать что у вас там уже прошито и с чем его едят...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
worker1
сообщение Dec 7 2012, 08:42
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 10-07-06
Пользователь №: 18 707



Извиняюсь за дезинформацию. В девайс не прошит стартап и библиотеки.
Стартап файла *.s в проекте нет, но есть файлы которые были производителем устройства даны для подключения в проект
apmain.o, syscalls.o, ctosapi.a
Прикрепил проект где нет ничего лишнего. Там также есть map файл. Может по нём можно понять что не-так.
Прикрепленный файл  small_test.zip ( 109.74 килобайт ) Кол-во скачиваний: 83
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 7 2012, 09:23
Сообщение #10


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Кстати (размышлизмы)...
Можно и со стартапом чуждым и с либами. Только вызовы - через SVC и соглашения по user.data скидывать в фиксированные адреса программы.
Go to the top of the page
 
+Quote Post
MBR
сообщение Dec 10 2012, 12:18
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



Цитата(worker1 @ Dec 7 2012, 12:42) *
Стартап файла *.s в проекте нет, но есть файлы которые были производителем устройства даны для подключения в проект

Задача стартапа не только инициализация железа, но и, в том числе, скопировать инициализированные глобальные переменные из флеша в рам. Прочитайте документацию по линкерным скриптам, посмотрите по листингам, куда попадают глобальные переменные и напишите небольшую асмовскую вставку, которая скопирует эти данные. Либо возьмите готовый скрипт и выкиньте оттуда лишнее.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 17:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01477 секунд с 7
ELECTRONIX ©2004-2016