Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: C-SPY сбрасывает программу при отладке...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Freeze Anti
Проблема вот в чем...
В C-SPY отлаживается программа... Вроде бы ысе нормально, но, дойдя до некоторой строчки
Код
WriteFloatValue(0, intDigits, fraqDigits);

переходит не на следующую строку (без зависимости от того. входим мы в эту функцию или нет...), а в начало программы.
Следующая строка
Код
lcdCursorMove(-nDigits);

Сама функция
Код
// Функция реализует вывод на экран ЖКИ вещественного числа, представляемого
// 2-х байтным целым, младшие 2 разряда которого являются дробными. Значения
// лежат в диапазоне от 0.00 до 655.35. intDigits - задает количество разря-
// дов целой части, fraqDigits - количество разрядов дробной части
void WriteFloatValue(unsigned short Value, unsigned char intDigits,
                         unsigned char fraqDigits)
{ unsigned short Divisor = INIT_DEC_MASK_VALUE;
  unsigned short tmpValue;
  unsigned char i,chDigit;
  tmpValue = Value;                     // tmpValue - рабочия копия числа
  // Рассматриваем целую часть числа Value
  for (i=MAX_INT_POSITIONS; i>0; i--)
  { chDigit = tmpValue / Divisor;       // Цифра i-го разряда числа
    tmpValue -= chDigit * Divisor;      // Устранение i-го разряда из числа
    if (i <= intDigits)                 // Добрались до отображаемых разрядов
    { chDigit += 0x30;                  // Формируем код символа
      lcdWriteData(chDigit);            // Вывод цифры на индикатор
    }
    
    Divisor /= 10;
  }
  lcdWriteData(0x2E);                   // Ставим десятичную точку
  // Рассматриваем дробную часть числа Value
  for (i=fraqDigits; i>0; i--)
  { chDigit = tmpValue / Divisor;       // Цифра i-го разряда числа
    tmpValue -= chDigit * Divisor;      // Устранение i-го разряда из числа
    chDigit += 0x30;                    // Формируем код символа
    lcdWriteData(chDigit);              // Вывод цифры на индикатор
    
    Divisor /= 10;
  }
}

При прошивке этой программы в микросхему она работает стабильно... Сброса системы ни разу не наблюдал...
Сергей Борщ
Цитата(Freeze Anti @ Sep 14 2007, 12:48) *
переходит не на следующую строку (без зависимости от того. входим мы в эту функцию или нет...), а в начало программы.
Видимо надо прошагать это место по дизассемблерному листингу. Еще возможен сброс собакой.
Freeze Anti
Попробовал посмотреть в Асме...
Значит так...
Заходим в WriteFloatValue

Код
000D12      WriteFloatValue:
000D12 *940E13C4 CALL ?PROLOGUE8_L09


переходим к ?PROLOGUE8_L09

Код
002788      ?PROLOGUE8_L09:
002788 *927A     ST      -Y,R7
00278A      ?PROLOGUE7_L09:
00278A *926A     ST      -Y,R6
00278C      ?PROLOGUE6_L09:
00278C *925A     ST      -Y,R5
00278E      ?PROLOGUE5_L09:
00278E *924A     ST      -Y,R4
002790      ?PROLOGUE4_L09:
002790 *93BA     ST      -Y,R27
002792      ?PROLOGUE3_L09:
002792 *93AA     ST      -Y,R26
002794      ?PROLOGUE2_L09:
002794 *939A     ST      -Y,R25
002796      ?PROLOGUE1_L09:
002796 *938A     ST      -Y,R24
002798 *9508     RET


и после вот этого RET возвращаемся не в 000D14, а в 000000...
IgorKossak
Первое впечатление такое, что стек переполнился.
Freeze Anti
Вообще я тоже так так думаю... А что сделать то с этим можно?

Кстати, повторяю... При прошивке устройство работает нормально...
alexander55
Цитата(Freeze Anti @ Sep 17 2007, 10:38) *
Вообще я тоже так так думаю... А что сделать то с этим можно?

Кстати, повторяю... При прошивке устройство работает нормально...

Option > Linker >Config , галка на Override default - Edit > страница Stack/Heap Sizes (дальше, вероятно CSTACK надо увеличить)
Сергей Борщ
Цитата(Freeze Anti @ Sep 17 2007, 09:13) *
и после вот этого RET возвращаемся не в 000D14, а в 000000...
Следующий шаг. Подходим к RET и смотрим:
1) содержимое указателя стека,
2) Берем описание команд и смотрим, что делает RET (откуда она берет адрес возврата)
3) Смотрим, не вылез ли указатель за пределы памяти.
3а) Если вылез - запускаем программу снова и смотрим почему.
3б) Смотрим, что же в этом месте в стеке
4б) Запускаем программу снова и смотрим, когда и кем значение портится.

Кто-то (кажется ivanich) рассказывал про коллег-китайцев. Те совершенно четко выполняют то, что им поручено. Но никакой инициативы. Ни шагу вперед самостоятельно.
Freeze Anti
Спасибо за подсказку про стек. Все заработало. Только у меня длина стека находилась в другом месте.

Project->Options->General->System Configuration->Data Stack(CSTACK)->Size(bytes):

Я программист с очень маленьким опытом работы. (До этого проектировал печатные платы в P-CAD). С дебаггером пока общаюсь на уровне школьника. Так что извините за откровенно ламерский вопрос.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.