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

 
 
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

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

 


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


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