|
перезапуск программы, непонятно почему. |
|
|
|
Jan 16 2007, 21:13
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Jan 17 2007, 17:46
|
Участник

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

|
Цитата(GDI @ Jan 17 2007, 12:42)  Индексы массивов не выходят ли за границы оных, стек не переполняется? Какой компилятор? Да может и исходник бы здесь тоже не помешал.. Компилятор CodeVisionAVR 1.24.8, индексы в порядке, потому что два раза проходит нормально, а на третий выполняя то же самое перезапускается. Размер стека 256 байт, неужели мало? Что такое HEAP SIZE в настройках CVAVR ?
|
|
|
|
|
Jan 17 2007, 19:00
|
Участник

Группа: Новичок
Сообщений: 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 Может здесь причина?
|
|
|
|
|
Jan 17 2007, 19:36
|
Гуру
     
Группа: Свой
Сообщений: 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 можно реализовать и в рамках языка! Просто спросите в форуме - как это сделать. Приведу пример. В начале своего последнего проекта, я хотел делать ассемблерные п/п. Чтобы ускорить работу в некоторых местах. Но решил сделать это после отладки проекта. А, сначала, всё реализовать на Си. Теперь проект закончен. И, наверное я уже просто не буду этим заниматься. У меня просто банально всё работает. Производительность отличная. Так зачем этот цирк?
|
|
|
|
|
Jan 17 2007, 20:14
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jan 17 2007, 20:37
|
Местный
  
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Jan 17 2007, 21:06
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Jan 17 2007, 21:35
|
Участник

Группа: Новичок
Сообщений: 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; (СИ это вам не математика :-)
|
|
|
|
|
Jan 18 2007, 03:43
|
Участник

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

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

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;
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Jan 18 2007, 12:28
|
Участник

Группа: Новичок
Сообщений: 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; Насколько я помню подобные преобразования компилятор делает сам ( только проверил) так как преобразование идет к "большему" типу. Поэтому эти две записи эквивалентны.
|
|
|
|
|
Jan 18 2007, 14:35
|
Участник

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

|
Цитата(Dog Pawlowa @ Jan 18 2007, 13:00)  Цитата(Dan_Dima @ Jan 18 2007, 13:28)  Насколько я помню подобные преобразования компилятор делает сам ( только проверил) так как преобразование идет к "большему" типу. Поэтому эти две записи эквивалентны.
Конечно сам, но на каком этапе? Отличие в записях в моменте преобразования. Преобразование происходит по ходу выполнения вычислений если говорить о том как это делаеться в обычном С. В IAR может действительно надо принудительно описывать привидение типов в том же gcc такого нет.
|
|
|
|
|
Jan 18 2007, 18:08
|
Гуру
     
Группа: Свой
Сообщений: 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.
--------------------
Уходя, оставьте свет...
|
|
|
|
Сообщений в этой теме
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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|