|
Keil, отладчик показывает непойми что |
|
|
|
Dec 22 2006, 04:06
|
Местный
  
Группа: Участник
Сообщений: 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.); } } оптимизаю, всю, какую смог найти - отключил Собственно, что фигню показывает еще и можно б было пережить, но чем-то подобном у меня виснет. Причем только, если звать из прерывания... Куды бежать ?
|
|
|
|
|
Dec 22 2006, 04:17
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(evgen2 @ Dec 22 2006, 04:06)  Собственно, что фигню показывает еще и можно б было пережить, но чем-то подобном у меня виснет. Locals у многих отладчиков может иногда показывать фигню, даже с отключенной оптимизацией. Смотрите дизассемблер. Цитата(evgen2 @ Dec 22 2006, 04:06)  Причем только, если звать из прерывания... А как обстоят дела с реентерабельностью float-функций смотрели? Использование float в прерывании - признак дурного вкуса, ИМХО.
|
|
|
|
|
Dec 22 2006, 05:10
|
Местный
  
Группа: Участник
Сообщений: 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() - все работает (о, еще одна идея - завтра попробовать из прерывания таймера вызывать на живом процессоре) Я в непонятках - это бага компилятора, фича процессора или моя граблепритягивательная карма ?
|
|
|
|
|
Dec 22 2006, 05:26
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(evgen2 @ Dec 22 2006, 05:10)  С реентабельностью - никак, т.к. вызываю только в прерывании, ставил защиту от повторого попадания... Если в оновном цикле используется float, то такая защита работать не будет, так как float-операторы типа '* ', '/', '+' и т.п. могут быть не реентерабельными. Цитата(evgen2 @ Dec 22 2006, 05:10)  Я в непонятках - это бага компилятора, фича процессора или моя граблепритягивательная карма ? Думаю, ни одно из перечисленного
|
|
|
|
|
Dec 22 2006, 06:22
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(aaarrr @ Dec 22 2006, 06:26)  Цитата(evgen2 @ Dec 22 2006, 05:10)  С реентабельностью - никак, т.к. вызываю только в прерывании, ставил защиту от повторого попадания...
Если в оновном цикле используется float, то такая защита работать не будет, так как float-операторы типа '* ', '/', '+' и т.п. могут быть не реентерабельными. хммм.... А это где-нибудь в доках написано ?!! (бип) буду, распечатаю и на лоб приклею, если написано. А какие еще могут быть грабли с float point и где про них почитать ? Вот ведь, а губищи-то по поводу float point пораскатал....
|
|
|
|
|
Dec 22 2006, 06:41
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(evgen2 @ Dec 22 2006, 06:22)  хммм.... А это где-нибудь в доках написано ?!! (бип) буду, распечатаю и на лоб приклею, если написано. А какие еще могут быть грабли с float point и где про них почитать ? Вот ведь, а губищи-то по поводу float point пораскатал....  Должно быть написано в документации на компилятор, ключевое слово - reentrancy. Если используется компилятор RVCT, то у него с float все в порядке. Еще за стеком в прерывании следить стоит тщательнее, могут быть грабли. Цитата(evgen2 @ Dec 22 2006, 06:36)  Кстати - а что тогда в прерываниях можно с float point делать - только копировать ? Я, если честно, вообще не понимаю, зачем с float что-то делать в прерывании? Прерывания по большей части используются по принципу: загрузил - выгрузил - флажки поставил - вышел.
|
|
|
|
|
Dec 22 2006, 12:53
|
Местный
  
Группа: Участник
Сообщений: 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.....очччень сексуально в ембеддед....Но что-то с первого раза ниасилил.... И опять-таки - если ексепшен, то какого хрена в мейне нет, в дебугере нет, в железе - есть
|
|
|
|
|
Dec 22 2006, 15:39
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(evgen2 @ Dec 22 2006, 13:53)  то какого хрена в мейне нет, в дебугере нет, в железе - есть  кое что прояснилось: повесил на прерывание по времени, 11 раз отрабатывает под отладчиком, на 12 раз вылетает в акой-то PAbt_Handler из statup.s... В main'е в момент прерывания выполняется что-то вроде int T0, Dt0, DeltaT, Nraz; for(;;) { Dt0 = T1TC - T0; if(Dt0 >= DeltaT) break; Nraz++; } Таким образом, остается версия что в прерывании низя пользоваться float point'ом, но в доке написать про это забыли.... /me в полных непонятках как "все это" летает, плавает, ездит, если глюк на глюке сидит и глюкой погоняеет....
|
|
|
|
|
Dec 22 2006, 17:59
|
Местный
  
Группа: Участник
Сообщений: 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.
|
|
|
|
|
Dec 22 2006, 18:15
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата как оценить размер стека Найти, где устанавливается размер стека для режима IRQ (какой-нибудь стартап), и убедиться, что он не слишком мал (не меньше 64-х байт, по крайней мере) Цитата All corrupted registers exept float-point registers are reserved Здесь имеются в виду регистры VFP, которого у LPC нет.
|
|
|
|
|
Dec 22 2006, 18:38
|
Местный
  
Группа: Участник
Сообщений: 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 нет. аааа.... А тут какого-то господина кейла чуть не начал воспитывать.....
|
|
|
|
|
Dec 22 2006, 18:46
|
Местный
  
Группа: Свой
Сообщений: 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-ы пользуете и т.д. типа массивов локальных переменных?
|
|
|
|
|
Dec 22 2006, 19:28
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|