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

 
 
> Глюк контроллера прерываний или что-то еще?, LPC1114
vasta
сообщение Nov 16 2012, 13:49
Сообщение #1


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

Группа: Участник
Сообщений: 183
Регистрация: 3-02-09
Из: Нск
Пользователь №: 44 325



Хотел бы узнать мнение специалистов по сим микроконтроллерам, ибо обнаружился глюк скорее всего на низком уровне, не знаю в какую сторону ковырять, ибо всю низкоуровненвые настройки далал библиотеками из иара, полагая, что все должно быть корректно, писал только верхний алгоритм, который как будто работает.
Алгоритм следующий.
НА I2C шине висит несколько (конкретно 5) устройств. LPC представляет собой тупо мост I2C - UART. Читает устройство №1, отправляет данные в UART, получает пакет из UART, пишет его в устройство №1, читает устройство №2, отправляет данные в UART, получает пакет из UART, пишет его в устройство №1 ... и далее по алгоритму до №5. Пакеты по 10 байт.
В общем, этот алгоритм у меня глючит. Может пройти 10 циклов, 20, 30, 50, но в конце концов виснет. В дебаггере это выглядит как СSTACK full, выпадает в B_Default_Handler.
Теперь интересные факты. Если убрать обмен по UART, т.е при алгоритме читает устройство №1, пишет в устройство №1, читает устройство №2, пишет в устройство №2 итд все работает без сбоев. UART сам по себе (без I2C) тоже работает - есть режим записи-чтения флеш по UArt, прогнал не один мегабайт, все нормально.
Изза чего может слетать стек? Была мысль, что может прерывания одновременно приходят - хотя вроде такого быть не должно, процессы разнесены. Понизил приоритет прерыванию I2C. Не помогает
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
KRS
сообщение Nov 16 2012, 14:05
Сообщение #2


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



А может просто размер стека надо увеличить?
Если приоритеты у прерываний разные на Cortex-M3 они могут быть вложенными - нагрузка на стек увеличивается!
Go to the top of the page
 
+Quote Post
vasta
сообщение Nov 16 2012, 14:23
Сообщение #3


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

Группа: Участник
Сообщений: 183
Регистрация: 3-02-09
Из: Нск
Пользователь №: 44 325



Не знаю.
Я однажды попадал в такую ошибку (конкретно на LPC), проблема была не в этом и решение было простым. Нюансы к сожалению забыл за давностью лет.
Попробую отключать прерывания, но хотелось бы разобраться (в каких ситуациях обычно вроде бы рабочий код приводит к переполнению стека)
Go to the top of the page
 
+Quote Post
paskal
сообщение Nov 17 2012, 18:08
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(vasta @ Nov 16 2012, 16:49) *
Изза чего может слетать стек?

Из-за некорректного возврата когда со стека снимаются не все параметры. Или в прерывании вы кладете что то на стек а потом забываете убрать. Тогда стек при каждом прерывании увеличивается и когда то переполняется
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 17 2012, 20:17
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(paskal @ Nov 17 2012, 20:08) *
Из-за некорректного возврата когда со стека снимаются не все параметры.
Или в прерывании вы кладете что то на стек а потом забываете убрать.

Интересно, как это может выглядеть?
разве что специально сделать.
Go to the top of the page
 
+Quote Post
paskal
сообщение Nov 18 2012, 15:18
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(_Артём_ @ Nov 17 2012, 23:17) *
Интересно, как это может выглядеть?

Разные варианты.
1. Не те параметры параметры в функцию переданы. 2. На стек что то сохранили и забыли восстановить.

Цитата(_Артём_ @ Nov 17 2012, 23:17) *
разве что специально сделать.

Можно и специально. А можно и по ошибке.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 18 2012, 16:55
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(paskal @ Nov 18 2012, 17:18) *
1. Не те параметры параметры в функцию переданы.

Если функции что-то передали, то считает она их так как умеет - то есть как те.

Цитата(paskal @ Nov 18 2012, 17:18) *
2. На стек что то сохранили и забыли восстановить.

Это больше для ассемблера актуально.
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Nov 19 2012, 05:10
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Маловероятно, но может присутствует рекурсивный вызов?
Более вероятно - наложение прерываний. Стоит на время работы UART запретить прерывания от I2C и наоборот.
Go to the top of the page
 
+Quote Post
Max_Shaman
сообщение Nov 22 2012, 12:15
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 21-04-07
Из: Odessa
Пользователь №: 27 227



Мож просто где-то банальное выравнивание при сохранении данных, все-таки CORTEX-M0 ...
Go to the top of the page
 
+Quote Post

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

 


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


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