Хотел бы узнать мнение специалистов по сим микроконтроллерам, ибо обнаружился глюк скорее всего на низком уровне, не знаю в какую сторону ковырять, ибо всю низкоуровненвые настройки далал библиотеками из иара, полагая, что все должно быть корректно, писал только верхний алгоритм, который как будто работает.
Алгоритм следующий.
НА 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. Не помогает
А может просто размер стека надо увеличить?
Если приоритеты у прерываний разные на Cortex-M3 они могут быть вложенными - нагрузка на стек увеличивается!
Не знаю.
Я однажды попадал в такую ошибку (конкретно на LPC), проблема была не в этом и решение было простым. Нюансы к сожалению забыл за давностью лет.
Попробую отключать прерывания, но хотелось бы разобраться (в каких ситуациях обычно вроде бы рабочий код приводит к переполнению стека)
paskal
Nov 17 2012, 18:08
Цитата(vasta @ Nov 16 2012, 16:49)

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

Из-за некорректного возврата когда со стека снимаются не все параметры.
Или в прерывании вы кладете что то на стек а потом забываете убрать.
Интересно, как это может выглядеть?
разве что специально сделать.
paskal
Nov 18 2012, 15:18
Цитата(_Артём_ @ Nov 17 2012, 23:17)

Интересно, как это может выглядеть?
Разные варианты.
1. Не те параметры параметры в функцию переданы. 2. На стек что то сохранили и забыли восстановить.
Цитата(_Артём_ @ Nov 17 2012, 23:17)

разве что специально сделать.
Можно и специально. А можно и по ошибке.
_Артём_
Nov 18 2012, 16:55
Цитата(paskal @ Nov 18 2012, 17:18)

1. Не те параметры параметры в функцию переданы.
Если функции что-то передали, то считает она их так как умеет - то есть как те.
Цитата(paskal @ Nov 18 2012, 17:18)

2. На стек что то сохранили и забыли восстановить.
Это больше для ассемблера актуально.
andrewlekar
Nov 19 2012, 05:10
Маловероятно, но может присутствует рекурсивный вызов?
Более вероятно - наложение прерываний. Стоит на время работы UART запретить прерывания от I2C и наоборот.
Max_Shaman
Nov 22 2012, 12:15
Мож просто где-то банальное выравнивание при сохранении данных, все-таки CORTEX-M0 ...