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

 
 
> IAR проблемы со стеком ...
Pavlike
сообщение May 19 2008, 13:42
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560



Прикрепленный файл  lcd.txt ( 1.66 килобайт ) Кол-во скачиваний: 196
Господа, может подскажет кто, где почитать толковую инфу (желательно на русском) как компилятор распоряжается памятью АВРа. В частности периодически возникают ошибка CSTACK. Методом тыка изнменяя параметр в опциях ИАРа ошибка исчезает. Но программа глючит. Компилируется нормально а в железе непредсказуемые глюки связанные с передачей значений переменных внешним функциям... Образ кода сейчас подготовлю.

Пробовал оптимизацию менять, переменные в разных местах обьявлять... Глючит в подсчете sum3 и в некоторых позициях sum2. Причем в зависимости от различных модификаций в разных местах.
В начале была мега8 сейчас перешел на м128. на 128 еще хуже стало sad.gif Вообще дисплей отказывается текст писать...

Сообщение отредактировал Pavlike - May 19 2008, 13:54
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 21)
Kuzmi4
сообщение May 19 2008, 14:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 Pavlike -
например здесь в оригинале - http://www.atmel.com/dyn/resources/prod_do...nts/doc1079.pdf - страница 6.
Или сдесь - на русском - http://catalog.gaw.ru/index.php?page=document&id=1032
А колдовство со стеком - чревато, лучше прочитать литературу и делать по книжке....
Пользуйтесь поиском!!!
Go to the top of the page
 
+Quote Post
Pavlike
сообщение May 19 2008, 14:46
Сообщение #3





Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560



'Kuzmi4'

СПАСИБО!
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 19 2008, 18:37
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



1) Очень сомнительно что дело в стеке.
2) Никогда не занимайтесь ерундой типа ..."Пробовал оптимизацию менять, переменные в разных местах обьявлять...". Это - трата времени. Правильно написанная программа должна работать при любой оптимизации, а переменные надо объявлять осмысленно.

В проекте есть опции компилятора. Включите в линкере опцию листинга "модуль MAP". Просмотрите листинг и вы увидете полное распределение памяти с адресами для всех переменных, а также для стеков. Если возможно что-то отладить в отладчике, то можете выполнить следующую операцию: загрузите программу... заполните стеки каким-нибудь значением (например 00)... стартаните и поработайте... остановите работу и посмотрите зону докуда "долез стек".... Прибавьте небольшой запас.

Работаете ли вы с указателями? Пользуетесь ли вы ф-иями типа memcpy?
Go to the top of the page
 
+Quote Post
Pavlike
сообщение May 20 2008, 12:59
Сообщение #5





Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560



Листинг я с самого начала изучал.... но ничего там крамольного не увидел.. указателей у меня навалом в основном на тексты во флеше. А memspy я даже не знаю что это sad.gif Тут прочитал что больше 2-х переменных в функцию не стоит передавать сейчас попробую.
Go to the top of the page
 
+Quote Post
GDI
сообщение May 20 2008, 13:16
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Сделайте МАР файл - там указывается максимальная необходимая глубина стэка, и поставьте соответствующие значения в опциях компилятора.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Pavlike
сообщение May 20 2008, 13:55
Сообщение #7





Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560



А где рамер искать?

Цитата(Pavlike @ May 20 2008, 11:34) *
А где рамер искать?

vbb4.map
Прикрепленные файлы
Прикрепленный файл  vbb4.txt ( 97.38 килобайт ) Кол-во скачиваний: 171
 
Go to the top of the page
 
+Quote Post
GDI
сообщение May 21 2008, 06:47
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Во-первых сделайте его в html - там есть такая галка
Во-вторых генерацию стеков тоже надо галками включать(не помню точно какими, а ИАРа под руками нет).


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 21 2008, 07:45
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



IAR не злоупотребляет стеками. Исключение составляют лишь стандартные ф-ции printf и т.п. и то при сложных форматах вывода. Глубину стека он пишет по каждой процедуре Если также посмотреть глубину стека прерываний и учесть вложенность, то с небольшой погрешностью можно узнать потребность в стеке.

Количество параметров при вызове ф-ции вполне может быть больше 2. Здесь проблем нет никаких. Другое дело, что злоупотреблять этим не стоит, как собственно и передавать объёмные данные. Лучше в последнем случае использовать указатель.

При использовании указателей, есть шанс запортить другие данные (при неверном расчёте), включая системные, например стек. Думаю, именно это у вас и происходит. Пример прост - пытаетесь записать в 10 элемент массива данные, а выделили под массив 5. Внимательно просмотрите те процедуры исполнение которых приводит к краху. Пройдите их по шагам.
Go to the top of the page
 
+Quote Post
Pavlike
сообщение May 21 2008, 14:55
Сообщение #10





Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560



Спасибоо, пробую.. Обидно то, что на м8 все работало а при переходе на м128 работоспособность меняется в зависимости от оптимизации sad.gif (от вообще ничего не выводит на дисп, до почти работает но несовсем)

Я в мейне обьявил переменную uchar val;
судя по коду он ее положил в Р24, по ходу я вызываю из библиотеки функцию вывода на дисп. Дык он при вызове, регистры не сохраняет в стеке и смело там использует Р24 чем порит егоsad.gif как заставить в стеке сохранять? или может как-то по иному обьявить переменную?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 21 2008, 17:33
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Pavlike @ May 21 2008, 17:55) *
Я в мейне обьявил переменную uchar val;
судя по коду он ее положил в Р24, по ходу я вызываю из библиотеки функцию вывода на дисп. Дык он при вызове, регистры не сохраняет в стеке и смело там использует Р24 чем порит егоsad.gif
А у вас дальше в тексте эта переменная используется? Если она дальше не нужна, то компилятор имеет полное право использовать ее регистр.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Pavlike
сообщение May 21 2008, 18:21
Сообщение #12





Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560



Цитата(Сергей Борщ @ May 21 2008, 15:33) *
А у вас дальше в тексте эта переменная используется? Если она дальше не нужна, то компилятор имеет полное право использовать ее регистр.


В том то и дело что используется... А к внешней фунуции никакого отношения не имеет..
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 22 2008, 08:27
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Pavlike @ May 21 2008, 21:21) *
В том то и дело что используется... А к внешней фунуции никакого отношения не имеет..
Телепатировать желания нет. Приводите исходник. И внешней функции (на всякий случай) тоже.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GDI
сообщение May 23 2008, 07:14
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Чтобы иар не портил переменные в регистрах, объявляйте их глобальными или статическими локальными, тогда он их гарантированно разместит в SRAM-е.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 23 2008, 10:40
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GDI @ May 23 2008, 10:14) *
Чтобы иар не портил переменные в регистрах, объявляйте их глобальными или статическими локальными, тогда он их гарантированно разместит в SRAM-е.
Давайте будем исходить из того, что в нормальных условиях ни один компилятор не портит ни одну переменную. Если он переписал какое-то значение, значит либо текущее значение переменной больше не нужно, либо программист неправильно изложил свои замыслы, либо это ошибка компилятора. Именно в таком порядке по частоте. Последнее случается крайне редко. Пока в данной ветке мы не видим доказательства ошибки компилятора, и уж тем более не имеет смысла писать неоптимально - объявляя переменные глобальными просто так, на всякий случай.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GDI
сообщение May 23 2008, 11:11
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Я лишь предлагаю быстрое и гарантированное решение конкретной проблемы. При вложенных вызовах функций ИАР действительно может перезаписать локальные переменные которые он разместил в регистрах, но я не склонен с ходу объявлять такое поведение глюками компилятора, конечно же здесь имеет место недопонимание между программистом и компилятором. Можно и нужно искать причины этого недопонимания, но иногда надо сперва получить результат - конкуренты не дремлют и начальство не спит. smile.gif


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
tag
сообщение May 23 2008, 11:18
Сообщение #17


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

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(Pavlike @ May 19 2008, 17:42) *
Вообще дисплей отказывается текст писать...


...может быть в этом и зарыта собака. Вы бы исходники показали, сложно давать советы не имея перед глазами проекта.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 23 2008, 11:53
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GDI @ May 23 2008, 14:11) *
Я лишь предлагаю быстрое и гарантированное решение конкретной проблемы. При вложенных вызовах функций ИАР действительно может перезаписать локальные переменные которые он разместил в регистрах, но я не склонен с ходу объявлять такое поведение глюками компилятора,
Решение проблемы - это поиск и устранение ее причины. Вы же предлагаете некий обход проблемы, который может помочь, а может вылезти боком или здесь или дальше - если все переменные делать глобальными, то память кончится очень быстро и начнутся проблемы налезания стека на данные. Если компилятор действительно портит локальные переменные (а это пока не доказано) - то это явный глюк компилятора, но пока не доказан сам факт порчи. Если факт будет доказан - то более удачное решение - взять адрес переменной. Это заставит компилятор разместить ее на стеке и переменная не будет занимать место после завершения функции. Но опять же - компиляторы нынче ух какие умные, могут соптимизировать и это smile.gif

Цитата(GDI @ May 23 2008, 14:11) *
конечно же здесь имеет место недопонимание между программистом и компилятором. Можно и нужно искать причины этого недопонимания, но иногда надо сперва получить результат - конкуренты не дремлют и начальство не спит. smile.gif
С некоторой натяжкой можно согласиться. Причем недопонимание в подавляющем большинстве случаев со стороны программиста. И опять же, такое быстрое решение обязательно вылезет потом. Ведь никто не будет возвращаться к этому месту пока не навернется что-то еще. "Работает - не трогай". И значит бездумное использование такого обходного маневра будет продолжаться и дальше, где надо и чаще - где не надо. А когда вдруг перестанет работать - на поиск причины уйдет мама дорогая сколько времени. И когда будет найдена настоящая причина - часть "обходов" будет убрана, а часть так и останется забытой, ожидая времени, когда приподнести очередной сюрприз.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GDI
сообщение May 23 2008, 12:07
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
Причем недопонимание в подавляющем большинстве случаев со стороны программиста.

Согласен абсолютно.
Цитата
Вы же предлагаете некий обход проблемы, который может помочь, а может вылезти боком или здесь или дальше

Ну что поделать, мои телепатические способности на этом заканчиваются smile.gif. Мы с вами ведем сейчас бесполезную дискуссию, а между тем и автора давно не слышно и кода мы до сих пор не увидели.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Pavlike
сообщение May 26 2008, 11:47
Сообщение #20





Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560



Всем большое спасибо за участие! Просиженная ночь дала свои плоды smile.gif Все вроде работает нормально. Проблема решилась увеличением СSTACK почти в 2 раза. Теперь с железом глюк smile.gif) Может кто сталкивался? Нужно ли при инициализации УСАРТа (в меге128) ногу на которой ТхД назначать как оутпут DDRD=8; ? Нигде в примерах этого нету а реально не работает. Правда МК подключен напрямую к другой МК.
Go to the top of the page
 
+Quote Post
arttab
сообщение May 26 2008, 14:04
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Если включили УСАРТ, то этот вывод настраивается на выход. Вы можете включить подтяжку. Может в м128 есть особенности...


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение May 26 2008, 14:28
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Pavlike @ May 26 2008, 14:47) *
Нигде в примерах этого нету а реально не работает. Правда МК подключен напрямую к другой МК.

Мне вообще показалось, что зависит от экземпляра к экземпляру sad.gif
Теперь и выход обязательно включаю, и подтяжку внешнюю ставлю (это нужно, чтобы при сбросе не грузить приемник брейком, или вообще не вешать шину в случае хитрого интерфейса типа токовой петли).


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:26
Рейтинг@Mail.ru


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