?

Log in

No account? Create an account
 

И это определённо глюк компилятора, потому что "вылечилось" убиранием…

About Уничтожить всех уродов

Previous Entry 24 окт, 2012 @ 21:41 Next Entry
И это определённо глюк компилятора, потому что "вылечилось" убиранием ключевого слова static. Но зато теперь в переменной Uptime полная полная чепуха.

И заодно перестала работать одна из тех двух внешних плат. Точнее сказать, обе платы работают, но что-то перекосило - обмен их местами не меняет ситуацию (т.е. глюк не физический, скорее всего -- тем более что всё же работало!!!111).

И заодно перестал работать - точнее, работает непредсказуемо плохо - обмен по Dallas 1-Wire. Раньше энумерация проходила стабильно и однозначно, тем более когда я переписал всё под хардварный контроллер, а теперь то потухнет, то погаснет: находит два устройства, но не может считать их идентификаторы (?!), либо считывает два одинаковых (?!!).

Завтра набросаю тестовую программу с нуля, без всех прочих наворотов. Только обмен данными. Если она заработает (библиотеку-то я больше нигде не правил), то... не знаю, что делать.

Какое-то проклятое место.
Оставить комментарий
From:exzerodivide
Date:Октябрь, 24, 2012 20:11 (UTC)
(Link)
Два резонных вопроса:
1. Зачем менялся тулчейн и что менялось ? :-)
2. Зачем статики ?
3. Добавление префикса volatile менят что-либо ? ( в комбинации со статиком)
[User Picture Icon]
From:kincajou
Date:Октябрь, 24, 2012 20:16 (UTC)
(Link)
1. Не менялся. Использую то, что шло в комплекте с AVR Studio, до сих пор не вызывало никаких проблем
2. А зачем оно глючит? Не должно глючить
3. Не меняет, volatile static глючит точно так же
From:exzerodivide
Date:Октябрь, 24, 2012 20:36 (UTC)
(Link)
Тогда:
1. Либо мы допускаем гипотезу что на адронном коллайдере таки доигрались, либо что-то в проекте поменялись, например кто-то решил порулить памятью.
2. Способ выделения памяти со статиком и без, очевидно, различается. Отсюда напрашивается вывод, что туда кто-то лезет. Аппаратный бряк на доступ к памяти есть ?
[User Picture Icon]
From:kincajou
Date:Октябрь, 24, 2012 20:43 (UTC)
(Link)
1. Нет, ничем таким рулить я не решал. Просто начиная с непонятно какого момента код, выдаваемый компилятором, _не_совсем_ правильно работает. Не падает вроде, не виснет, но...

2. Нету бряка. И никто туда лезть не должен и не может - в теории, это забота компилятора. Больше в коде нет ни одной функции, которая могла бы менять эти значения. Uptime перещёлкивается в обработчике прерываний от медленного таймера, он щёлкает раз в секунду и это факт. Но когда я смотрю на значение, то оно выглядит так:
1, 2, 3, 4,.. (раз в секунду атомик-инкремент, как и надо),,. а потом вдруг хопа! и что-нибудь типа 8765751, 8765752, 8765753,..

вероятность того, что это в самом деле вдруг 8765751 прерываний сработало, равна нулю.

Edited at 2012-10-24 20:43 (UTC)
From:exzerodivide
Date:Октябрь, 24, 2012 20:55 (UTC)
(Link)
1. Не обязательно ты. Библиотека и ее ф-ци например. Локальная куча, списки, динамические структуры - все, что угодно.
2. "Гладко было на бумаге" :-) Мое имхо - из-за использования статика переменные и (структуры) идут плотно упакованными компилером в определенном диапазоне памяти. Любой шаг влево-вправо ведет к искажению соседних переменных при записи. Кто корежит - вот в чем вопрос. Как вариант - делать переменную структурой, так чтобы соседние байты были опкодами халта или перывания. И смотреть когда выпадет (коль нет аппаратных бряков на память)
[User Picture Icon]
From:kincajou
Date:Октябрь, 24, 2012 20:57 (UTC)
(Link)
1. Библиотеку-то не Пушкин написал...
2. Ничё не выйдет :) архитектура-то гарвардская, программа лежит в своей памяти -- данные в своей.
[User Picture Icon]
From:kincajou
Date:Октябрь, 24, 2012 20:51 (UTC)
(Link)
Самое странное тут вот в чём. Насколько я понимаю, объявление глобальной переменной (а иначе такой счётчик не сделать) как static, кроме всего прочего, ещё скроет её для всех прочих частей программы, кроме той, где эта переменная объявлена:
Static global variables: variables declared as static at the top level of a source file (outside any function definitions) are only visible throughout that file ("file scope", also known as "internal linkage").

Этого я и добивался. Чтобы переменная принадлежала только данной конкретной библиотеке и не мешалась бы, даже теоретически, в прочих местах. На сам механизм доступа к ней это не влияет и кимпилятор всё равно знает, что вот в этом месте памяти лежат чьи-то данные... опять же, теоретически - потому что в map-файле я её найти не могу. А если static убрать, то она там сразу есть. Или я чего-то не догоняю (но если эти статики такие ... хмм.. ненадёжные - зачем они вообще нужны?!), или это риальнэ глюк компилера. Причём проявился он именно щас - не раньше когда-то, не сразу после, а вот именно после возрастания сложности программы сверх какого-то критического объёма
From:exzerodivide
Date:Октябрь, 24, 2012 21:09 (UTC)
(Link)
Идея правильная. Это переменная с областью видимости в программу или функцию, сохраняющая свое значение между вызовами и в процессе выполнения. Так же понятно, что этот механизм прекрасно обходится через ссылки.
Но - он базируется на неком MMU компилера, и если у него едут мозги - то ты наблюдаешь артефакты. Вот пример http://blog.davidegrayson.com/2012/07/i-have-found-bug-in-atmel-studio-6.html

По поводу мапа:
"(BTW a local is normally created on the (data) stack but a local that is static will be in .bss - yet it's name will not be listed in .map as it's not a linkable entity)"

Не линкуецца - вот и нет в мапе.

В общем - кто-то корежит память. Как ловить - вариантов масса. Quick and Dirty - поднять версию студии.

PS Капча assembly какбе намекает :-)
[User Picture Icon]
From:kincajou
Date:Октябрь, 24, 2012 21:18 (UTC)
(Link)
не люблю ссылки и пользуюсь ими только тогда, когда иначе вообще никак

Я всё-таки завтра попробую заново отстроить программу из кусков, ранее вполне работоспособных - надо понять хотя бы тот момент, когда всё это начинает глючить. И перепишу доступ к Uptime через обёртки - сейчас-то он напрямую.. и, кстати, эта переменная даже не static, а просто volatile, причём в одном из заголовочных файлов, подключаемом в каждый кусок кода, одна указана как
extern volatile uint32_t Uptime;, а сама объявлена рядом с main(). Но обращения к ней всё равно только из двух мест - инкремент в прерывании таймера, считывание по команде с консоли (и только так!)
[User Picture Icon]
From:kincajou
Date:Октябрь, 25, 2012 04:12 (UTC)
(Link)
И ещё бесит недетерминированность. Эффекты не повторяются в строгой последовательности, особенно это проявляется с 1-wire: может определить наличие устройств правильно, но не считать идентификаторы, а нажмёшь reset - и считывает корректно. Хотя оба раза это ведь одна и та же программа с одного и того же места в неизменных условиях стартовала. Т.е. на программный глюк накладывается какой-то физический (?) эффект
From:exzerodivide
Date:Октябрь, 25, 2012 10:27 (UTC)
(Link)
А что за атмелка то хоть ?
В принципе - есть еще вариант: если ты точно знаешь, что фачится переменная с аптаймом, то можно посмотреть память на предмет соседей-переменных/структур, далее посмотреть на них - нет ли вылета за границу диапазонов.
Можно еще посмотреть на exp-sgcheck и попробовать запилить на атмелке что-то подобное.
Кстати о птичках - опции оптимизатора компилера на работособность влияют/не влияют ?
[User Picture Icon]
From:kincajou
Date:Октябрь, 25, 2012 10:35 (UTC)
(Link)
AT90CAN128

вылета за пределы диапазонов нет, потому что там, где лежит эта переменная, лежат ещё и другие - с ними всё ok

опции не влияют
From:exzerodivide
Date:Октябрь, 25, 2012 10:44 (UTC)
(Link)
OK. Ейный OCD умеет Program Memory BP и Data Memory BP. Ставь бряк на переменную с аптаймом и смотри кто туда еще лезет.
[User Picture Icon]
From:kincajou
Date:Октябрь, 25, 2012 11:31 (UTC)
(Link)
гы
а у меня как раз JTAG-коробочка сгорела... :)
From:exzerodivide
Date:Октябрь, 25, 2012 11:35 (UTC)
(Link)
Bad luck, как говорится.
А кто был ? JLink или нечто на базе FT 4232 ?
[User Picture Icon]
From:kincajou
Date:Октябрь, 25, 2012 18:03 (UTC)
(Link)
jtagice2

заказал jtagice3, жду вот
From:exzerodivide
Date:Октябрь, 25, 2012 18:34 (UTC)
(Link)
Я юзал:
1. Отечественного клона J-Link Ultra для ARM-ядер
2. Happy JTAG + FT 2232/4232 для не-ARM атмелок. Весьма бюджетно, с учетом того, что на FT до кучи делался SPI-прогамматор и прочее. MPSSE сила :-)
Получалось в итоге весьма бюджетно.
[User Picture Icon]
From:kincajou
Date:Октябрь, 25, 2012 18:39 (UTC)
(Link)
а зачем мне бюлджетно, если контора платит? мало того, ещё и требует - мол, если я не несу счета, значит ничего не делаю...
From:exzerodivide
Date:Октябрь, 25, 2012 18:51 (UTC)
(Link)
У тебя работа, у меня - хобби :-)
Взаимосвязь между счетами и ничегонеделаньем конечно забавная. А если все в софте пилится ?
Хотя - если разработчик ГУП/ФГУП/НИИ и т.д. то основной критерий - освоение бюджета, а ты его отсутствием счетов подрываешь :-)
[User Picture Icon]
From:kincajou
Date:Октябрь, 25, 2012 18:54 (UTC)
(Link)
а если всё в софте. то.. не знаю. Наверное, надо покупать новые версии пакетов.

Заказать, штоль, полновенсый матлаб.. со всеми-всеми-всеми-всеми плюшками...
From:exzerodivide
Date:Октябрь, 25, 2012 19:02 (UTC)
(Link)
Altium Designer
Matlab
Wolfram Mathematica
Solidworks
"Лицензионный Линукс" :-)
И бюджет на год исполнен.

На следующий год - миграцию на новую версию. Практически perpetuum mobile.
[User Picture Icon]
From:kincajou
Date:Октябрь, 25, 2012 19:04 (UTC)
(Link)
есть ещё спецпакеты для гидродинамических расчётов. И что-то там для электромеханики. У меня где-то записаны названия.. мнээ.. это мысль. Отдел мониторинга усрётся от жадности
(Оставить комментарий)
Top of Page Разработано LiveJournal.com