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

 
 
 
Reply to this topicStart new topic
> Размещение функций в памяти компилятором IAR 3.20, происходит сброс контроллера при ret
Olegovich
сообщение Apr 22 2005, 10:01
Сообщение #1


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

Группа: Свой
Сообщений: 131
Регистрация: 3-03-05
Из: Санкт-Петербург
Пользователь №: 3 037



Насколько я понял, компилятор размещает функции во флэше по возможности в порядке их появления/вызова.
Происходит вот что:
была функция, размещенная компилятором С (смотрел в ассемблере) где-то в районе памяти $1600-$1700, эта функция несколько раз вызывает рядом лежащую функцию, и в один прекрасный момент, при очередном вызове этой маленькой подфункции, происходит "вылетание" при операции RET, контроллер сбрасывается.
Со стеком всё хорошо.
Ради интереса беру, пишу в основном теле программы вызов этой глючной функции сразу после инициализации. Компилятор размещает её чуть-чуть в другом месте (где-то $1600), и она работает и при первом вызове, и уже при последующих так как надо. Но это не метод - ведь если одна функция отказала, то не факт, что другая сработает.
В чем может быть загвоздка?
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 22 2005, 10:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Olegovich @ Apr 22 2005, 16:01)
Насколько я понял, компилятор размещает функции во флэше по возможности в порядке их появления/вызова.
Происходит вот что:
была функция, размещенная компилятором С (смотрел в ассемблере) где-то в районе памяти $1600-$1700, эта функция несколько раз вызывает рядом лежащую функцию, и в один прекрасный момент, при очередном вызове этой маленькой подфункции, происходит "вылетание" при операции RET, контроллер сбрасывается.
Со стеком всё хорошо.
Ради интереса беру, пишу в основном теле программы вызов этой глючной функции сразу после инициализации. Компилятор размещает её чуть-чуть в другом месте (где-то $1600), и она работает и при первом вызове, и уже при последующих так как надо. Но это не метод - ведь если одна функция отказала, то не факт, что другая сработает.
В чем может быть загвоздка?
*

1. Запретите работу WatchDog пока отлаживаетесь
2. Задайте все вектора прерываний, хотя бы reti расставьте в каждом.
Go to the top of the page
 
+Quote Post
Olegovich
сообщение Apr 22 2005, 11:39
Сообщение #3


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

Группа: Свой
Сообщений: 131
Регистрация: 3-03-05
Из: Санкт-Петербург
Пользователь №: 3 037



WatchDog запрещен...
Действительно, происходит некое прерывание, но почему... unsure.gif
Go to the top of the page
 
+Quote Post
Axel
сообщение Apr 22 2005, 11:50
Сообщение #4


Местный
***

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



Попробуйте выделить побольше памяти под стек.
Go to the top of the page
 
+Quote Post
Olegovich
сообщение Apr 22 2005, 11:59
Сообщение #5


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

Группа: Свой
Сообщений: 131
Регистрация: 3-03-05
Из: Санкт-Петербург
Пользователь №: 3 037



Цитата(Axel @ Apr 22 2005, 14:50)
Попробуйте выделить побольше памяти под стек.
*

Нет, со стеком все нормально.
Прерывания вообще нигде не используются...
У меня MSP430F149.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Apr 22 2005, 14:25
Сообщение #6


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Olegovich @ Apr 22 2005, 14:59)
Нет, со стеком все нормально.
*

Если со стеком всё нормально, то видимо некорректное использование каких-то переменных (например, индекс массива запредельный) портит адрес возврата в стеке.
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 22 2005, 14:38
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Olegovich @ Apr 22 2005, 17:39)
WatchDog запрещен...
Действительно, происходит некое прерывание, но почему...  unsure.gif
*

Дык я же говорю! Определите ВСЕ вектора преываний. Ну хоть NOP там вставьте в каждое, чтобы можно было бейкпоинты расставить и выяснить какое именно прерывание вызывается. Неужели так сложно из <msp430x14x.h> скопировать раздел дефайнов под названием
Код
/************************************************************
* Interrupt Vectors (offset from 0xFFE0)
************************************************************/

и преобразовать их в обработчики перываний? Раз самому лень набивать unsure.gif
Еще мысль. Вы запись во Flash не используете часом? Или запись в RAM через инкремент указателя? Может где-то в цикле указатель выходит из области RAM и попадает в область Flash? В такой ситуации точно прерывание вылетит.
Go to the top of the page
 
+Quote Post
VAI
сообщение Apr 23 2005, 05:34
Сообщение #8


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

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Вот Вам шаблон. Ставьте брекпоинты на нопы.
Код
#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();
}


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Olegovich
сообщение Apr 25 2005, 08:01
Сообщение #9


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

Группа: Свой
Сообщений: 131
Регистрация: 3-03-05
Из: Санкт-Петербург
Пользователь №: 3 037



Я понял, что происходит прерывание NMI, запретил все прерывания в регистрах IE1, IE2, никаких прерываний вообще не разрешено!
И тем не менее происходит такая же ерунда!
Причем если я опять-таки размещаю функции в другой области памяти, то работает!!!
Бардак... unsure.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 25 2005, 10:25
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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)
Причем если я опять-таки размещаю функции в другой области памяти, то работает!!!
Бардак... unsure.gif
*

Еще раз предлагаю обратить внимание на
Цитата(rezident)
Вы запись во Flash не используете часом? Или запись в RAM через инкремент указателя? Может где-то в цикле указатель выходит из области RAM и попадает в область Flash? В такой ситуации точно прерывание вылетит.
Go to the top of the page
 
+Quote Post
Olegovich
сообщение May 11 2005, 09:45
Сообщение #11


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

Группа: Свой
Сообщений: 131
Регистрация: 3-03-05
Из: Санкт-Петербург
Пользователь №: 3 037



Вопрос снят.
blush.gif
Go to the top of the page
 
+Quote Post
kpv
сообщение May 11 2005, 10:09
Сообщение #12


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

Группа: Свой
Сообщений: 138
Регистрация: 1-06-04
Из: Nighny Novgorod
Пользователь №: 27



желательно такие треды заканчивать более осмысленным сообщением. мол было то то и то-то, чтобы другие не повторяли подобных ошибок smile.gif


--------------------
Go to the top of the page
 
+Quote Post
Olegovich
сообщение May 11 2005, 11:26
Сообщение #13


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

Группа: Свой
Сообщений: 131
Регистрация: 3-03-05
Из: Санкт-Петербург
Пользователь №: 3 037



Цитата(kpv @ May 11 2005, 13:09)
желательно такие треды заканчивать более осмысленным сообщением. мол было то то и то-то, чтобы другие не повторяли подобных ошибок smile.gif
*


Если вы такие умные, что ж вы строем не ходите?
К сожалению, причины остались не установлены. Возможно, аппаратные.
Go to the top of the page
 
+Quote Post
shindarah
сообщение May 11 2005, 19:53
Сообщение #14


Участник
*

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



Цитата(Olegovich @ May 11 2005, 14:26)
Цитата(kpv @ May 11 2005, 13:09)
желательно такие треды заканчивать более осмысленным сообщением. мол было то то и то-то, чтобы другие не повторяли подобных ошибок smile.gif
*


Если вы такие умные, что ж вы строем не ходите?
К сожалению, причины остались не установлены. Возможно, аппаратные.
*



У меня был такой глюк... Я просто уменьшил количество переменных - глюк пропал... Просто были массивы, которые полностью не использовались, обрезал их размер и всё стало нормально, видимо ОЗУ было маловато, стек куда-то наслаивался и всё портил или что-то подобное... Но глюк был именно с памятью... после компиляции ИАР пишет сколько нужно ОЗУ... этот объем был в районе 1990 (от 2048), уменьшил его примерно до 1920 и всё заработало... Конечно всё наверняка зависит от конкретной программы и от вложенных вызовов функции, но такой эффект имел место быть, и выражался именно в том, что портился адрес возврата функции ret, которая вышвыривала фиг знает куда... maniac.gif
Go to the top of the page
 
+Quote Post

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

 


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


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