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

 
 
 
Reply to this topicStart new topic
> Библиотека арифметики, использующая аппаратное умножение., math.s90 в некоторых слуачаях выдаёт ошибку линковщик IAR
Д_М
сообщение Apr 5 2013, 10:34
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185



Здравствуйте!
Много лет назад мне один человек любезно предоставил библиотеку math.s90 для IAR AVR, которая использует команды аппаратного умножения. Включается в проект она очень просто. Добавляется, как и другие файлы, но она подменяет собой штатные библиотеки IAR, которые не используют команды аппаратного умножения. Эффективность примерно 2..3 раза, в сравнении со штатными функциями. Однако, когда в проекте стало очень много команд умножения и деления числе с плавающей точкой, линкер стал выдавать ошибку "...is out of bounds". Может быть у кого-нибудь есть более свежая версия такой библиотеки, либо кто-нибудь даст советы, как это можно лечить?
Заранее благодарен!
Go to the top of the page
 
+Quote Post
kovigor
сообщение Apr 5 2013, 10:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Д_М @ Apr 5 2013, 13:34) *
"...is out of bounds".

А полное сообщение об ошибке увидеть можно ?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 5 2013, 10:42
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Пересобрать либу и заменить rjmp на jmp и rcall на call.
А если кардинально, то отказаться от этой либы и посмотреть что в свежих версия яра наоптимизировали его разработчики.
С тех пор как вам её человек дал много лет наверное прошло, а IAR не дураки пишут...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Д_М
сообщение Apr 5 2013, 11:27
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185



Спасибо за мнения!
Во вложении скриншот с сообщением об ошибке. Пробовал более новую версию IAR 5.11B. Он выдаёт ошибку на стандартные определения в заголовочном файле iom64.h. В частности на PB5, PE5... Файл IOAVR.h в проекте есть, выбран процессор Mega64. Чего ему ещё не хватает? Споткнулся на пустом месте. Кто-нибудь проверял - использует ли IAR 5.11B команды аппаратного умножения?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 5 2013, 13:42
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Д_М @ Apr 5 2013, 15:27) *
Кто-нибудь проверял - использует ли IAR 5.11B команды аппаратного умножения?
Я на 100% уверен что использует.
Сбилдите примитивный проект со следующей строчкой, да и посмотрите на асм-листинг. Делов-то 1 мин!!!
Код
PORTD = PORTA * PORTB;

А чтобы понять насколько оптимальна math библиотека тоже можно написать примитивный проектик с floating-point арифметикой...

Цитата(Д_М @ Apr 5 2013, 15:27) *
Файл IOAVR.h в проекте есть, выбран процессор Mega64. Чего ему ещё не хватает?


Project -> Options... -> General Options -> закладка System -> поставить галочку Enable bit definitions in I/O-Include files.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Д_М
сообщение Apr 5 2013, 15:10
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185



Спасибо!
Заменить rjmp на jmp и rcall на call не составило большого труда, так как библиотека начинается с:

#if (A90_PROC_OPTION == 0) || (A90_PROC_OPTION == 1)
#define XCALL RCALL
#define XJMP RJMP
#else
#define XCALL CALL
#define XJMP JMP
#endif

Пробовал заремливать оба варианта. Когда было
#define XCALL RCALL
#define XJMP RJMP
линкер выдавал ошибку.

Когда сделал
#define XCALL CALL
#define XJMP JMP
выдавать ошибку перестал

То есть (A90_PROC_OPTION == 0) || (A90_PROC_OPTION == 1)
Где же в IAR 2.28 устанавливается значение A90_PROC_OPTION ?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 6 2013, 06:57
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата
Где же в IAR 2.28 устанавливается значение A90_PROC_OPTION ?

Например так.
Или в свойствах проекта.
Прочитайте уже наконец что-нибудь по теме, например это.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


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


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