|
CVAVR "повреждене" локальных переменных |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 19)
|
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 еще и вторым уартом связь на сторону держит. проект уже полгода работает без проблем. так что ищите у себя.
|
|
|
|
|
Sep 23 2011, 21:34
|
Знающий
   
Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939

|
Вообщем глюк то вроде бы изза того что переменную не объявил volаtilom. В неё как раз считывались данные с порта только при ресете. И видимо компилятор посчитал, что потом с ней можно делать всё что хочешь. Столнулся с другим, что уже явно указывает на глюк компилятора. (версию сменил уже на 1.25.9) прога примерно такая : void main(void) { 1)If (условие) { if (условие) { while (1){операции} }; }; 2)while(1) { операции powerdown(); /* вот тут задокументирован был временно код на переработку */ }; } какимто образом программа вошла во 2й while(метка 2) выполнила операции , заснула , а когда проснулась попала в условие сверху( метка 1). После ресета было 100% повторение. После перекомпиляции и перепрошивки - всё исчезло. НО, перед перекомпиляцией я убрал задокументированный код. Незнаю сейчас гоняю , вроде работает, но к CV как то отношение ухудшилось Да ещё может кто встречал - при прошивке через CV если не сделать стирание чипа с проверкой( обязательно с проверкой) - чип не прошивается вбивает туда 0xFFFF( а может просто не шьёться , но стирается). Грешу на комп - часы у меня на компе уходят за час на 5 минут. Может частота не та идёт с компа? И изза этого появляются битые ячейки? Хотя впринципе тогда должно при верификации выводит ошибку. Цитата У меня сейчас 2.03.4. А как насчёт перехода с версии 1.25 сразу на 2.03 - сложностей не вызовет как думаете?
|
|
|
|
|
Sep 24 2011, 09:24
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(MKdemiurg @ Sep 24 2011, 00:34)  Столнулся с другим, что уже явно указывает на глюк компилятора. (версию сменил уже на 1.25.9) Почти наверняка это такой же глюк компилятора, как и первый, описанный вами неделю назад. Хотя может быть всякое. я бы на вашем месте просто открыл .asm - файл, созданный компилятором, и посмотрел бы, как выглядит ваш фрагмент на асме. Думаю, это прояснило бы ситуацию. Я уже, кстати, молчу о том, что у вас может, например, портиться стек, что и приводит к таким последствиям. На 99.9 и в этом случае компилятор не виноват ...
Сообщение отредактировал kovigor - Sep 24 2011, 09:25
|
|
|
|
|
Sep 24 2011, 12:43
|
Знающий
   
Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939

|
Цитата(kovigor @ Sep 24 2011, 13:24)  Почти наверняка это такой же глюк компилятора, как и первый, описанный вами неделю назад. Хотя может быть всякое. я бы на вашем месте просто открыл .asm - файл, созданный компилятором, и посмотрел бы, как выглядит ваш фрагмент на асме. Думаю, это прояснило бы ситуацию. Я уже, кстати, молчу о том, что у вас может, например, портиться стек, что и приводит к таким последствиям. На 99.9 и в этом случае компилятор не виноват ... Да вот , недопёр я в asm заглянуть... Прикол то в том, что после перекомпиляции и перепрошивки - всё заработало - в коде убрал только задокументированный текст( тогда кстати тоже текст рядом в скобках был , много текста) . Я вот думаю а не был ли и в прошлый раз ещё и стек виноват ( потому как в этот раз точно стек был- иначе не объяснишь). Надо будет асм "разобрать" при следующей запаре... Но там врятли явно увидишь... Пересмотрел указатели. Вроде запар нет нигде. Вот тоглько смущает этот кусок: Код void at24c256_read(unsigned char chip,unsigned int address, unsigned char count, unsigned char *buffer) { unsigned char a,b; a=(chip<<1)|0b10100000; i2c_start(); i2c_write(a); i2c_write(address >> 8); i2c_write(address); i2c_start(); i2c_write((chip<<1)|0b10100001); for (b=0;b<count-1;b++) {*buffer++=i2c_read(1);}; *buffer=i2c_read(0); i2c_stop(); }; При переполнении страницы памяти( 64 байта) стабильно происходит запара со стеком( делал специально - при работе жётско контролируется НЕпереполнение записываю страницами по 63 байта) - переходит в начало main или вызывающей процедуры. А вот к функциям i2c добраться никак...
Сообщение отредактировал MKdemiurg - Sep 24 2011, 12:54
|
|
|
|
|
Sep 25 2011, 00:09
|
Группа: Новичок
Сообщений: 2
Регистрация: 23-09-11
Пользователь №: 67 336

|
Цитата А как насчёт перехода с версии 1.25 сразу на 2.03 - сложностей не вызовет как думаете? Абсолютно никаких проблем не было. Мало того, даже программы созданные в 2.03 компилировались в 1.25.9. По крайней мере с проблемами не сталкивался. И утверждать про глюки компилятора надо всё же пореже. Как правило это глюки вашей, да и моей программы тоже. Просто где то не дочитали, не досчитали, не так сделали. А кодевижен мне больше нравится чем винавр. Попробовал как то перейти на него... Ни грамма не улыбнуло
|
|
|
|
|
Sep 25 2011, 06:13
|
Знающий
   
Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939

|
Цитата И утверждать про глюки компилятора надо всё же пореже. ТАк я и не утверждаю. Просто с чем может быть связан глюк , который уходит после перекомпиляции? НУ возможно с процессом прошивки... Но маловероятно... ЗЫ Тож наверно перейду на 2.03 тогда , там библиотека для SD карты реализована....
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|