Olegovich 0 22 апреля, 2005 Опубликовано 22 апреля, 2005 · Жалоба Насколько я понял, компилятор размещает функции во флэше по возможности в порядке их появления/вызова. Происходит вот что: была функция, размещенная компилятором С (смотрел в ассемблере) где-то в районе памяти $1600-$1700, эта функция несколько раз вызывает рядом лежащую функцию, и в один прекрасный момент, при очередном вызове этой маленькой подфункции, происходит "вылетание" при операции RET, контроллер сбрасывается. Со стеком всё хорошо. Ради интереса беру, пишу в основном теле программы вызов этой глючной функции сразу после инициализации. Компилятор размещает её чуть-чуть в другом месте (где-то $1600), и она работает и при первом вызове, и уже при последующих так как надо. Но это не метод - ведь если одна функция отказала, то не факт, что другая сработает. В чем может быть загвоздка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 22 апреля, 2005 Опубликовано 22 апреля, 2005 · Жалоба Насколько я понял, компилятор размещает функции во флэше по возможности в порядке их появления/вызова. Происходит вот что: была функция, размещенная компилятором С (смотрел в ассемблере) где-то в районе памяти $1600-$1700, эта функция несколько раз вызывает рядом лежащую функцию, и в один прекрасный момент, при очередном вызове этой маленькой подфункции, происходит "вылетание" при операции RET, контроллер сбрасывается. Со стеком всё хорошо. Ради интереса беру, пишу в основном теле программы вызов этой глючной функции сразу после инициализации. Компилятор размещает её чуть-чуть в другом месте (где-то $1600), и она работает и при первом вызове, и уже при последующих так как надо. Но это не метод - ведь если одна функция отказала, то не факт, что другая сработает. В чем может быть загвоздка? <{POST_SNAPBACK}> 1. Запретите работу WatchDog пока отлаживаетесь 2. Задайте все вектора прерываний, хотя бы reti расставьте в каждом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olegovich 0 22 апреля, 2005 Опубликовано 22 апреля, 2005 · Жалоба WatchDog запрещен... Действительно, происходит некое прерывание, но почему... :unsure: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 22 апреля, 2005 Опубликовано 22 апреля, 2005 · Жалоба Попробуйте выделить побольше памяти под стек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olegovich 0 22 апреля, 2005 Опубликовано 22 апреля, 2005 · Жалоба Попробуйте выделить побольше памяти под стек. <{POST_SNAPBACK}> Нет, со стеком все нормально. Прерывания вообще нигде не используются... У меня MSP430F149. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 22 апреля, 2005 Опубликовано 22 апреля, 2005 · Жалоба Нет, со стеком все нормально. <{POST_SNAPBACK}> Если со стеком всё нормально, то видимо некорректное использование каких-то переменных (например, индекс массива запредельный) портит адрес возврата в стеке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 22 апреля, 2005 Опубликовано 22 апреля, 2005 · Жалоба WatchDog запрещен... Действительно, происходит некое прерывание, но почему... :unsure: <{POST_SNAPBACK}> Дык я же говорю! Определите ВСЕ вектора преываний. Ну хоть NOP там вставьте в каждое, чтобы можно было бейкпоинты расставить и выяснить какое именно прерывание вызывается. Неужели так сложно из <msp430x14x.h> скопировать раздел дефайнов под названием /************************************************************ * Interrupt Vectors (offset from 0xFFE0) ************************************************************/ и преобразовать их в обработчики перываний? Раз самому лень набивать :unsure: Еще мысль. Вы запись во Flash не используете часом? Или запись в RAM через инкремент указателя? Может где-то в цикле указатель выходит из области RAM и попадает в область Flash? В такой ситуации точно прерывание вылетит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 23 апреля, 2005 Опубликовано 23 апреля, 2005 · Жалоба Вот Вам шаблон. Ставьте брекпоинты на нопы. #pragma vector=PORT2_VECTOR __interrupt void PORT2_isr( void ) // 1 * 2 - 0xffe2 Port 2 { _NOP(); } #pragma vector=USART1TX_VECTOR __interrupt void UART1TX_isr( void ) // 2 * 2 - 0xffe4 UART 1 Transmit { _NOP(); } #pragma vector=USART1RX_VECTOR __interrupt void UART1RX_isr( void ) // 3 * 2 - 0xffe6 UART 1 Receive { _NOP(); } #pragma vector=PORT1_VECTOR __interrupt void PORT1_isr( void ) // 4 * 2 - 0xffe8 Port 1 { _NOP(); } #pragma vector=TIMERA1_VECTOR __interrupt void TIMERA1_isr( void ) // 5 * 2 - 0xffea Timer A CC1-2, TA { _NOP(); } #pragma vector=TIMERA0_VECTOR __interrupt void TIMERA0_isr( void ) // 6 * 2 - 0xffec Timer A CC0 { _NOP(); } #pragma vector=ADC_VECTOR __interrupt void ADC_isr( void ) // 7 * 2 - 0xffee ADC { _NOP(); } #pragma vector=USART0TX_VECTOR __interrupt void UART0TX_isr( void ) // 8 * 2 - 0xfff0 UART 0 Transmit { _NOP(); } #pragma vector=USART0RX_VECTOR __interrupt void UART0RX_isr( void ) // 9 * 2 - 0xfff2 UART 0 Receive { _NOP(); } #pragma vector=WDT_VECTOR __interrupt void WDT_isr( void ) // 10 * 2 - 0xfff4 Watchdog Timer { _NOP(); } #pragma vector=COMPARATORA_VECTOR __interrupt void COMPARATORA_isr( void ) // 11 * 2 - 0xfff6 Comparator A { _NOP(); } #pragma vector=TIMERB1_VECTOR __interrupt void TIMERB1_isr( void ) // 12 * 2 - 0xfff8 Timer B 1-7 { _NOP(); } #pragma vector=TIMERB0_VECTOR __interrupt void TIMERB0_isr( void ) // 13 * 2 - 0xfffa Timer B 0 { _NOP(); } #pragma vector=NMI_VECTOR __interrupt void NMI_isr( void ) // 14 * 2 - 0xfffc Non-maskable { _NOP(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olegovich 0 25 апреля, 2005 Опубликовано 25 апреля, 2005 · Жалоба Я понял, что происходит прерывание NMI, запретил все прерывания в регистрах IE1, IE2, никаких прерываний вообще не разрешено! И тем не менее происходит такая же ерунда! Причем если я опять-таки размещаю функции в другой области памяти, то работает!!! Бардак... :unsure: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 25 апреля, 2005 Опубликовано 25 апреля, 2005 · Жалоба Я понял, что происходит прерывание NMI, запретил все прерывания в регистрах IE1, IE2, никаких прерываний вообще не разрешено! И тем не менее происходит такая же ерунда! NMI - NotMaskInterrupt - НЕмаскируемое прерывание. Немаскируемое прерывание NMI может быть вызвано тремя событиями: * Появление фронта сигнала на выводе RST/NMI * Появление неисправности осциллятора * Нарушение доступа к флэш-памяти См. Раздел 2. Системный сброс, прерывания и рабочие режимы Причем если я опять-таки размещаю функции в другой области памяти, то работает!!! Бардак... :unsure: <{POST_SNAPBACK}> Еще раз предлагаю обратить внимание на Вы запись во Flash не используете часом? Или запись в RAM через инкремент указателя? Может где-то в цикле указатель выходит из области RAM и попадает в область Flash? В такой ситуации точно прерывание вылетит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olegovich 0 11 мая, 2005 Опубликовано 11 мая, 2005 · Жалоба Вопрос снят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kpv 12 11 мая, 2005 Опубликовано 11 мая, 2005 · Жалоба желательно такие треды заканчивать более осмысленным сообщением. мол было то то и то-то, чтобы другие не повторяли подобных ошибок :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olegovich 0 11 мая, 2005 Опубликовано 11 мая, 2005 · Жалоба желательно такие треды заканчивать более осмысленным сообщением. мол было то то и то-то, чтобы другие не повторяли подобных ошибок :) <{POST_SNAPBACK}> Если вы такие умные, что ж вы строем не ходите? К сожалению, причины остались не установлены. Возможно, аппаратные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shindarah 0 11 мая, 2005 Опубликовано 11 мая, 2005 · Жалоба желательно такие треды заканчивать более осмысленным сообщением. мол было то то и то-то, чтобы другие не повторяли подобных ошибок :) <{POST_SNAPBACK}> Если вы такие умные, что ж вы строем не ходите? К сожалению, причины остались не установлены. Возможно, аппаратные. <{POST_SNAPBACK}> У меня был такой глюк... Я просто уменьшил количество переменных - глюк пропал... Просто были массивы, которые полностью не использовались, обрезал их размер и всё стало нормально, видимо ОЗУ было маловато, стек куда-то наслаивался и всё портил или что-то подобное... Но глюк был именно с памятью... после компиляции ИАР пишет сколько нужно ОЗУ... этот объем был в районе 1990 (от 2048), уменьшил его примерно до 1920 и всё заработало... Конечно всё наверняка зависит от конкретной программы и от вложенных вызовов функции, но такой эффект имел место быть, и выражался именно в том, что портился адрес возврата функции ret, которая вышвыривала фиг знает куда... :maniac: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться