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

 
 
> перезапуск программы, непонятно почему.
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
 
Start new topic
Ответов
GDI
сообщение Jan 17 2007, 12:42
Сообщение #2


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

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



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


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


Участник
*

Группа: Новичок
Сообщений: 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
simsim
сообщение Jan 17 2007, 19:00
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 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:36
Сообщение #5


Гуру
******

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



Цитата(simsim @ Jan 17 2007, 20:00) *
Цитата(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
Может здесь причина?

Если у Вас зависит от числа вызывов, то это однозначно указывает, что у Вас плывёт указатель стэка. Одного или другого.
Зачем Вы замыливаете причину??? Просто найдите и устраните! Как собирались. Верните всё как было (всё таки два цикла меньше чем 5 гнать) и прогоните в Studio. Обратите внимание на указатель стэка в одном и том же месте.

Теперь вопрос 2. Зачем Вы путаете Си и Asm если Вы ещё в самом начале пути??? Вы уверены что регистры которые Вы портите в Asm не использует компилятор??? Простите, но для меня Ваша прога, просто лишена смысла. Как можно результат занести в регистр? И что? А если при следующей компиляции компилятор поменяет использование регистров??? Это же его право! Я понимаю ещё если бы Вы с переменной работали, а используемые регистры сохраняли. И то! Зачем Вам вообще это. Используйте чистый Си. Я уверен, - то что Вы хотите сделать на Asm можно реализовать и в рамках языка! Просто спросите в форуме - как это сделать.

Приведу пример. В начале своего последнего проекта, я хотел делать ассемблерные п/п. Чтобы ускорить работу в некоторых местах. Но решил сделать это после отладки проекта. А, сначала, всё реализовать на Си. Теперь проект закончен. И, наверное я уже просто не буду этим заниматься. У меня просто банально всё работает. Производительность отличная. Так зачем этот цирк?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 17 2007, 20:14
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Чтобы все не спорили. Массивы, объявленные внутри функции(локальные), равно как и локальные переменные, и в С и в С++ размещаются на стеке. В ИАРе на стеке данных (CSTACK). В куче в С++ размещаются объекты созданные через вызов operator new. В "голом" С в куче "само" не размещается ничего. Программист может зарезервировать себе кусочек памяти в куче библиотечными функциями malloc, calloc и в этот кусочек разместить что захочет. Иначе никак.

Цитата(SasaVitebsk @ Jan 17 2007, 18:36) *
Как можно результат занести в регистр? И что? А если при следующей компиляции компилятор поменяет использование регистров??? Это же его право!
В защиту автора функции: В данном случае речь идет о CV, а он использует именно R30:R31 для передачи параметров и возврата значений. Это описано в его доке и просто так не поменяется.

Цитата(SasaVitebsk @ Jan 17 2007, 18:36) *
Приведу пример. В начале своего последнего проекта, я хотел делать ассемблерные п/п. Чтобы ускорить работу в некоторых местах. Но решил сделать это после отладки проекта. А, сначала, всё реализовать на Си. Теперь проект закончен. И, наверное я уже просто не буду этим заниматься. У меня просто банально всё работает. Производительность отличная. Так зачем этот цирк?
Вот тут полностью согласен. Но если автор настаивает, то можно порекомендовать вместо этой функции вставить затычку, типа такой:
Код
unsigned char pass;
unsigned char asm_font(unsigned char aa1, unsigned char bb1) {
    return ++pass;
}
и посмотреть как будет работать. Если вешаться перестанет, то написать простую программу:
Код
void main() {
    for(;;)
        asm_font(1,2);
}
и прогнать ее в avrstudio, обращая внимание на стек, на изменяющуюся память, на регистры. А можно и сюда текст функции выложить - коллективом ошибки ловятся быстрее.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AndryG
сообщение Jan 17 2007, 20:21
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Не вчитывался в посты народа ... звыняйте .. в АСМ-вставке Вы используете R30 - в CVAVR - это самый главный регистр - указатель стека!!! Вот с ним Вы беду и делаете.
Если Ваша вставка - функция - подавно все развалится - прочтите раздел хелпа по функциям асемблерным - там указано что и как сохранять на примере кода.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jan 17 2007, 20:37
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(AndryG @ Jan 17 2007, 20:21) *
Не вчитывался в посты народа ... звыняйте .. в АСМ-вставке Вы используете R30 - в CVAVR - это самый главный регистр - указатель стека!!! Вот с ним Вы беду и делаете.
Если Ваша вставка - функция - подавно все развалится - прочтите раздел хелпа по функциям асемблерным - там указано что и как сохранять на примере кода.

Цитата из хелпа CV -
"The registers R0, R1, R22, R23, R24, R25, R26, R27, R30 and R31 can be freely used in assembly routines."
R30,R31 используются для возврата результата функции. Указатель стека - R28,R29.
Go to the top of the page
 
+Quote Post
simsim
сообщение Jan 17 2007, 21:06
Сообщение #9


Участник
*

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



Заменил ассемблерную функцию на СИ-шную
unsigned char asm_font(unsigned char aa1, unsigned char bb1)
{ unsigned int tp;
tp=(aa1*8)+bb1;
return font8[tp];
}
но теперь другая проблема- при отладке в AVR Studio аа1=207, tp получается равным 121 !!! не поддается осмыслению ...
p.s. ОТ перезапуска избавился.спасибо.

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


Участник
*

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



Цитата(simsim @ Jan 17 2007, 21:06) *
Заменил ассемблерную функцию на СИ-шную
unsigned char asm_font(unsigned char aa1, unsigned char bb1)
{ unsigned int tp;
tp=(aa1*8)+bb1;
return font8[tp];
}
но теперь другая проблема- при отладке в AVR Studio аа1=207, tp получается равным 121 !!! не поддается осмыслению ...
p.s. ОТ перезапуска избавился.спасибо.

Спасибо, нашел - tp=aa1; tp*=8; tp+=bb1; (СИ это вам не математика :-)
Go to the top of the page
 
+Quote Post
Dan_Dima
сообщение Jan 18 2007, 03:43
Сообщение #11


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 18-01-07
Пользователь №: 24 530



Всем привет.
Я можнт что-то не понимаю скажите а разве между этими строками есть разница.
tp=(aa1*8)+bb1;
и
tp=aa1; tp*=8; tp+=bb1;
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jan 18 2007, 08:27
Сообщение #12


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(Dan_Dima @ Jan 18 2007, 03:43) *
Всем привет.
Я можнт что-то не понимаю скажите а разве между этими строками есть разница.
tp=(aa1*8)+bb1;
и
tp=aa1; tp*=8; tp+=bb1;


aa1 объявлена как char и при умножении aa1*8 вероятно происходит переполнение,
а tp объявлена как int и при tp=aa1; tp*=8; так как tp это int переполнения не происходит. Сделай простую проверку, объяви aa1 как int и посмотри результат своего первого выражения tp = (aa1*8) + bb1;


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Dan_Dima
сообщение Jan 18 2007, 12:28
Сообщение #13


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 18-01-07
Пользователь №: 24 530



Цитата(dimka76 @ Jan 18 2007, 08:27) *
Цитата(Dan_Dima @ Jan 18 2007, 03:43) *

Всем привет.
Я можнт что-то не понимаю скажите а разве между этими строками есть разница.
tp=(aa1*8)+bb1;
и
tp=aa1; tp*=8; tp+=bb1;


aa1 объявлена как char и при умножении aa1*8 вероятно происходит переполнение,
а tp объявлена как int и при tp=aa1; tp*=8; так как tp это int переполнения не происходит. Сделай простую проверку, объяви aa1 как int и посмотри результат своего первого выражения tp = (aa1*8) + bb1;


Насколько я помню подобные преобразования компилятор делает сам ( только проверил) так как преобразование идет к "большему" типу. Поэтому эти две записи эквивалентны.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 18 2007, 13:00
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Dan_Dima @ Jan 18 2007, 13:28) *
Насколько я помню подобные преобразования компилятор делает сам ( только проверил) так как преобразование идет к "большему" типу. Поэтому эти две записи эквивалентны.

Конечно сам, но на каком этапе?
Отличие в записях в моменте преобразования.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Dan_Dima
сообщение Jan 18 2007, 14:35
Сообщение #15


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 18-01-07
Пользователь №: 24 530



Цитата(Dog Pawlowa @ Jan 18 2007, 13:00) *
Цитата(Dan_Dima @ Jan 18 2007, 13:28) *

Насколько я помню подобные преобразования компилятор делает сам ( только проверил) так как преобразование идет к "большему" типу. Поэтому эти две записи эквивалентны.

Конечно сам, но на каком этапе?
Отличие в записях в моменте преобразования.


Преобразование происходит по ходу выполнения вычислений если говорить о том как это делаеться в обычном С. В IAR может действительно надо принудительно описывать привидение типов в том же gcc такого нет.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 18 2007, 18:08
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Dan_Dima @ Jan 18 2007, 15:35) *
Преобразование происходит по ходу выполнения вычислений если говорить о том как это делаеться в обычном С.

В приведенной формуле tp=(aa1*8)+bb1 компилятор IAR хранит временные результаты вычисления (aa1*8) того же типа, что и aa1 и ничего не нарушает. Переполнение происходит, так как программист не учел, что оно может произойти, а не по той причине, что IAR - это не "обычный С".

Цитата(Dan_Dima @ Jan 18 2007, 15:35) *
В IAR может действительно надо принудительно описывать привидение типов в том же gcc такого нет.

GCC действительно по другому работает, чем IAR - сталкивался с этим. Но, подчеркиваю, разобранный пример - не свидетельство ненормальной работы IAR.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- simsim   перезапуск программы   Jan 16 2007, 21:13
- - bodja74   SREG и регистры сохраняются в прерывании ?   Jan 16 2007, 21:33
|- - simsim   Цитата(bodja74 @ Jan 16 2007, 21:33) SREG...   Jan 16 2007, 21:43
- - SasaVitebsk   Цитата(simsim @ Jan 16 2007, 22:13) p.s. ...   Jan 16 2007, 23:13
|- - prottoss   Цитата(simsim @ Jan 17 2007, 21:46) Цитат...   Jan 17 2007, 18:02
||- - SasaVitebsk   Цитата(prottoss @ Jan 17 2007, 19:02) Доп...   Jan 17 2007, 19:10
||- - prottoss   Цитата(SasaVitebsk @ Jan 17 2007, 23:10) ...   Jan 17 2007, 19:25
||- - simsim   Для IAR даже если массив объявлен внутри ф-ции, то...   Jan 17 2007, 19:35
||- - defunct   Цитата(prottoss @ Jan 17 2007, 19:25) Цит...   Jan 17 2007, 20:27
|||- - satellite-plus   Насколько я помню подобные преобразования компилят...   Jan 18 2007, 13:25
||- - satellite-plus   Цитата(Dan_Dima @ Jan 18 2007, 02:43) Все...   Jan 18 2007, 09:19
|- - prottoss   Цитата(simsim @ Jan 17 2007, 23:00) В под...   Jan 17 2007, 19:38
- - _Bill   Цитата(simsim @ Jan 16 2007, 21:13) есть ...   Jan 17 2007, 13:04
- - prottoss   Цитата(simsim @ Jan 17 2007, 01:13) есть ...   Jan 17 2007, 13:41
- - vesago   Согласен с GDI 9:10 - криво проинициализировали ин...   Jan 17 2007, 17:05
- - GDI   Цитатаиндексы в порядке, потому что два раза прохо...   Jan 17 2007, 19:32
- - SasaVitebsk   Цитата(SasaVitebsk @ Jan 17 2007, 20:10) ...   Jan 18 2007, 00:49
|- - Сергей Борщ   Цитата(SasaVitebsk @ Jan 17 2007, 23:49) ...   Jan 18 2007, 18:56
|- - defunct   Цитата(Сергей Борщ @ Jan 18 2007, 18:56) ...   Jan 19 2007, 01:32
|- - SasaVitebsk   Цитата(Сергей Борщ @ Jan 18 2007, 19:56) ...   Jan 19 2007, 02:21
|- - Сергей Борщ   Цитата(SasaVitebsk @ Jan 19 2007, 01:21) ...   Jan 19 2007, 12:06
- - prottoss   defunct был прав - массив, объявленный в функции, ...   Jan 18 2007, 19:40
|- - zltigo   Цитата(prottoss @ Jan 18 2007, 18:40) Еди...   Jan 18 2007, 20:15
|- - prottoss   Цитата(zltigo @ Jan 19 2007, 00:15) Цитат...   Jan 18 2007, 20:39
|- - xemul   Цитата(prottoss @ Jan 18 2007, 20:39) Цит...   Jan 18 2007, 21:44
||- - prottoss   Цитата(xemul @ Jan 19 2007, 01:44) Автома...   Jan 18 2007, 21:52
|- - Сергей Борщ   Цитата(prottoss @ Jan 18 2007, 19:39) А в...   Jan 19 2007, 12:21
||- - prottoss   Цитата(Сергей Борщ @ Jan 19 2007, 16:21) ...   Jan 19 2007, 12:36
||- - Сергей Борщ   Цитата(prottoss @ Jan 19 2007, 11:36) НО,...   Jan 19 2007, 12:57
||- - prottoss   Цитата(Сергей Борщ @ Jan 19 2007, 16:57) ...   Jan 19 2007, 13:29
||- - IgorKossak   Цитата(prottoss @ Jan 19 2007, 12:29) Цит...   Jan 19 2007, 13:55
|||- - prottoss   Цитата(IgorKossak @ Jan 19 2007, 17:55) Ц...   Jan 19 2007, 14:12
|||- - IgorKossak   Цитата(prottoss @ Jan 19 2007, 13:12) Инт...   Jan 19 2007, 15:47
||- - Сергей Борщ   Цитата(prottoss @ Jan 19 2007, 12:29) Вы ...   Jan 19 2007, 13:57
||- - zltigo   Цитата(prottoss @ Jan 19 2007, 12:29) Вы ...   Jan 19 2007, 15:55
|- - zltigo   Цитата(prottoss @ Jan 18 2007, 19:39) а В...   Jan 19 2007, 15:42
|- - prottoss   Цитата(zltigo @ Jan 19 2007, 19:42) Цитат...   Jan 19 2007, 15:55
- - xemul   Цитата(Dan_Dima @ Jan 18 2007, 14:35) Цит...   Jan 18 2007, 21:15
- - prottoss   Канешна, это все здорово очень, объясните тада, ум...   Jan 18 2007, 21:43
|- - xemul   Цитата(prottoss @ Jan 18 2007, 21:43) Кан...   Jan 18 2007, 21:59
|- - prottoss   Цитата(xemul @ Jan 19 2007, 01:59) Цитата...   Jan 18 2007, 22:04
|- - xemul   Цитата(prottoss @ Jan 18 2007, 22:04) Цит...   Jan 19 2007, 00:20
|- - prottoss   Цитата(xemul @ Jan 19 2007, 04:20) Цитата...   Jan 19 2007, 11:11
- - makc   Предложение ко всем участникам форума - квотить ме...   Jan 19 2007, 11:58
- - SasaVitebsk   Prottoss последний мой проект целиком построен на ...   Jan 20 2007, 04:48
- - SasaVitebsk   Цитата(Сергей Борщ @ Jan 19 2007, 13:06) ...   Jan 20 2007, 05:12


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

 


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


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