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

 
 
 
Reply to this topicStart new topic
> Обработка ошибок с плавающей запятой, Прошу совета!!!
Diver_ant
сообщение Dec 22 2008, 10:20
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 9-02-07
Пользователь №: 25 200



Подскажите пожалуйста, как правильно обрабатывать ошибки с плавающей запятой, такие как деление на ноль например? Как можно проверить является ли данный участок памяти действиетльно валидным флоатом? Есть ли возможность обрабатывать подобные ошибки через прерывания?
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 22 2008, 15:20
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Diver_ant @ Dec 22 2008, 12:20) *
как правильно обрабатывать ошибки с плавающей запятой, такие как деление на ноль например?

Зависит от вашей конкретной ситуации.
Главное не применять "==" к флоат.

Цитата
Есть ли возможность обрабатывать подобные ошибки через прерывания?

Всегда можно инициировать исключение, например DataAbort и соотв. его обработать...

Пишем прототип для этого дела
Код
extern void raise_exception( U32 code);

оформляем asm функайку:
Код
DeadBeef EQU 0xDEADBEEF

raise_exception:
LDR     R1, =DeadBeef
LDR     R1, [R1]
MOV     pc, lr


В DAbt обработчике смотреть код исключения в R0, если R1 == 0xDEADBEEF..
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 22 2008, 17:46
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Посмотрите файлы math.h и fenv.h, там много интересного.
Go to the top of the page
 
+Quote Post
Diver_ant
сообщение Dec 23 2008, 10:15
Сообщение #4





Группа: Новичок
Сообщений: 6
Регистрация: 9-02-07
Пользователь №: 25 200



Цитата(defunct @ Dec 22 2008, 18:20) *
Зависит от вашей конкретной ситуации.
Главное не применять "==" к флоат.
Всегда можно инициировать исключение, например DataAbort и соотв. его обработать...

Пишем прототип для этого дела
Код
extern void raise_exception( U32 code);

оформляем asm функайку:
Код
DeadBeef EQU 0xDEADBEEF

raise_exception:
LDR     R1, =DeadBeef
LDR     R1, [R1]
MOV     pc, lr


В DAbt обработчике смотреть код исключения в R0, если R1 == 0xDEADBEEF..


Есть вопрос? DataAbort в каком случае генерируется? В случае ошибки с плавающей запятой разве?
Понимание пока отсутствует. Можете обяснить подробнее желательно с наглядными кусками кода?


Цитата(scifi @ Dec 22 2008, 20:46) *
Посмотрите файлы math.h и fenv.h, там много интересного.


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

Заголовочный файл fenv.h у меня присутствует в библиотеки quartusa. Чем он может помочь в моем случае?
Буду признателен за помощь, потому как в голове некоторое не понимание или скорее всего полное не понимание как подобную проблему можно решить на ARM.
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 23 2008, 10:41
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Diver_ant @ Dec 22 2008, 13:20) *
Как можно проверить является ли данный участок памяти действиетльно валидным флоатом?

У меня в math.h определён макрос fpclassify(), который может подойти для этого.

Цитата(Diver_ant @ Dec 22 2008, 13:20) *
Подскажите пожалуйста, как правильно обрабатывать ошибки с плавающей запятой, такие как деление на ноль например?

По стандарту C99 - при помощи средств из fenv.h. См. здесь, к примеру:
http://www.opengroup.org/onlinepubs/000095...efs/fenv.h.html

У меня стоит Keil MDK, и там в библиотеке всё это есть. У Вас неизвестно что за библиотека, так что не могу сказать, есть оно там или нет.
Go to the top of the page
 
+Quote Post

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

 


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


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