Easyelectronics.ru

Электроника для всех
Текущее время: 01 окт 2020, 18:12

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 06 апр 2016, 16:38 
Заглядывает иногда

Зарегистрирован: 03 янв 2016, 13:04
Сообщения: 80
Откуда: Казань, Набережные Челны
Программирую на Си для микроконтроллера в CoIDE (CooCox). Столкнулся с проблемой, когда я вроде инициализировал переменную ещё при объявлении вне каких-либо функций, а во время выполнения программы значение переменной не равно тому, что я инициализировал. До сих пор решал проблему инициализацией в самой main(void), но мне это неудобно, хотел разобраться в ситуации.
Show Структура кода

#define и #include выполняются отлично, а вот инициализация всяких uint32_t finish_j0=27; uint32_t finish_j1=6; uint32_t finish_j2=66; - нет.
Читал материал про всё это. Неужели придётся делать инициализацию внутри main(void)? Как надо инициализировать переменную, чтобы при выполнении кода main(void) (а значит и внутри других заданных мною void-функций) значение этой переменной было таким, как я указал в объявлении переменной?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 06 апр 2016, 18:52 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 705
#define A 10
это вообще не переменная. прекомпилятор везде где встретит А заменит в тексте на 10, до компиляции. А переменные у Вас проинициализированны правильно uint32_t finish_j0 = 27; переменная finish_j0 на начало программы должна быть равна 27; пока Вы ей не присвоите другое значение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 06 апр 2016, 19:14 
Заглядывает иногда

Зарегистрирован: 03 янв 2016, 13:04
Сообщения: 80
Откуда: Казань, Набережные Челны
void1509 писал(а):
#define A 10
это вообще не переменная. прекомпилятор везде где встретит А заменит в тексте на 10, до компиляции. А переменные у Вас проинициализированны правильно uint32_t finish_j0 = 27; переменная finish_j0 на начало программы должна быть равна 27; пока Вы ей не присвоите другое значение.

Про define знаю, да.
Но вот инициализация на практике не срабатывает :) Проверял контроллер через дебагер. Там какие-то левые значения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 06 апр 2016, 19:19 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 594
Настройки какие-то необычные наверно, стартовый код самописный? main вызывается от куда?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 06 апр 2016, 19:29 
Заглядывает иногда

Зарегистрирован: 03 янв 2016, 13:04
Сообщения: 80
Откуда: Казань, Набережные Челны
amaora писал(а):
Настройки какие-то необычные наверно, стартовый код самописный? main вызывается от куда?

Стартовый код весь из CooCox, там цепляются файлы от ST, насколько я понимаю. Startup, system... Побегал я как-то по этим файликам, есть там void Default_Reset_Handler(void), где настраивается тактирование, потом запускается main().
Show Собственно, код


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 06 апр 2016, 19:58 
Старожил

Зарегистрирован: 07 авг 2014, 17:15
Сообщения: 383
Откуда: дальнее надмосковье
Оптимизация включена? Если обычные инициализированные переменные дальше не использовать то компилятор имеет полное правило выкинуть бесполезный код.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 06 апр 2016, 20:02 
Заглядывает иногда

Зарегистрирован: 03 янв 2016, 13:04
Сообщения: 80
Откуда: Казань, Набережные Челны
arm999 писал(а):
Оптимизация включена? Если обычные инициализированные переменные дальше не использовать то компилятор имеет полное правило выкинуть бесполезный код.

Хороший вопрос. Никогда им не задавался. Залез в Configurations в CooCox, вроде бы во вкладке Compile написано None. Да и переменные потом используются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 06 апр 2016, 20:44 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
Проект-то стандартный? (startup code, linker script)
До вызова main - должна (за это отвечает startup) отработать функция вроде __copy_rom_sections_to_ram() и скопировать данные из флэша в RAM - см. http://mcuoneclipse.com/2013/04/14/text ... explained/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 06 апр 2016, 21:04 
Заглядывает иногда

Зарегистрирован: 03 янв 2016, 13:04
Сообщения: 80
Откуда: Казань, Набережные Челны
aamonster,
Цитата:
/* Copy the data segment initializers from flash to SRAM */

Вот такой комментарий есть в стартапе. Подробнее в предыдущем посте, под спойлером.
Менял разве что частоту тактирования в system. Для меня большинство кода в стартапе - как азиатские иероглифы. Про linker ничего не знаю, вряд ли я его менял.
P.S. у меня эта проблема была всегда, даже тогда, когда я не знал про стартап-файл и не знал, где настраивается изначальное тактирование :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 07 апр 2016, 12:44 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
VicSpectator, отладчиком-то по стартапу пройти не пробовали? Посмотреть - идёт копирование или нет, и заодно проверить значения _sdata, _edata и _sidata (и какие данные лежат по адресу _sidata)?

(хотя я бы поступил просто: сказал "прощай, coocox" и поставил бы какую-нибудь из альтернатив - хоть тот же IAR... он, конечно, старорежимный какой-то, но лично я с ним проблем собрал куда меньше, чем с coocox)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 07 апр 2016, 12:47 
Старожил

Зарегистрирован: 24 июн 2011, 14:05
Сообщения: 309
Откуда: Новочеркасск
А зачем функции static, в main нету return (эфекта не даёт, но компилятор должен ругаться) или сделайте void штоли.
Весь проект покажите.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 07 апр 2016, 22:43 
Заглядывает иногда

Зарегистрирован: 03 янв 2016, 13:04
Сообщения: 80
Откуда: Казань, Набережные Челны
ELEKTROS, Код целиком может отпугнуть :)
Show Много букв (весь main.c)

Плату, под которую делал код, отдал, так что проверить исправления данного кода будет затруднительно. Буду писать под другой контроллер.
static просто скопировал у кого-то, а потом выяснил, что это может защитить от вызова данной функции извне. Мне от этого static хуже не будет точно.
main у меня по умолчанию создаётся как int, я исправлять не стал :) Хотя да, можно попробовать сменить на void. Это разве повлияет на инициализацию переменных? И return у меня никогда в коде не было, всегда всё компилилось.
aamonster, К сожалению, для конкретно этого кода и этого контроллера уже не получится сделать отладку :( Но за совет спасибо, обращу внимание при работе с другим контроллером. Хотя я понятия не имею, что должно быть в этих переменных :) Несколько помог кусок кода (ниже под спойлером), но надо этот вопрос изучать дальше. Я пока что не знаю, какие должны быть значения каждой из этих переменных. За краткие пояснения или ссылку на грамотную статью буду благодарен.
Show Кусок startup

Собственно, обычно значения переменных в CooCox показываются при наведении мыши или при нажатии в контекстном меню "Open Declaration", а тут ничего не показывает. Подозреваю, что значения должны быть в каком-то linker script, но опять же понятия не имею, что это :) Так много сразу не нагуглю.
Keil уже стоит, но боюсь, что после простоты CooCox осваивать его буду долго :) Неужели код из разных сред разработки ведёт себя по-разному? Пока что ни одного аргументированного мнения на эту тему не видел, хотя я просто не искал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 08 апр 2016, 12:07 
Старожил

Зарегистрирован: 24 июн 2011, 14:05
Сообщения: 309
Откуда: Новочеркасск
Код жуть, такое использование for вообще в тупик ставит, зачем, если тут while сам напрашивается, но не об этом.
Если незнаете зачем вам static функции вообще удалите этот модификатор, три переменные finish_xxx сделайте volatile (вроде как если оптимизации нету не должно влиять, но может причуды компилятора).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 09 апр 2016, 00:44 
Заглядывает иногда

Зарегистрирован: 03 янв 2016, 13:04
Сообщения: 80
Откуда: Казань, Набережные Челны
ELEKTROS писал(а):
Код жуть, такое использование for вообще в тупик ставит, зачем, если тут while сам напрашивается, но не об этом.
Если жуть заключается только в for, то спешу обрадовать, что я уже заменил его на while. Я не против выслушать критику своего кода, но боюсь, что в данной теме это будет оффтопом.
ELEKTROS писал(а):
Если незнаете зачем вам static функции вообще удалите этот модификатор, три переменные finish_xxx сделайте volatile (вроде как если оптимизации нету не должно влиять, но может причуды компилятора).
Спасибо, и volatile попробую :) Ну хотя бы прочитал, что это такое.
P.S. Ещё бы научиться производить инициализацию отдельно от объявления. А то у меня на
Код:
data0[]={0,8,4};
ругается, а почему - не ясно. Вроде объявлял уже и тип переменных, и размер массива... Может быть из-за того, что память (FLASH) может записываться только один раз при записи?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 09 апр 2016, 02:01 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 198
VicSpectator писал(а):
Ещё бы научиться производить инициализацию отдельно от объявления. А то у меня на
Код:
data0[]={0,8,4};
ругается, а почему - не ясно. Вроде объявлял уже и тип переменных, и размер массива...

Каким сообщением ругается?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 09 апр 2016, 02:12 
Заглядывает иногда

Зарегистрирован: 03 янв 2016, 13:04
Сообщения: 80
Откуда: Казань, Набережные Челны
siarzhuk писал(а):
Каким сообщением ругается?
Если в квадратных скобках указываю размер, хотя при объявлении уже указано, то пишет:
Цитата:
error: expected expression before '{' token
А ежели размер при инициализации в квадратных скобках не указываю (пример кода в предыдущем сообщении), то пишет:
Цитата:
error: expected expression before ']' token
P.S. Я могу инициализировать только при обращении к каждому конкретному элементу, то есть:
Код:
data0[0]=0;
data0[1]=39;
и т.д. Но это же некрасиво и неудобно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 09 апр 2016, 11:50 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 198
VicSpectator писал(а):
Если в квадратных скобках указываю размер, хотя при объявлении уже указано

Ну да, инициализация списком ={...} только совместно с объявлением работает, на то она и инициализация. Т.е. исходную проблему с мусором в .data переменных вы так и не решили? :( И, кстати, что в .bss переменных? Тоже мусор?
Сгенерируйте новый проект-заготовку, добавьте туда десяток глобальных переменных с инициализацией и без оной, затем пройдите пошагово стартап в отладчике, следя за содержимым тех переменных - дальше действуйте по вновь открывшимся обстоятельствам. ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 09 апр 2016, 12:02 
Заглядывает иногда

Зарегистрирован: 03 янв 2016, 13:04
Сообщения: 80
Откуда: Казань, Набережные Челны
siarzhuk, постараюсь выделить время и побегать дебагером по стартапу заготовки :) О результате отпишусь. Надеюсь, снятия галочки-чекбокса "Run to main" достаточно для попадания в стартап.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 09 апр 2016, 13:28 
Заглядывает иногда

Зарегистрирован: 03 янв 2016, 13:04
Сообщения: 80
Откуда: Казань, Набережные Челны
Собственно, залил я заготовку. Дебагер начал работу с Default_Reset_Handler(void), который я приводил в третьем сообщении темы. Да, все эти /*---Symbols defined in linker script---*/ не нулевые. Где-то значение 10, где-то какое-то космическое значение. Пока что мне это ни о чём не говорит :) Я не знаю, какие должны быть все эти адреса. А проинициализированные мною переменные в дебагере вообще не отображаются, будто их нет :( И мышью попробовал навести в CooCox. Раньше всплывало текущее значение этой переменной, сейчас же всплывает лишь текст объявления переменной. Ещё в этой среде раньше использовал вкладку с глобальными переменными, где можно было следить за изменениями глобальных переменных, которые я выбираю. Сейчас я даже не могу добавить в этот список те переменные, которые я инициализировал.
Зато неинициализированные при объявлении переменные ведут себя как положено.
Боюсь, что копать дальше в одиночку будет намного сложнее, чем задавать начальные значения корявейшим образом в самом void main(void) :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 09 апр 2016, 13:42 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 198
VicSpectator писал(а):
А проинициализированные мною переменные в дебагере вообще не отображаются, будто их нет :(

Оптимизатор их выбросил? Вы в main с ними поиграйтесь - поскладывайте, повычитайте, в строчку sprintf-аните.
VicSpectator писал(а):
Зато неинициализированные при объявлении переменные ведут себя как положено.

Что внутри? Зачищены под ноль или мусор содержат?

PS: В Keil, например, копирование .data в RAM происходит в библиотечной процедуре __main, которой передаётся управление из стартапа. А уже эта процедура вызывает нашу реализацию main();


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 09 апр 2016, 14:05 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1953
VicSpectator, потренируйтесь сначала на кошках компе, например, с моим любимым Tiny C Compiler-ом )

_________________
mcu.goodboard.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 09 апр 2016, 15:49 
Заглядывает иногда

Зарегистрирован: 03 янв 2016, 13:04
Сообщения: 80
Откуда: Казань, Набережные Челны
siarzhuk писал(а):
Оптимизатор их выбросил? Вы в main с ними поиграйтесь - поскладывайте, повычитайте, в строчку sprintf-аните.
Как оптимизатор может что-то сделать, если я его не включал? :) Восстание машин...
Обязательно попробую просуммировать числа из невидимых проинициализированных переменных.
siarzhuk писал(а):
Что внутри? Зачищены под ноль или мусор содержат?

Изначально в неинициализированных были значения, которые присваиваются в main(void), а когда отладчик переходит в саму main(void), значения неинициализированных переменных равны нулю. Ну и дальше в процессе выполнения кода main(void) присваиваются необходимые значения.
vt340, давно хотел найти какой-нибудь простой симулятор выполнения си-кода :) Запомню. Только я думаю, тут специфика самой среды разработки. Если честно, я не считаю себя совсем новичком в программировании. На специализированном языке на базе Си уже писал, таких проблем не было.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 09 апр 2016, 17:02 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 198
VicSpectator писал(а):
Как оптимизатор может что-то сделать, если я его не включал? :)

:) Линкер "сиро́ток" тоже не любит - если по результатам сборки где-то есть map-файл - наверняка в нём оные переменные обруганы "non referenced" и по сему печальному факту безжалостно "excluded".
Инициализация .data и .bss - почётная обязанность рантайм-поддержки используемых компилятора/линкера, и программист-прикладник порой и на пенсию уходит так и не обогатив свой мозг подобными нюансами знаний. У ембеддера же дизайн посудной лавки как правило крайне минималистичен отчего слоном там беззвучно ворочать удается редко - и от общей натасканности в программировании как таковом помощи мало. Это специфичные платформенно-/компиляторно- зависимые знания - вне оных полезные разве что в копилке причуд и прецедентов. Так что Generic эмулятор тут поможет мало, как мне кажется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 09 апр 2016, 17:29 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1953
Если при формулировке вопроса-проблемы я вижу простыню кода вместо тестика в 10 строк, то сразу делаю вывод, что имею дело с проблемами начинающего, а не компилятора, и почти никогда не ошибаюсь )
И да, никого не хочу обидеть, я и сам постоянно начинающий в чём-то

_________________
mcu.goodboard.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык Си, типы переменных, объявление, инициализация
СообщениеДобавлено: 10 апр 2016, 00:58 
Заглядывает иногда

Зарегистрирован: 03 янв 2016, 13:04
Сообщения: 80
Откуда: Казань, Набережные Челны
Попробовал совершать операции с переменными. О, Боже! Он сжалился надо мной и отобразил все переменные с присвоенными им значениями, как я и желал! :) Действительно, чрезмерно умная железка проглотила неиспользуемые переменные. Теперь моё представление об объявлении и инициализации переменных соответствует действительности. Остаётся лишь вопрос, на который я уже не получу ответа: Почему у меня не инициализировались (инициализировались некорректно) переменные в другом коде под другой контроллер? Пусть это для меня останется тайной.
Всем спасибо за поддержку. Пойду дальше строчить "говнокод".


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB