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

 
 
> CVAVR "повреждене" локальных переменных
MKdemiurg
сообщение Sep 15 2011, 15:01
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939



Пишу прожэкт на CоdeVisionAVR 1.25.5 под atmega128A.

Столкнулся с проблемой , что по неопределённым причинам портитятся значения локальных переменных. Т.е. проблема выглядит так :
...................................................
void modem_control(void)
{
unsigned char step;
unsigned char conflict;
unsigned char atc_retry_number;
unsigned char repeat;
// специально присваиваю значения отдельно от инициализации
step=1;
atc_retry_number=3;
repeat=3;
conflict=0;

while (step!=100)
{ OUT_COM0_CHAR(conflcit); // вывод в уарт переменной conflict. Вместо 0x00 приходит 0xC0 - соответственно выполнение кода сбивается...
..............................................................................

эффект периодический, причину возникновения так и не нашёл, НО смена порядка инициализации переменных меняет и переменную , которая "глючит".. Такая же лажа периодически появляется в функции main. Стека всего то 190/1024 использую. Может оптимизатор глючит- но тогда бы проблема была более менее периодичной...

Проект не то чтобы большой( 10К строк и 20К флеша), но переделывать под другой компилятор долго и осваивать нужно, а время поджимает.

Подскажите где могут быть грабли. Может сама версия нестабильна? Слышал что 1.25.5 может генерить неправильный код... Подскажите более менее нормальную и неглючащую...



Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MKdemiurg
сообщение Sep 15 2011, 16:55
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939



Цитата(kovigor @ Sep 15 2011, 19:32) *
Возможно, переполняется стек и собой затирает переменные. Попробуйте в опциях проекта увеличить размер стека.
Ну или вы с указателями где-то накосячили.
Я уже не говорю о том, что скорость UART м.б. неправильно выставлена.
Например, что будет, если выводить не по UART, а куда-то в другое место ?
И еще. OUT_COM0_CHAR ждет окончания передачи предыдущего байта, или ничего не ждет и тупо пишет в UART независимо от его готовности ?
Еще возможно переполнение буфера драйвера на стороне PC и как следствие - потеря данных. Что будет, если передавать не переменную, а число ? Оно тоже будет биться ?


Стек выставлен на 1 Кбайт, при компиляции пишет, что используется 190байт.

С указателями возможно, но блин, я даже не знаю как к ним подступить sad.gif , ибо их я наплодил десятки... jtaga нема, да и программу особо не потрассируешь... Растянута по времени на часы... Попробую покопаться в указателях ... Но какая зависимость непонятно. Все массивы и структуры статичны - если бы где то вылезало за предел выделяемой памяти - ошибка была бы постоянной, да и слетают переменные в местах где указатели не меняются

Дело не в UART 100%, т.к. меняется даже ход выполнения программы, который я тоже контролирую через uart икоторый зависит от этих переменных.


ЗЫ - вот так 1 баг где нибудь и всё программирование сводится к танцу с бубном biggrin.gif .

Go to the top of the page
 
+Quote Post
kovigor
сообщение Sep 15 2011, 17:06
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(MKdemiurg @ Sep 15 2011, 19:55) *
Дело не в UART 100%, т.к. меняется даже ход выполнения программы, который я тоже контролирую через uart икоторый зависит от этих переменных.


А тут не может быть какой-то хитрой завязки ? Просто эта фраза очень странно звучит.

Еще идея: попробуйте повыключать некоторые обработчики прерываний, насколько это возможно, и посмотрите, что будет. Вообще, почти наверняка дело в одном из обработчиков.

Да, и еще. Это может быть ошибка в использовании типов. Например, вы по ошибке пишете в unsigned char 16-разрядное число.

Ну и последнее. Как показывает мной многолетний опыт, самые сложные и трудноуловимые ошибки почти всегда имеют до смешного простые причины. Так что ...

Сообщение отредактировал IgorKossak - Sep 15 2011, 18:50
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MKdemiurg   CVAVR "повреждене" локальных переменных   Sep 15 2011, 15:01
- - kovigor   Цитата(MKdemiurg @ Sep 15 2011, 18:01) По...   Sep 15 2011, 16:32
- - MKdemiurg   Цитата(kovigor @ Sep 15 2011, 20:06) А ту...   Sep 15 2011, 17:24
|- - kovigor   Цитата(MKdemiurg @ Sep 15 2011, 20:24) Зы...   Sep 15 2011, 17:29
- - MKdemiurg   Цитата(kovigor @ Sep 15 2011, 20:29) Vola...   Sep 15 2011, 17:50
|- - kovigor   Цитата(MKdemiurg @ Sep 15 2011, 20:50) На...   Sep 15 2011, 17:56
- - MKdemiurg   А тем которые параметром в функцию передаются?   Sep 15 2011, 18:02
|- - kovigor   Цитата(MKdemiurg @ Sep 15 2011, 21:02) А ...   Sep 15 2011, 18:06
- - Marian   Выловил однажды проблему в CV, при декларировании ...   Sep 15 2011, 19:32
- - -SANYCH-   В CоdeVisionAVR довольно много глюков (по крайней ...   Sep 15 2011, 20:41
- - MKdemiurg   Цитата(-SANYCH- @ Sep 16 2011, 00...   Sep 16 2011, 05:38
|- - kovigor   Цитата(MKdemiurg @ Sep 16 2011, 08:38) Чт...   Sep 16 2011, 10:07
- - Slava2105   Не знаю как в версии 1.25.5 , я про неё давно забы...   Sep 23 2011, 16:55
- - MKdemiurg   Вообщем глюк то вроде бы изза того что переменную ...   Sep 23 2011, 21:34
|- - kovigor   Цитата(MKdemiurg @ Sep 24 2011, 00:34) Ст...   Sep 24 2011, 09:24
- - MKdemiurg   Цитата(kovigor @ Sep 24 2011, 13:24) Почт...   Sep 24 2011, 12:43
- - Slava2105   ЦитатаА как насчёт перехода с версии 1.25 сразу на...   Sep 25 2011, 00:09
- - MKdemiurg   ЦитатаИ утверждать про глюки компилятора надо всё ...   Sep 25 2011, 06:13


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

 


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


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