Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Инструментарий

Инструментарий Тестеры, паяльники, осциллографы, программаторы, IDE.

Ответ
 
Опции темы Опции просмотра
Старый 21.02.2017, 13:58   #1
eleks
Senior Member
 
Аватар для eleks
 
Регистрация: 15.05.2007
Сообщений: 226
Вес репутации: 191/41
eleks has a spectacular aura abouteleks has a spectacular aura about
По умолчанию Аппаратное умножение PIC18 в MikroC

Обнаружил, что код содержащий умножение 32х32 слишком долго выполняется (более 100мкс). Начал разбираться и первым делом попытался обнаружить команду MULWF в .lst файле. К своему удивлению такой команды не обнаружил. Похоже, что процедура _Mul_32x32_U не использует аппаратного умножения.
Может быть компилятору нужно где-то сказать, чтобы он использовал аппаратное умножение?
Или не парится и написать подпрограмму на asm ?
eleks вне форума   Ответить с цитированием
Старый 21.02.2017, 16:12   #2
eleks
Senior Member
 
Аватар для eleks
 
Регистрация: 15.05.2007
Сообщений: 226
Вес репутации: 191/41
eleks has a spectacular aura abouteleks has a spectacular aura about
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

В конфигурации проекта расширенные команды разрешены
Extended Instruction Set - Enabled
eleks вне форума   Ответить с цитированием
Старый 21.02.2017, 17:29   #3
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 38
Сообщений: 3,249
Вес репутации: 3684/106
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

А что у с уровнем оптимизации? Может оптимизация отключена и компилятор все вычисления разворачивает?
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 22.02.2017, 10:55   #4
eleks
Senior Member
 
Аватар для eleks
 
Регистрация: 15.05.2007
Сообщений: 226
Вес репутации: 191/41
eleks has a spectacular aura abouteleks has a spectacular aura about
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

Цитата:
Сообщение от IceS Посмотреть сообщение
А что у с уровнем оптимизации? Может оптимизация отключена и компилятор все вычисления разворачивает?
Стоял четвертый. Установил пятый, но аппаратное умножение так и не появилось.
eleks вне форума   Ответить с цитированием
Старый 22.02.2017, 19:13   #5
masterzx
Senior Member
 
Аватар для masterzx
 
Регистрация: 21.09.2007
Адрес: Барнаул
Возраст: 31
Сообщений: 1,474
Вес репутации: 826/58
masterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to beholdmasterzx is a splendid one to behold
Отправить сообщение для masterzx с помощью ICQ
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

И не будет. Нужно ассемблерными вставками аппаратное умножение использовать. По другому ни как.
__________________
Если проблему можно решить за деньги, то это не проблема, это расходы. Еврейская мудрость.
masterzx вне форума   Ответить с цитированием
Старый 22.02.2017, 23:22   #6
eleks
Senior Member
 
Аватар для eleks
 
Регистрация: 15.05.2007
Сообщений: 226
Вес репутации: 191/41
eleks has a spectacular aura abouteleks has a spectacular aura about
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

Моё скромное мнение также склоняется к такой точке зрения.
Однако, Ваше заключение сделано на основании собственного опыта или эта особенность где-то упоминается в документации?
eleks вне форума   Ответить с цитированием
Старый 23.02.2017, 22:48   #7
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: МО
Возраст: 57
Сообщений: 1,873
Вес репутации: 2415/79
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

Думаю, что проблема в регистре результата. Он не вписывается в модель поддерживаемую компилятором. Точно так же в 16-разрядных dsPIC-ах компилятор ничего не знает о DSP-ядре. Для него 40-разрядный аккумулятор - "чудо заморское" и не имеет никакого отношения к АЛУ.
Марк вне форума   Ответить с цитированием
Старый 27.02.2017, 18:45   #8
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 38
Сообщений: 3,249
Вес репутации: 3684/106
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

Ну если все дело в разрядности, то результат можно "обозвать" большей разрядности - вдруг компилятор передумает.
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 27.02.2017, 23:09   #9
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: МО
Возраст: 57
Сообщений: 1,873
Вес репутации: 2415/79
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

Причем тут разрядность?
Дело не в разрядности, а в расположении регистра PROD. Он не относится к АЛУ. Умножение прикручено к ядру как периферийный модуль.
А скажем, результат умножения в PIC24 оказывается в РОНах. И, несмотря на превышение натуральной разрядности ядра вполне вписывается в модель ядра.
Марк вне форума   Ответить с цитированием
Старый 28.02.2017, 08:04   #10
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 38
Сообщений: 3,249
Вес репутации: 3684/106
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

Цитата:
Сообщение от Марк Посмотреть сообщение
Причем тут разрядность?
Дело не в разрядности, а в расположении регистра PROD. Он не относится к АЛУ. Умножение прикручено к ядру как периферийный модуль.
А скажем, результат умножения в PIC24 оказывается в РОНах. И, несмотря на превышение натуральной разрядности ядра вполне вписывается в модель ядра.
Причем тут АЛУ?
Где бы этот регистр не находился, к нему по любому можно организовать доступ, а это чисто программные вещи. Просто это не сделано в компиляторе/линкере.
__________________
- Готово, мастер !!!
- Что готово ???
- Сломал ...
IceS вне форума   Ответить с цитированием
Старый 28.02.2017, 14:18   #11
eleks
Senior Member
 
Аватар для eleks
 
Регистрация: 15.05.2007
Сообщений: 226
Вес репутации: 191/41
eleks has a spectacular aura abouteleks has a spectacular aura about
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

Сделал функцию с ассемблерной вставкой для использования быстрого умножения.
Код:
union {
unsigned char b8[4];
unsigned int b16[2];
unsigned long b32;
} muls1;
union {
unsigned char b8[4];
unsigned int b16[2];
unsigned long b32;
} muls2;
union {
unsigned char b8[4];
unsigned int b16[2];
unsigned long b32;
} muls3;
union {
unsigned char b8[4];
unsigned int b16[2];
unsigned long b32;
} muls4;
union {
unsigned char b8[2];
unsigned int b16;
} arg1;
union {
unsigned char b8[2];
unsigned int b16;
} arg2;
//
///////////////////////////////////////////////////////////////////////////////
// 16*16 bits Multiplication
unsigned long mul32fast(unsigned int arg_1,unsigned int arg_2) {
        arg1.b16 = arg_1;
        arg2.b16 = arg_2;
        asm {
                movf  _arg1,0
                mulwf _arg2
                movff prodl,_muls1
                movff prodh,_muls1+1
                clrf  _muls1+2
                clrf  _muls1+3

                movf  _arg1+1,0
                mulwf _arg2
                movff prodl,_muls2+1
                movff prodh,_muls2+2
                clrf  _muls2
                clrf  _muls2+3

                movf  _arg1,0
                mulwf _arg2+1
                movff prodl,_muls3+1
                movff prodh,_muls3+2
                clrf  _muls3
                clrf  _muls3+3

                movf  _arg1+1,0
                mulwf _arg2+1
                movff prodl,_muls4+3
                movff prodh,_muls4+4
                clrf  _muls4
                clrf  _muls4+1
        }
        return muls1.b32 + muls2.b32 + muls3.b32 + muls4.b32;
}
Считает быстро (примерно 24мкс против 150мкс), но выдает неверный результат. Похоже что-то напутал с разрядностью, но пока не разобрался что и где.
eleks вне форума   Ответить с цитированием
Старый 28.02.2017, 17:47   #12
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,563
Вес репутации: 4996/153
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

Цитата:
Сообщение от eleks Посмотреть сообщение
Считает быстро (примерно 24мкс против 150мкс), но выдает неверный результат. Похоже что-то напутал с разрядностью, но пока не разобрался что и где.
не надо приводить микросекунды, он ни о чем не говорят. Программу принято оценивать в циклах (определяется stopwatch), размере памяти программ, и уже потом размере озу. Оцените. А потом можно будет сравнить с (нормальным) софтовым умножителем.

Последний раз редактировалось Greg; 28.02.2017 в 18:04.
Greg вне форума   Ответить с цитированием
Старый 02.03.2017, 07:42   #13
Zikon
Junior Member
 
Регистрация: 04.07.2012
Сообщений: 10
Вес репутации: 139/20
Zikon will become famous soon enoughZikon will become famous soon enough
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

вначале было про умножение 32х32->??
а программа на ASMе умножение 16х16->32

а микросекунды как сравниваете?
Zikon вне форума   Ответить с цитированием
Старый 02.03.2017, 07:50   #14
Zikon
Junior Member
 
Регистрация: 04.07.2012
Сообщений: 10
Вес репутации: 139/20
Zikon will become famous soon enoughZikon will become famous soon enough
Thumbs up Re: Аппаратное умножение PIC18 в MikroC

немного подправил

Код:
union { 
  unsigned char b8[4]; 
  unsigned int b16[2]; 
  unsigned long b32; 
} muls1; 
union { 
  unsigned char b8[2]; 
  unsigned int b16; 
} arg1; 
union { 
  unsigned char b8[2]; 
  unsigned int b16; 
} arg2; 
// /////////////////////////////////////////////////////////////////////////////// // 16*16 bits Multiplication unsigned long mul32fast(unsigned int arg_1,unsigned int arg_2) 
{         
  arg1.b16 = arg_1;         
  arg2.b16 = arg_2;         
  asm {                 
            movf    _arg1,0                 
            mulwf   _arg2                 
            movff   prodl,_muls1                 
            movff   prodh,_muls1+1                  

            movf  _arg1+1,0                 
            mulwf _arg2+1                 
            movff prodl,_muls1+2                 
            movff prodh,_muls1+3 

                movf  _arg1+1,0                 
                mulwf _arg2
                movf   prodl,0
                addwf  _muls1+1
                movf   prodh,0
                addwfc _muls1+2
                clrf   wreg
                addwfc _muls1+3

                movf  _arg1,0                 
                mulwf _arg2+1
                movf   prodl,0
                addwf  _muls1+1
                movf   prodh,0
                addwfc _muls1+2
                clrf   wreg
                addwfc _muls1+3
        }         
        return muls1.b32; 
}
Zikon вне форума   Ответить с цитированием
Старый 02.03.2017, 07:56   #15
Zikon
Junior Member
 
Регистрация: 04.07.2012
Сообщений: 10
Вес репутации: 139/20
Zikon will become famous soon enoughZikon will become famous soon enough
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

а ошибку - вот нашел
movff prodl,_muls4+3
movff prodh,_muls4+4

надо
movff prodl,_muls4+2
movff prodh,_muls4+3

хотя в моем варианте уже исправлена
и очень оптимизировано
прямо из DS
Zikon вне форума   Ответить с цитированием
Старый 02.03.2017, 16:20   #16
eleks
Senior Member
 
Аватар для eleks
 
Регистрация: 15.05.2007
Сообщений: 226
Вес репутации: 191/41
eleks has a spectacular aura abouteleks has a spectacular aura about
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

Извиняюсь за отсутствие. Временно был занят другим проектом.
Цитата:
Сообщение от Zikon Посмотреть сообщение
вначале было про умножение 32х32->??
а программа на ASMе умножение 16х16->32
Реально и по логике требуется 16х16->32, но Си по определению все переводит в максимальную разрядность.
Цитата:
Сообщение от Zikon Посмотреть сообщение
а микросекунды как сравниваете?
Устанавливаю ножку контроллера в начале процедуры и сбрасываю в конце. Длительность измеряю осциллографом.
Я вообще больше электронщик чем программист. Программированием занимаюсь эпизодически.
eleks вне форума   Ответить с цитированием
Старый 02.03.2017, 16:48   #17
eleks
Senior Member
 
Аватар для eleks
 
Регистрация: 15.05.2007
Сообщений: 226
Вес репутации: 191/41
eleks has a spectacular aura abouteleks has a spectacular aura about
По умолчанию Re: Аппаратное умножение PIC18 в MikroC

Оптимизированное умножение выполняется за 17.2 мкс (минус цикл), при частоте HF-INTOSC 16 МГц.

Последний раз редактировалось eleks; 02.03.2017 в 17:01.
eleks вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
RTOS OSA: CCS и mikroC PRO tester Продукция MICROCHIP 40 19.12.2013 11:48


Часовой пояс GMT +3, время: 15:36.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot