Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработка ошибок с плавающей запятой
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Diver_ant
Подскажите пожалуйста, как правильно обрабатывать ошибки с плавающей запятой, такие как деление на ноль например? Как можно проверить является ли данный участок памяти действиетльно валидным флоатом? Есть ли возможность обрабатывать подобные ошибки через прерывания?
defunct
Цитата(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..
scifi
Посмотрите файлы math.h и fenv.h, там много интересного.
Diver_ant
Цитата(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.
scifi
Цитата(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, и там в библиотеке всё это есть. У Вас неизвестно что за библиотека, так что не могу сказать, есть оно там или нет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.