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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Останавливается LPC2138, Проблемы при работе с плавающей точкой
vkle
сообщение Aug 19 2008, 14:58
Сообщение #1


Участник
*

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



Есть плата c lpc2138.

Все отлично работает до того момента как я начинаю пользоваться плавающей точкой.

Например
int z = 2;
float a = 10;
a = a;

Вызывает сброс контроллера.
Использую YAGARTO последний.

В чем может быть проблема?
Может что-то с библиотеками?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 19 2008, 14:59
Сообщение #2


Гуру
******

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



Стек проверьте, есть ли выравнивание по границе 2-х слов.
Go to the top of the page
 
+Quote Post
vkle
сообщение Aug 19 2008, 15:07
Сообщение #3


Участник
*

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



А как это сделать? Я просто не специалист...

Если вот так буду определать все будет нормально?

.stack ALIGN(256) :
{
. += STACK_SIZE;
PROVIDE (Top_Stack = .);
} > RAM

Если есть возможность покажите startup и ld-script пожалуйста.

Сообщение отредактировал vkle - Aug 19 2008, 15:09
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 19 2008, 15:12
Сообщение #4


Гуру
******

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



Цитата(vkle @ Aug 19 2008, 19:07) *
А как это сделать? Я просто не специалист...

Надежнее всего симулятором непосредственно при вызове float-функции.

Цитата(vkle @ Aug 19 2008, 19:07) *
Если вот так буду определать все будет нормально?

Не факт: испортить выравнивание можно легко.


Опять таки я далеко не уверен, что дело именно в стеке. Просто проверьте.
Go to the top of the page
 
+Quote Post
vkle
сообщение Aug 19 2008, 15:16
Сообщение #5


Участник
*

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



В map файле стек находится вот так:
.stack 0x40000100 0x2400
*(.stack)
.stack 0x40000100 0x2400 crt0.o
0x40002500 PROVIDE (_stack, .)
0x40002500 . = ALIGN (0x4)
0x40002500 _end = .
0x40002500 PROVIDE (end, .)


Цитата
Надежнее всего симулятором непосредственно при вызове float-функции.

Фух, а что при этом должно быть? Т.е. что смотреть и как распознать выровнен он или нет? И если не выровнен, то что делать?

Как я и говорил я в этом не сильно понимаю.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 19 2008, 15:20
Сообщение #6


Гуру
******

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



Цитата(vkle @ Aug 19 2008, 19:16) *
Фух, а что при этом должно быть? Т.е. что смотреть и как распознать выровнен он или нет?

После перехода на функцию младшие 3 бита R13 должны быть равны 0.
Go to the top of the page
 
+Quote Post
vkle
сообщение Aug 19 2008, 16:02
Сообщение #7


Участник
*

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



И в eclipse и в insight 12 регистров. Т.е. нужен именно симулятор?

Если я обнаружу что нет выравнивания, то что делать?

Показывает вот такое: когда пытается вызвать _floatsidf
- 0x3280 <__floatsidf>: andeq r0, r0, r0
- 0x3284 <__floatsidf+4>: andeq r0, r0, r0
- 0x3288 <__floatsidf+8>: andeq r0, r0, r0
- 0x328c <__floatsidf+12>: andeq r0, r0, r0
- 0x3290 <__floatsidf+16>: andeq r0, r0, r0
- 0x3294 <__floatsidf+20>: andeq r0, r0, r0
- 0x3298 <__floatsidf+24>: andeq r0, r0, r0
- 0x329c <__floatsidf+28>: andeq r0, r0, r0
- 0x32a0 <__floatsidf+32>: andeq r0, r0, r0
- 0x32a4 <__floatsidf+36>: andeq r0, r0, r0
- 0x32a8 <__floatsidf+40>: andeq r0, r0, r0
Это не похоже на функцию....
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 19 2008, 16:04
Сообщение #8


Гуру
******

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



Значит у Вас с библиотекой что-то не так.
Go to the top of the page
 
+Quote Post
vkle
сообщение Aug 19 2008, 16:08
Сообщение #9


Участник
*

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



Вместо R13 - есть sp. Это наверняка stack pointer.
С ним все ОК. Он равен 0x40002168.

А вы не могли бы выложить хорошие библиотеки или повосетовать какимы вы сами пользуетесь?
Или на почту vkle ат mail.ru
Спасибо.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 19 2008, 16:11
Сообщение #10


Гуру
******

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



Дело не в "хорошести", а в том, что библиотека у Вас, судя по всему, просто не прилинковалась. А почему это произошло - не известно.
Go to the top of the page
 
+Quote Post
vkle
сообщение Aug 19 2008, 16:25
Сообщение #11


Участник
*

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



А как проверить прилинковалась или нет? В map файле она есть.
Линкер при сборке не ругается.
Какие могут быть варианты?
У вас случаем нет Makefile которым вы пользуетесь?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 19 2008, 16:30
Сообщение #12


Гуру
******

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



Я, к сожалению, не пользуюсь YAGARTO.
Go to the top of the page
 
+Quote Post
vkle
сообщение Aug 19 2008, 16:38
Сообщение #13


Участник
*

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



А что советуете?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 19 2008, 16:41
Сообщение #14


Гуру
******

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



Вы имеете в виду, какой компилятор? Я давно пользуюсь продукцией ARM (ADS, RVDS) и очень ей доволен.
Go to the top of the page
 
+Quote Post
vkle
сообщение Aug 19 2008, 20:03
Сообщение #15


Участник
*

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



Все дальше парюсь...
Вобщем написал такой нехитрый код:
int main(){
float a = 10.2;
while(1){
a /= 2.0;
}
return 0;
}

Не использую никаких прерываний.
Если из мейкфайла (из компиляции) удаляю все остальные свои коды, то при входе в функцию деления __divsf3 вижу:
0x4d8 <__divsf3>: mov r12, #255 ; 0xff
0x4dc <__divsf3+4>: ands r2, r12, r0, lsr #23
0x4e0 <__divsf3+8>: andsne r3, r12, r1, lsr #23
0x4e4 <__divsf3+12>: teqne r2, r12
...
Если включаю в компиляцию написанные модули, но main не меняю и в main.c ничего не дописываю, то при входе в __divsf3 вижу шлак:
0x35b0 <__divsf3>: andeq r0, r0, r0
0x35b4 <__divsf3+4>: andeq r0, r0, r0
0x35b8 <__divsf3+8>: andeq r0, r0, r0
0x35bc <__divsf3+12>: andeq r0, r0, r0
0x35c0 <__divsf3+16>: andeq r0, r0, r0
...
Что это может быть?
Go to the top of the page
 
+Quote Post
Alex03
сообщение Aug 20 2008, 03:10
Сообщение #16


Местный
***

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



Цитата(vkle @ Aug 20 2008, 02:03) *
Если из мейкфайла (из компиляции) удаляю все остальные свои коды, то при входе в функцию ....


Не плохо было бы приветсти "все остальные свои коды", ну или там Makefile.
Если мне не изменяет память, то andeq r0, r0, r0 имеет код операции 0x00000000.
Go to the top of the page
 
+Quote Post
vkle
сообщение Aug 20 2008, 06:09
Сообщение #17


Участник
*

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



Ну да, вываливается в пустую область памяти. При этом вываливается по правильному адресу (судя по map-файлу). Т.е. он переходит на функцию... а там нули.

Теперь про "все остальные коды", я не знаю как они помогут, ведь main.c не меняются, прерывания не используются, т.е. выполняется только приведенный мной код и стартап (crt0.S).
Что делать?
Go to the top of the page
 
+Quote Post
vkle
сообщение Aug 20 2008, 08:56
Сообщение #18


Участник
*

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



Странно, но кажется, что поведение программы зависит от ее размера.
Go to the top of the page
 
+Quote Post

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

 


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


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