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

 
 
> Размещение функций в памяти компилятором 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
 
Start new topic
Ответов
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

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:11
Рейтинг@Mail.ru


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