|
CVAVR "повреждене" локальных переменных |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Sep 15 2011, 16:32
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(MKdemiurg @ Sep 15 2011, 18:01)  Подскажите где могут быть грабли. Возможно, переполняется стек и собой затирает переменные. Попробуйте в опциях проекта увеличить размер стека. Ну или вы с указателями где-то накосячили. Я уже не говорю о том, что скорость UART м.б. неправильно выставлена. Например, что будет, если выводить не по UART, а куда-то в другое место ? И еще. OUT_COM0_CHAR ждет окончания передачи предыдущего байта, или ничего не ждет и тупо пишет в UART независимо от его готовности ? Еще возможно переполнение буфера драйвера на стороне PC и как следствие - потеря данных. Что будет, если передавать не переменную, а число ? Оно тоже будет биться ? P.S. А еще "conflict" может неожиданно меняться в процессе передачи (обработчиком прерывания, о котором вы забыли) ...
Сообщение отредактировал kovigor - Sep 15 2011, 16:47
|
|
|
|
|
Sep 15 2011, 16:55
|
Знающий
   
Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939

|
Цитата(kovigor @ Sep 15 2011, 19:32)  Возможно, переполняется стек и собой затирает переменные. Попробуйте в опциях проекта увеличить размер стека. Ну или вы с указателями где-то накосячили. Я уже не говорю о том, что скорость UART м.б. неправильно выставлена. Например, что будет, если выводить не по UART, а куда-то в другое место ? И еще. OUT_COM0_CHAR ждет окончания передачи предыдущего байта, или ничего не ждет и тупо пишет в UART независимо от его готовности ? Еще возможно переполнение буфера драйвера на стороне PC и как следствие - потеря данных. Что будет, если передавать не переменную, а число ? Оно тоже будет биться ? Стек выставлен на 1 Кбайт, при компиляции пишет, что используется 190байт. С указателями возможно, но блин, я даже не знаю как к ним подступить  , ибо их я наплодил десятки... jtaga нема, да и программу особо не потрассируешь... Растянута по времени на часы... Попробую покопаться в указателях ... Но какая зависимость непонятно. Все массивы и структуры статичны - если бы где то вылезало за предел выделяемой памяти - ошибка была бы постоянной, да и слетают переменные в местах где указатели не меняются Дело не в UART 100%, т.к. меняется даже ход выполнения программы, который я тоже контролирую через uart икоторый зависит от этих переменных. ЗЫ - вот так 1 баг где нибудь и всё программирование сводится к танцу с бубном  .
|
|
|
|
|
Sep 15 2011, 17:06
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Sep 15 2011, 17:24
|
Знающий
   
Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939

|
Цитата(kovigor @ Sep 15 2011, 20:06)  А тут не может быть какой-то хитрой завязки ? Просто эта фраза очень странно звучит.
Еще идея: попробуйте повыключать некоторые обработчики прерываний, насколько это возможно, и посмотрите, что будет. Вообще, почти наверняка дело в одном из обработчиков.
Да, и еще. Это может быть ошибка в использовании типов. Например, вы по ошибке пишете в unsigned char 16-разрядное число. Нет, просто вывожу в ключевых точках параметры. Из прерываний только таймер - работает как таймер с жёсткой фиксацией ( т.е. пока не сработает других действий не выполняется - чтото типа задержки только с программным опросом ноги или флага до окончания тайминга) , сброс по внешнему - срабатывает от RTS раз в час, ну и UART, в котором вообще ничего мудрёного... Выключить можно , но тогда программа вообще вся собьётся... Я вот какую особенность подметил у меня по тексту порядок следования функций такой 1void modem_control(void) 2void protokol_set(unsigned char KEY) 3void main(void) { //здесь объявляется переменная которая идет параметром в функцию 2 и которая кстати и "ломается". } Так вот - если ошибка пропадает в 1 - то появляется ниже во 2 или 3й. Очень похоже на указатель...Завтра точно их поковыряю. Может быть даже частично перейду на использование нумерованых массивов, правда придётся тогда передавать данные через глобальные переменные Цитата Ну и последнее. Как показывает мной многолетний опыт, самые сложные и трудноуловимые ошибки почти всегда имеют до смешного простые причины. Так что ...  Дааа, это есть проблема №1 , у меня всегда так... Видать и тут также Зы Спасибо за наводящую помощь, будем копать... ЗЗЫ А всё таки не может это быть в компиляторе или оптимизации дело ?
Сообщение отредактировал MKdemiurg - Sep 15 2011, 17:25
|
|
|
|
|
Sep 16 2011, 05:38
|
Знающий
   
Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939

|
Цитата(-SANYCH- @ Sep 16 2011, 00:41)  В CоdeVisionAVR довольно много глюков (по крайней мере я встречал в старых версиях). Эта среда хороша только что нить сделать быстро. Типа что нить измерить АЦПешкой и выкинуть результат в компорт. Кстати я бы Вам не советовал использовать atmega128A в новом проекте. Уже давно есть процессоры дешевле и намного лучше. У мну работа с памятью, часами и модемом - не столь ужасно для CVAVR. К этой среде я привык, и проект был заточен под него. Просто глюки вылезли неожиданно. А описание примерное глюков можете дать, а то незнаю куда копать - сейчас пересмотрел проект, с указателями вроде всё ок... Какие например?ИЗ аврок... Чтобы на тот же arm перейти( была идея заюзать stm32f107) нужно месяца два времени, а то и три - освоить кеил или iar, освоить контроллер... А с временем напряжёнка...
Сообщение отредактировал MKdemiurg - Sep 16 2011, 05:39
|
|
|
|
|
Sep 23 2011, 16:55
|
Группа: Новичок
Сообщений: 2
Регистрация: 23-09-11
Пользователь №: 67 336

|
Не знаю как в версии 1.25.5 , я про неё давно забыл. У меня сейчас 2.03.4. Никаких нареканий на уарт нет, да и на прошлых версиях тоже не было Работает чётко, без глюков. у меня был проект, там 30 штук 128 и одна 32 атмеги между собой связь по 485 держат. А каждая из 128 еще и вторым уартом связь на сторону держит. проект уже полгода работает без проблем. так что ищите у себя.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|