|
|
  |
Размещение функций в памяти компилятором IAR 3.20, происходит сброс контроллера при ret |
|
|
|
Apr 22 2005, 10:01
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 3-03-05
Из: Санкт-Петербург
Пользователь №: 3 037

|
Насколько я понял, компилятор размещает функции во флэше по возможности в порядке их появления/вызова. Происходит вот что: была функция, размещенная компилятором С (смотрел в ассемблере) где-то в районе памяти $1600-$1700, эта функция несколько раз вызывает рядом лежащую функцию, и в один прекрасный момент, при очередном вызове этой маленькой подфункции, происходит "вылетание" при операции RET, контроллер сбрасывается. Со стеком всё хорошо. Ради интереса беру, пишу в основном теле программы вызов этой глючной функции сразу после инициализации. Компилятор размещает её чуть-чуть в другом месте (где-то $1600), и она работает и при первом вызове, и уже при последующих так как надо. Но это не метод - ведь если одна функция отказала, то не факт, что другая сработает. В чем может быть загвоздка?
|
|
|
|
|
Apr 22 2005, 10:40
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Olegovich @ Apr 22 2005, 16:01) Насколько я понял, компилятор размещает функции во флэше по возможности в порядке их появления/вызова. Происходит вот что: была функция, размещенная компилятором С (смотрел в ассемблере) где-то в районе памяти $1600-$1700, эта функция несколько раз вызывает рядом лежащую функцию, и в один прекрасный момент, при очередном вызове этой маленькой подфункции, происходит "вылетание" при операции RET, контроллер сбрасывается. Со стеком всё хорошо. Ради интереса беру, пишу в основном теле программы вызов этой глючной функции сразу после инициализации. Компилятор размещает её чуть-чуть в другом месте (где-то $1600), и она работает и при первом вызове, и уже при последующих так как надо. Но это не метод - ведь если одна функция отказала, то не факт, что другая сработает. В чем может быть загвоздка? 1. Запретите работу WatchDog пока отлаживаетесь 2. Задайте все вектора прерываний, хотя бы reti расставьте в каждом.
|
|
|
|
|
Apr 22 2005, 11:59
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 3-03-05
Из: Санкт-Петербург
Пользователь №: 3 037

|
Цитата(Axel @ Apr 22 2005, 14:50) Попробуйте выделить побольше памяти под стек. Нет, со стеком все нормально. Прерывания вообще нигде не используются... У меня MSP430F149.
|
|
|
|
|
Apr 22 2005, 14:38
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Olegovich @ Apr 22 2005, 17:39) WatchDog запрещен... Действительно, происходит некое прерывание, но почему...  Дык я же говорю! Определите ВСЕ вектора преываний. Ну хоть NOP там вставьте в каждое, чтобы можно было бейкпоинты расставить и выяснить какое именно прерывание вызывается. Неужели так сложно из <msp430x14x.h> скопировать раздел дефайнов под названием Код /************************************************************ * Interrupt Vectors (offset from 0xFFE0) ************************************************************/ и преобразовать их в обработчики перываний? Раз самому лень набивать  Еще мысль. Вы запись во Flash не используете часом? Или запись в RAM через инкремент указателя? Может где-то в цикле указатель выходит из области RAM и попадает в область Flash? В такой ситуации точно прерывание вылетит.
|
|
|
|
|
Apr 25 2005, 08:01
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 3-03-05
Из: Санкт-Петербург
Пользователь №: 3 037

|
Я понял, что происходит прерывание NMI, запретил все прерывания в регистрах IE1, IE2, никаких прерываний вообще не разрешено! И тем не менее происходит такая же ерунда! Причем если я опять-таки размещаю функции в другой области памяти, то работает!!! Бардак...
|
|
|
|
|
Apr 25 2005, 10:25
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Olegovich @ Apr 25 2005, 14:01) Я понял, что происходит прерывание NMI, запретил все прерывания в регистрах IE1, IE2, никаких прерываний вообще не разрешено! И тем не менее происходит такая же ерунда! NMI - NotMaskInterrupt - НЕмаскируемое прерывание. Цитата Немаскируемое прерывание NMI может быть вызвано тремя событиями:
* Появление фронта сигнала на выводе RST/NMI * Появление неисправности осциллятора * Нарушение доступа к флэш-памяти См. Раздел 2. Системный сброс, прерывания и рабочие режимыЦитата(Olegovich @ Apr 25 2005, 14:01) Причем если я опять-таки размещаю функции в другой области памяти, то работает!!! Бардак...  Еще раз предлагаю обратить внимание на Цитата(rezident) Вы запись во Flash не используете часом? Или запись в RAM через инкремент указателя? Может где-то в цикле указатель выходит из области RAM и попадает в область Flash? В такой ситуации точно прерывание вылетит.
|
|
|
|
|
May 11 2005, 11:26
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 3-03-05
Из: Санкт-Петербург
Пользователь №: 3 037

|
Цитата(kpv @ May 11 2005, 13:09) желательно такие треды заканчивать более осмысленным сообщением. мол было то то и то-то, чтобы другие не повторяли подобных ошибок  Если вы такие умные, что ж вы строем не ходите? К сожалению, причины остались не установлены. Возможно, аппаратные.
|
|
|
|
|
May 11 2005, 19:53
|
Участник

Группа: Свой
Сообщений: 23
Регистрация: 28-02-05
Пользователь №: 2 946

|
Цитата(Olegovich @ May 11 2005, 14:26) Цитата(kpv @ May 11 2005, 13:09) желательно такие треды заканчивать более осмысленным сообщением. мол было то то и то-то, чтобы другие не повторяли подобных ошибок  Если вы такие умные, что ж вы строем не ходите? К сожалению, причины остались не установлены. Возможно, аппаратные. У меня был такой глюк... Я просто уменьшил количество переменных - глюк пропал... Просто были массивы, которые полностью не использовались, обрезал их размер и всё стало нормально, видимо ОЗУ было маловато, стек куда-то наслаивался и всё портил или что-то подобное... Но глюк был именно с памятью... после компиляции ИАР пишет сколько нужно ОЗУ... этот объем был в районе 1990 (от 2048), уменьшил его примерно до 1920 и всё заработало... Конечно всё наверняка зависит от конкретной программы и от вложенных вызовов функции, но такой эффект имел место быть, и выражался именно в том, что портился адрес возврата функции ret, которая вышвыривала фиг знает куда...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|