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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Keil, отладчик показывает непойми что
evgen2
сообщение Dec 22 2006, 04:06
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Вот тест-прграмма:

#include <string.h>
#include <stdio.h>
#include <LPC214x.H>


Код
volatile int rc=0;
volatile float A0 = 15.2, B0 = 0.152;
int tst(const int iprivod,int id0, float iV0)
{  int iS0, iS2, it0, idx1, idt, iS_m=0x1234, it_m;
[b]   iS_m = (int)(A0 * A0 /B0);
//Locals window show here 0x40000468 for iS_m     
//and 0x000005F0 if next line is commented
[/b]   iS_m = A0 * A0;
   it_m = A0/B0+0.5;
   id0 = iS_m;
   if(iV0 < 0.)
   {
      it0 = iV0/B0+0.5;
   } else {
     iS0 = iV0*iV0/(B0*2.);
   }
   if(id0 <= iS0)
   {      if(iprivod > 0)
         {
            idx1 = 123;
         } else idt = 321;//it_m;
         return 0;
   }

   iS2 = (id0 + iS0);

   if(0x1235 > iS_m)
   {
return iS_m;
   }
return 2;

}

int main (void)
{
  while(1)
  {
  rc=  tst(1,1520, 0.);
  }
}

оптимизаю, всю, какую смог найти - отключил
Собственно, что фигню показывает еще и можно б было пережить, но чем-то подобном у меня виснет. Причем только, если звать из прерывания...

Куды бежать ?
help.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 22 2006, 04:17
Сообщение #2


Гуру
******

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



Цитата(evgen2 @ Dec 22 2006, 04:06) *
Собственно, что фигню показывает еще и можно б было пережить, но чем-то подобном у меня виснет.

Locals у многих отладчиков может иногда показывать фигню, даже с отключенной оптимизацией. Смотрите дизассемблер.

Цитата(evgen2 @ Dec 22 2006, 04:06) *
Причем только, если звать из прерывания...

А как обстоят дела с реентерабельностью float-функций смотрели?
Использование float в прерывании - признак дурного вкуса, ИМХО.
Go to the top of the page
 
+Quote Post
evgen2
сообщение Dec 22 2006, 05:10
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(aaarrr @ Dec 22 2006, 05:17) *
Цитата(evgen2 @ Dec 22 2006, 04:06) *

Собственно, что фигню показывает еще и можно б было пережить, но чем-то подобном у меня виснет.

Locals у многих отладчиков может иногда показывать фигню, даже с отключенной оптимизацией. Смотрите дизассемблер.

Цитата(evgen2 @ Dec 22 2006, 04:06) *
Причем только, если звать из прерывания...

А как обстоят дела с реентерабельностью float-функций смотрели?
Использование float в прерывании - признак дурного вкуса, ИМХО.

С реентабельностью - никак, т.к. вызываю только в прерывании, ставил защиту от повторого попадания в стиле
void fun_foo()
{
static int work=0;
if(work++) return;
......
work = 0;
}

- не помогает

насчет возможности или невозможности использования float point в прерываниях - ничего не нашел в доках.
Да, в отладчике , если из прервывания таймера вызывать аналог tst() - все работает (о, еще одна идея - завтра попробовать из прерывания таймера вызывать на живом процессоре)

Я в непонятках - это бага компилятора, фича процессора или моя граблепритягивательная карма ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 22 2006, 05:26
Сообщение #4


Гуру
******

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



Цитата(evgen2 @ Dec 22 2006, 05:10) *
С реентабельностью - никак, т.к. вызываю только в прерывании, ставил защиту от повторого попадания...

Если в оновном цикле используется float, то такая защита работать не будет, так как float-операторы типа '* ', '/', '+' и т.п. могут быть не реентерабельными.

Цитата(evgen2 @ Dec 22 2006, 05:10) *
Я в непонятках - это бага компилятора, фича процессора или моя граблепритягивательная карма ?

Думаю, ни одно из перечисленного smile.gif
Go to the top of the page
 
+Quote Post
evgen2
сообщение Dec 22 2006, 06:22
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(aaarrr @ Dec 22 2006, 06:26) *
Цитата(evgen2 @ Dec 22 2006, 05:10) *

С реентабельностью - никак, т.к. вызываю только в прерывании, ставил защиту от повторого попадания...

Если в оновном цикле используется float, то такая защита работать не будет, так как float-операторы типа '* ', '/', '+' и т.п. могут быть не реентерабельными.


хммм.... А это где-нибудь в доках написано ?!! (бип) буду, распечатаю и на лоб приклею, если написано. А какие еще могут быть грабли с float point и где про них почитать ?

Вот ведь, а губищи-то по поводу float point пораскатал.... cranky.gif
Go to the top of the page
 
+Quote Post
evgen2
сообщение Dec 22 2006, 06:36
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Кстати - а что тогда в прерываниях можно с float point делать - только копировать ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 22 2006, 06:41
Сообщение #7


Гуру
******

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



Цитата(evgen2 @ Dec 22 2006, 06:22) *
хммм.... А это где-нибудь в доках написано ?!! (бип) буду, распечатаю и на лоб приклею, если написано. А какие еще могут быть грабли с float point и где про них почитать ?

Вот ведь, а губищи-то по поводу float point пораскатал.... cranky.gif

Должно быть написано в документации на компилятор, ключевое слово - reentrancy. Если используется компилятор RVCT, то у него с float все в порядке.

Еще за стеком в прерывании следить стоит тщательнее, могут быть грабли.

Цитата(evgen2 @ Dec 22 2006, 06:36) *
Кстати - а что тогда в прерываниях можно с float point делать - только копировать ?

Я, если честно, вообще не понимаю, зачем с float что-то делать в прерывании? Прерывания по большей части используются по принципу: загрузил - выгрузил - флажки поставил - вышел.
Go to the top of the page
 
+Quote Post
evgen2
сообщение Dec 22 2006, 12:53
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(aaarrr @ Dec 22 2006, 07:41) *
Должно быть написано в документации на компилятор, ключевое слово - reentrancy. Если используется компилятор RVCT, то у него с float все в порядке.

ага. Есть там такое слово. Ровно 3 раза и на одной странице, в связи с нитками (threads)

Цитата(aaarrr @ Dec 22 2006, 07:41) *
Еще за стеком в прерывании следить стоит тщательнее, могут быть грабли.

Цитата(evgen2 @ Dec 22 2006, 06:36) *

Кстати - а что тогда в прерываниях можно с float point делать - только копировать ?

Я, если честно, вообще не понимаю, зачем с float что-то делать в прерывании? Прерывания по большей части используются по принципу: загрузил - выгрузил - флажки поставил - вышел.

основной думатель думает, пришло сообщение в прерывании - посчитали параметры - поправили коэффициенты думателю, вот в этом "посчитали параметры" и сидит float point

Вот обнаружил, что тут, как у больших, есть exeption'ы.... и что по дефолту поведение как у больших....в том числе и по underflow.....очччень сексуально в ембеддед....Но что-то с первого раза ниасилил.... И опять-таки - если ексепшен, то какого хрена в мейне нет, в дебугере нет, в железе - есть
blink.gif
Go to the top of the page
 
+Quote Post
evgen2
сообщение Dec 22 2006, 15:39
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(evgen2 @ Dec 22 2006, 13:53) *
то какого хрена в мейне нет, в дебугере нет, в железе - есть
blink.gif


кое что прояснилось: повесил на прерывание по времени, 11 раз отрабатывает под отладчиком, на 12 раз вылетает в акой-то PAbt_Handler из statup.s... В main'е в момент прерывания выполняется что-то вроде

int T0, Dt0, DeltaT, Nraz;

for(;;)
{ Dt0 = T1TC - T0;
if(Dt0 >= DeltaT)
break;
Nraz++;
}

Таким образом, остается версия что в прерывании низя пользоваться float point'ом, но в доке написать про это забыли....
/me в полных непонятках как "все это" летает, плавает, ездит, если глюк на глюке сидит и глюкой погоняеет....
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 22 2006, 15:53
Сообщение #10


Гуру
******

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



Цитата(evgen2 @ Dec 22 2006, 15:39) *
кое что прояснилось: повесил на прерывание по времени, 11 раз отрабатывает под отладчиком, на 12 раз вылетает в акой-то PAbt_Handler из statup.s...

Prefetch Abort может сгенерировать только железо, например, при вылете программы за пределы памяти. Так что проверьте размер стека IRQ, и оцените возможность повреждения стека основной части в прерывании.
Go to the top of the page
 
+Quote Post
evgen2
сообщение Dec 22 2006, 17:59
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(aaarrr @ Dec 22 2006, 16:53) *
Цитата(evgen2 @ Dec 22 2006, 15:39) *

кое что прояснилось: повесил на прерывание по времени, 11 раз отрабатывает под отладчиком, на 12 раз вылетает в акой-то PAbt_Handler из statup.s...

Prefetch Abort может сгенерировать только железо, например, при вылете программы за пределы памяти. Так что проверьте размер стека IRQ, и оцените возможность повреждения стека основной части в прерывании.

эээ..простите чайника, но как оценить размер стека - этот дебагер, который на самом деле эмулятор в окошке call Stack показывает совсем не то, что в более других отладчиках.


Вот делал RTFM на interrupt нашел :

__irq Enables a C or C++ function to be used as un interrupt routine.... All corrupted registers exept float-point registers are reserved.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 22 2006, 18:15
Сообщение #12


Гуру
******

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



Цитата
как оценить размер стека

Найти, где устанавливается размер стека для режима IRQ (какой-нибудь стартап), и убедиться, что он не слишком мал (не меньше 64-х байт, по крайней мере)

Цитата
All corrupted registers exept float-point registers are reserved

Здесь имеются в виду регистры VFP, которого у LPC нет.
Go to the top of the page
 
+Quote Post
evgen2
сообщение Dec 22 2006, 18:38
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(aaarrr @ Dec 22 2006, 19:15) *
Цитата
как оценить размер стека

Найти, где устанавливается размер стека для режима IRQ (какой-нибудь стартап), и убедиться, что он не слишком мал (не меньше 64-х байт, по крайней мере)

ааааа!!!!
Во, похоже на то.... по дефолту там 0x80 стоит, поставил 0x100 - те же яйцы, только на 5ом вызове. 0x200 - заработало! по краенй мере в эмуляторе... балин, я тут чуть не издох от тоски....
А где стек-то смотреть можно - "сколько я сейчас отъел" ?

Цитата(aaarrr @ Dec 22 2006, 19:15) *
Цитата
All corrupted registers exept float-point registers are reserved

Здесь имеются в виду регистры VFP, которого у LPC нет.

аааа....
А тут какого-то господина кейла чуть не начал воспитывать.....
Go to the top of the page
 
+Quote Post
Alex03
сообщение Dec 22 2006, 18:46
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(aaarrr @ Dec 22 2006, 20:15) *
Найти, где устанавливается размер стека для режима IRQ (какой-нибудь стартап), и убедиться, что он не слишком мал (не меньше 64-х байт, по крайней мере)


Если evgen2 будет там флоаты пользовать то ИМХО 16 слов это мало!
А если ещё и прочих функций повызывать с вложенностью Х и с некоторым кол-вом локальных переменных то .....

Кстати довольно часто можно обойтись целочисленными вычислениями, в том числе с фиксированной точкой. (Только время на разработку оно может больше занять)



Цитата(evgen2 @ Dec 22 2006, 20:38) *
ааааа!!!!
Во, похоже на то.... по дефолту там 0x80 стоит, поставил 0x100 - те же яйцы, только на 5ом вызове. 0x200 - заработало! по краенй мере в эмуляторе... балин, я тут чуть не издох от тоски....
А где стек-то смотреть можно - "сколько я сейчас отъел" ?

Не кисло для прерывания!
Мож Вы там ещё и printf-ы/scanf-ы пользуете и т.д. типа массивов локальных переменных?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 22 2006, 19:28
Сообщение #15


Гуру
******

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



Цитата(Alex03 @ Dec 22 2006, 18:46) *
Кстати довольно часто можно обойтись целочисленными вычислениями, в том числе с фиксированной точкой. (Только время на разработку оно может больше занять)

Лучше вообще обойтись без вычислений в прерывании. Но в данном случае, по-моему, следует сначала разобраться, в чем дело, и заставить работать, а потом уже менять идеологию.

Цитата(evgen2 @ Dec 22 2006, 20:38) *
А где стек-то смотреть можно - "сколько я сейчас отъел" ?

Можно смотреть в отладчике регистр SP(R13). Еще можно заполнить область стека константой, а потом посмотреть, насколько глубоко эта область затерлась.


Да, еще в RVCT должна быть опция Software Stack Check.
Go to the top of the page
 
+Quote Post

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

 


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


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