|
IAR проблемы со стеком ... |
|
|
|
May 19 2008, 13:42
|
Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560

|
lcd.txt ( 1.66 килобайт )
Кол-во скачиваний: 196Господа, может подскажет кто, где почитать толковую инфу (желательно на русском) как компилятор распоряжается памятью АВРа. В частности периодически возникают ошибка CSTACK. Методом тыка изнменяя параметр в опциях ИАРа ошибка исчезает. Но программа глючит. Компилируется нормально а в железе непредсказуемые глюки связанные с передачей значений переменных внешним функциям... Образ кода сейчас подготовлю. Пробовал оптимизацию менять, переменные в разных местах обьявлять... Глючит в подсчете sum3 и в некоторых позициях sum2. Причем в зависимости от различных модификаций в разных местах. В начале была мега8 сейчас перешел на м128. на 128 еще хуже стало  Вообще дисплей отказывается текст писать...
Сообщение отредактировал Pavlike - May 19 2008, 13:54
|
|
|
|
|
May 19 2008, 14:46
|
Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560

|
'Kuzmi4'
СПАСИБО!
|
|
|
|
|
May 20 2008, 12:59
|
Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560

|
Листинг я с самого начала изучал.... но ничего там крамольного не увидел.. указателей у меня навалом в основном на тексты во флеше. А memspy я даже не знаю что это  Тут прочитал что больше 2-х переменных в функцию не стоит передавать сейчас попробую.
|
|
|
|
|
May 20 2008, 13:55
|
Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560

|
А где рамер искать? Цитата(Pavlike @ May 20 2008, 11:34)  А где рамер искать? vbb4.map
Прикрепленные файлы
vbb4.txt ( 97.38 килобайт )
Кол-во скачиваний: 171
|
|
|
|
|
May 21 2008, 07:45
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
IAR не злоупотребляет стеками. Исключение составляют лишь стандартные ф-ции printf и т.п. и то при сложных форматах вывода. Глубину стека он пишет по каждой процедуре Если также посмотреть глубину стека прерываний и учесть вложенность, то с небольшой погрешностью можно узнать потребность в стеке.
Количество параметров при вызове ф-ции вполне может быть больше 2. Здесь проблем нет никаких. Другое дело, что злоупотреблять этим не стоит, как собственно и передавать объёмные данные. Лучше в последнем случае использовать указатель.
При использовании указателей, есть шанс запортить другие данные (при неверном расчёте), включая системные, например стек. Думаю, именно это у вас и происходит. Пример прост - пытаетесь записать в 10 элемент массива данные, а выделили под массив 5. Внимательно просмотрите те процедуры исполнение которых приводит к краху. Пройдите их по шагам.
|
|
|
|
|
May 21 2008, 14:55
|
Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560

|
Спасибоо, пробую.. Обидно то, что на м8 все работало а при переходе на м128 работоспособность меняется в зависимости от оптимизации  (от вообще ничего не выводит на дисп, до почти работает но несовсем) Я в мейне обьявил переменную uchar val; судя по коду он ее положил в Р24, по ходу я вызываю из библиотеки функцию вывода на дисп. Дык он при вызове, регистры не сохраняет в стеке и смело там использует Р24 чем порит его  как заставить в стеке сохранять? или может как-то по иному обьявить переменную?
|
|
|
|
|
May 21 2008, 18:21
|
Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560

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

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|