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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> перезапуск программы, непонятно почему.
simsim
сообщение Jan 16 2007, 21:13
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 45
Регистрация: 30-10-06
Пользователь №: 21 801



есть программа, состоит из 2-х подпрограмм А и Б, выполняемых бесконечно в while (1) {} и real-time clock по timer0.
1-я выводит массив led[32] в порт D, 2-я обновляет led[32]. Проблема - два раза цикл вывода и обновления led[32] проходит нормально, в начале 3-го происходит перезапуск контроллера, замечаю по обнулению времени и led. watchdog выключен, да и время до сброса не одно, зависит от времени выполнения циклов в А и Б, и 2 сек, и 15 сек и больше, а происходит в одной и той же точке выполнения А и Б. в чем может быть дело ? как уйти от этого сброса ?
p.s. попробую отследить в AVR Studio, поможет ? там вроде нет шагов назад.

Сообщение отредактировал simsim - Jan 16 2007, 21:17
Go to the top of the page
 
+Quote Post
bodja74
сообщение Jan 16 2007, 21:33
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



SREG и регистры сохраняются в прерывании ?
Go to the top of the page
 
+Quote Post
simsim
сообщение Jan 16 2007, 21:43
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 45
Регистрация: 30-10-06
Пользователь №: 21 801



Цитата(bodja74 @ Jan 16 2007, 21:33) *
SREG и регистры сохраняются в прерывании ?

Прога на СИ. специально не забочусь о них.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 16 2007, 23:13
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(simsim @ Jan 16 2007, 22:13) *
p.s. попробую отследить в AVR Studio, поможет ? там вроде нет шагов назад.


Конечно поможет. А зачем шаги назад?
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 17 2007, 12:42
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Индексы массивов не выходят ли за границы оных, стек не переполняется? Какой компилятор? Да может и исходник бы здесь тоже не помешал..


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 17 2007, 13:04
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(simsim @ Jan 16 2007, 21:13) *
есть программа, состоит из 2-х подпрограмм А и Б, выполняемых бесконечно в while (1) {} и real-time clock по timer0.
1-я выводит массив led[32] в порт D, 2-я обновляет led[32]. Проблема - два раза цикл вывода и обновления led[32] проходит нормально, в начале 3-го происходит перезапуск контроллера, замечаю по обнулению времени и led. watchdog выключен, да и время до сброса не одно, зависит от времени выполнения циклов в А и Б, и 2 сек, и 15 сек и больше, а происходит в одной и той же точке выполнения А и Б. в чем может быть дело ? как уйти от этого сброса ?
p.s. попробую отследить в AVR Studio, поможет ? там вроде нет шагов назад.

Код в Студию!!!
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 17 2007, 13:41
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(simsim @ Jan 17 2007, 01:13) *
есть программа, состоит из 2-х подпрограмм А и Б, выполняемых бесконечно в while (1) {} и real-time clock по timer0.
1-я выводит массив led[32] в порт D, 2-я обновляет led[32]. Проблема - два раза цикл вывода и обновления led[32] проходит нормально, в начале 3-го происходит перезапуск контроллера, замечаю по обнулению времени и led. watchdog выключен, да и время до сброса не одно, зависит от времени выполнения циклов в А и Б, и 2 сек, и 15 сек и больше, а происходит в одной и той же точке выполнения А и Б. в чем может быть дело ? как уйти от этого сброса ?
p.s. попробую отследить в AVR Studio, поможет ? там вроде нет шагов назад.
Возможно, из за переполнения стека данных, реомендую увеличить в два раза. Если пользуетесь ИАРом, то по умолчанию глубина стека данных равна 0x20 (или 32 - ИМХО для того, чтобы можно было, при входе впрерывание, сохранить все 32 регистра). Если какая то процедура в программе, кроме прерывания пользуется стеком данных, естественно, он переполнится, и корабль потонет smile.gif

Поменять значение можно в Главное меню->Project->Options->General Options->System->Data Stack (RSTACK)


--------------------
Go to the top of the page
 
+Quote Post
vesago
сообщение Jan 17 2007, 17:05
Сообщение #8


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Согласен с GDI 9:10 - криво проинициализировали индекс или выходит за пределы. У меня такое бывало. Проц тогда постоянно перегружается.
Go to the top of the page
 
+Quote Post
simsim
сообщение Jan 17 2007, 17:46
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 45
Регистрация: 30-10-06
Пользователь №: 21 801



Цитата(GDI @ Jan 17 2007, 12:42) *
Индексы массивов не выходят ли за границы оных, стек не переполняется? Какой компилятор? Да может и исходник бы здесь тоже не помешал..

Компилятор CodeVisionAVR 1.24.8, индексы в порядке, потому что два раза проходит нормально, а на третий выполняя то же самое перезапускается. Размер стека 256 байт, неужели мало? Что такое HEAP SIZE в настройках CVAVR ?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 17 2007, 18:02
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(simsim @ Jan 17 2007, 21:46) *
Цитата(GDI @ Jan 17 2007, 12:42) *

Индексы массивов не выходят ли за границы оных, стек не переполняется? Какой компилятор? Да может и исходник бы здесь тоже не помешал..

Компилятор CodeVisionAVR 1.24.8, индексы в порядке, потому что два раза проходит нормально, а на третий выполняя то же самое перезапускается. Размер стека 256 байт, неужели мало? Что такое HEAP SIZE в настройках CVAVR ?
Я не пользовал CodeVisionAVR, но для ИАРа есть два стека - первый стек данных, второй - стек программ. Первый нужен для сохранения переменных, расположенных в регистрах, второй служит для выхода из подпрограмм.

HEAP SIZE - скорее всего, размер кучи в глобальной памяти данных SRAM. Куча - это память, доступная для программы. Используется для динамически создаваемых переменных, под которые компилятор не может выделить регистр.

Допустим Вы объявили массив, как глобальную переменную - он будет создан не в куче, а на этапе запуска стартап-кода.

Если же массив будет объявлен внутри функции, то, возможно, он будет создаваться динамически, во время выполнения функции, как раз в этой самой куче.


--------------------
Go to the top of the page
 
+Quote Post
simsim
сообщение Jan 17 2007, 19:00
Сообщение #11


Участник
*

Группа: Новичок
Сообщений: 45
Регистрация: 30-10-06
Пользователь №: 21 801



Цитата(simsim @ Jan 17 2007, 17:46) *
Цитата(GDI @ Jan 17 2007, 12:42) *

Индексы массивов не выходят ли за границы оных, стек не переполняется? Какой компилятор? Да может и исходник бы здесь тоже не помешал..

Компилятор CodeVisionAVR 1.24.8, индексы в порядке, потому что два раза проходит нормально, а на третий выполняя то же самое перезапускается. Размер стека 256 байт, неужели мало? Что такое HEAP SIZE в настройках CVAVR ?

Увеличил стек до 500. Теперь перезапускается после 5-го обновления массива leds, а не 3-го как раньше. В подпрограмме обновления leds есть обращение к ассемблерной подпрограмме -
#pragma warn- // this will prevent warnings
unsigned char asm_font(unsigned char aa1, unsigned char bb1) {
#asm
.def temp =r16
.def zh =r31
.def zl =r30
.def ak =r23
.def bk =r24
.def yh =r29
.def yl =r28
..................
lpm r30,z ; результат
ret
#endasm
}
#pragma warn+ // enable warnings
Может здесь причина?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 17 2007, 19:10
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(prottoss @ Jan 17 2007, 19:02) *
Допустим Вы объявили массив, как глобальную переменную - он будет создан не в куче, а на этапе запуска стартап-кода.

Если же массив будет объявлен внутри функции, то, возможно, он будет создаваться динамически, во время выполнения функции, как раз в этой самой куче.


Для IAR даже если массив объявлен внутри ф-ции, то он всё равно будет создан "на этапе запуска стартап-кода". Даже если он и будет создан динамически (не программистом а компилятором), то он будет создан за счёт памяти выделенной под это на этапе линковки. А куча полностью предоставлена программисту. (Как в С++ не знаю). Я могу выделить память и освободить её. М/у моими действиями ничего происходить с кучей не должно. Ничего без моего участия.
Таким образом учитывая, что парень не слышал о таком слове smile.gif - куча не занята, и она явно к этому не имеет никакого отношения.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 17 2007, 19:25
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(SasaVitebsk @ Jan 17 2007, 23:10) *
Цитата(prottoss @ Jan 17 2007, 19:02) *

Допустим Вы объявили массив, как глобальную переменную - он будет создан не в куче, а на этапе запуска стартап-кода.

Если же массив будет объявлен внутри функции, то, возможно, он будет создаваться динамически, во время выполнения функции, как раз в этой самой куче.


Для IAR даже если массив объявлен внутри ф-ции, то он всё равно будет создан "на этапе запуска стартап-кода".
А я Вам говорю, что в куче, давайте поспорим smile.gif Ваши аргументы какие?


--------------------
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 17 2007, 19:32
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
индексы в порядке, потому что два раза проходит нормально


это ничего не значит...

Цитата
Теперь перезапускается после 5-го обновления массива leds


...и это тому подтверждение

Цитата
#pragma warn- // this will prevent warnings
unsigned char asm_font(unsigned char aa1, unsigned char bb1) {
#asm
.def temp =r16
.def zh =r31
.def zl =r30
.def ak =r23
.def bk =r24
.def yh =r29
.def yl =r28
..................
lpm r30,z ; результат
ret
#endasm
}
#pragma warn+ // enable warnings


Что то я не вижу сохранение в стеке используемых регистров и, соответственно, последующего их восстановления, вполне может быть, что проблема в этом. А что показала проверка в AVR Studio?


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
simsim
сообщение Jan 17 2007, 19:35
Сообщение #15


Участник
*

Группа: Новичок
Сообщений: 45
Регистрация: 30-10-06
Пользователь №: 21 801



Для IAR даже если массив объявлен внутри ф-ции, то он всё равно будет создан "на этапе запуска стартап-кода". [/quote] А я Вам говорю, что в куче, давайте поспорим smile.gif Ваши аргументы какие?
[/quote]
Куча в нуле. Пробовал делать ее 100 - безрезультатно. Похоже что стек выбивает. AVR написала что "AVR Simulator: Stack pointer changed after subroutine call", не заметил после какой, долго идет симуляция, похоже после asm_font()
Go to the top of the page
 
+Quote Post

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

 


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


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