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

 
 
 
Reply to this topicStart new topic
> Виснет программа с дерганьем ногой, ...если нога выбирается switch-ем
Colobox
сообщение Mar 23 2010, 08:16
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Доброго всем времени суток!

LPC2138, IAR 4.5
Имеется вот такой код обмена по SPI:
Код
#define CS0_ON          IO0CLR_bit.P0_7= 1//
#define CS0_OFF         IO0SET_bit.P0_7= 1//
#define CS1_ON          IO0SET_bit.P0_10= 1//
#define CS1_OFF         IO0CLR_bit.P0_10= 1//
#define CS_OFF           CS0_OFF; CS1_OFF

//-----------------------------------------------------
bool TSpiTransfer::Pop( void )
{
if ( !Ready() )  return false;
//====
Start();
//====================================
TTransaction* t= &Transaction[current];
//=================
byte a= t->Address();
Select(a);
//=================
Buffer[0]= t->Cmd();//
t->Load( Buffer );
//====
byte l= t->Length();
for ( byte i = 0; i < l; ++i )
{
Spi0ReadWrite( Buffer[i] );
};
//====
l= t->ResponseLength();
for ( int i = 0; i < l; ++i )
{
  Buffer[i]= Spi0ReadWrite();
};

//=================
CS_OFF;//
//=================
t->Apply();//
run= false;
//=======================================
Discount();
//====================================
return true;
}
//------------------------------------------------------
void TSpiTransfer::Select ( byte Address )
{
//=====================
switch ( Address )
  {
   case 0 : CS0_ON;
        break;
   case 1 : CS1_ON;
        break;
  //====
   default : CS0_ON;
   };//end of switch ( Address )
//======================
}
//------------------------------------------------------

После запуска мк виснет насмерть. Пошагово смотрел- выполняются несколько
команд в начале main(), затем прерывание по системному таймеру- обработка прерывания и...
переход на начало программы, затем прерывание и т.д. по кругу.
Если Select() убрать, то все нормально. Если вместо Select() просто поставить CS0_ON (без выбора), например,
то все нормально также.
Чем ИАРу switch с ногодерганьем не нравица???!!! :-(
Причем, замена switch на if (...) else if (...) приводит к такому же зависону.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 23 2010, 10:53
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Вряд ли дело в свиче. А CS1 точно имеет активный уровень 1?
Цитата(Colobox @ Mar 23 2010, 13:16) *
Код
#define CS1_ON          IO0SET_bit.P0_10= 1//

И я бы убрал "//" из макроса.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 23 2010, 11:21
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Colobox @ Mar 23 2010, 12:16) *
Если вместо Select() просто поставить CS0_ON (без выбора), например,
то все нормально также.

Хто такой этот byte у Вас и не помогает ли он влететь в Data Abort ?
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Mar 23 2010, 12:04
Сообщение #4


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Приведенный код работать должен, навсякий неплохо было бы взглянуть на TTransaction. Но 99% проблема или в нехватке стека или прерывания обрабатываются не должным образом ищите собаку там.
Go to the top of the page
 
+Quote Post
Colobox
сообщение Mar 23 2010, 12:59
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Цитата(MALLOY2 @ Mar 23 2010, 16:04) *
Приведенный код работать должен, навсякий неплохо было бы взглянуть на TTransaction. Но 99% проблема или в нехватке стека или прерывания обрабатываются не должным образом ищите собаку там.


Нет, классы ни причем:
Код
//-----------------------------------------------------------
void Select ( byte Address )
{
if( Address )
CS0_ON;
   else
     CS1_ON;
}
//------------------------------------------------------------
int main()
{
.....................
.....................
Select ( 0 );
.....................
.....................
}


Такой безотносительный код тоже виснет. Программа вылетает в _exit:
И потом на j-link овский резет не реагирует, так в exit-е и находится.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Mar 23 2010, 13:27
Сообщение #6


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



_exit: это заглушка иара, туда попадаешь при выходе с функции main, там код зацикливается.

Сделайте так:
Код
int main()
{
   Select ( 0 );
   for(;;);
}


Или так:
Код
int main()
{
    for(;;)
    {
         Select ( 0 );
     }
}
Go to the top of the page
 
+Quote Post
Colobox
сообщение Mar 26 2010, 17:32
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Хм... Посмотрел внимательно прогу: в одном классе описал массивы, а память под них не выделил,
ни статически, ни динамически, а потом заносил в эти масссивы данные, портя память.
Скорее всего в этом и была проблема. Спасибо за ответы smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 9th July 2025 - 18:18
Рейтинг@Mail.ru


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