Добрый день. Решил поиграться с библиотекой IQMath. Решил сравнить что быстрее. Получил очень сильный разброс по скорости. Не знаю, так и должно быть. Сделал вот такой вот тэстовый код.
Прерывание таймера каждую секунду. Получил длительность первого timer1 = 123155, для второго timer2 = 1107. Это получил при оптимизации 02. Отличия меня очень удивили.
Такого не должно быть. Что-то не так. Посмотрите вот эту презентацию и поменяйте код на соответствие её рекомендациям, проверьте дизассемблер, что там происходит.
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва. http://motorcontrol.ru/
А проект собирается под плавающую точку? Не может быть такого, что проект билдится с установками под фиксированную точку и используется соответствующая библиотека математических функций? Тогда "sin" будет расчитываться инструкциями под фиксированную точку и занимать много времени.
Или ещё вариант - функция "sin" принимает и возвращает переменные типа "float" или "double"? FPU здесь умеет работать только в single precision переменными, то есть "float". Для работы с "double" опять же вызываются библиотечные функции. Попробуйте вызывать функцию "sinf" вместо "sin".
Disona писал(а): ↑09 ноя 2018, 14:45
Или ещё вариант - функция "sin" принимает и возвращает переменные типа "float" или "double"? FPU здесь умеет работать только в single precision переменными, то есть "float". Для работы с "double" опять же вызываются библиотечные функции. Попробуйте вызывать функцию "sinf" вместо "sin".
Вы были правы, я отправлял в sin float переменную, хотя sin и должен принимать double. Смена функции sin на sinf дала значительно менее шокирующие цифры) отличие в ~3 раза по скорости получилось. Спасибо.
В документации практически не описан способ настройки каналов А/В модуля ЩИМ на комплементарную работу.
Мёртвое время есть, а комплементарной работы как бы и нет, хотя как-то упоминается.
В документации практически не описан способ настройки каналов А/В модуля ЩИМ на комплементарную работу.
Мёртвое время есть, а комплементарной работы как бы и нет, хотя как-то упоминается.
Посмотрите не рисунок 14.12. Там, на структуре, видно несколько способов, как это можно сконструировать.
Проще всего делать так - настроить в обработчике событий на работу только PWMA, в модуле мертвого времени его выбрать как источник сигнала полем MODE, а дальше включить инверсию в POLSEL у одного из каналов (в зависимости от вашего железа).
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва. http://motorcontrol.ru/
Спасибо! Разобрался, когда прочитал код ExamplePWM и документацию.
Ещё интересный момент, касающийся программы ExamplePWM, где копируются функции секции fastcode в ОЗУ.
Не могу понять, как понять какие именно функции попадают в fastcode? Как управлять этим процессом.
Можно ли вообще избежать разбирательств c файлами startup_MCP_gcc.S, ...flash.ld и ссылок на них в своём коде?
Секция fastcode в ОЗУ это атавизм, когда мы пытались ускорить работу программы переносом кода в оперативку. На данной архитектуре в силу топологии шин данных это менее эффективно, чем выполнять код из флеша. Поэтому лучше просто забить - пользуйтесь готовыми стартам файлами и файлом линковки, в 99% случаев туда лезть не придется.
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва. http://motorcontrol.ru/
Снова каким-то невероятным образом слетел openocd Debug в VectorIDE! Переустановка всего пакета с переустановкой драйверов ничего не даёт! Может ли помочь каким-то образом обновление openocd Debug из архива niietcm4-k1921vkx_sdk-c1340efb3ca7 ? Что в таком случае нужно сделать?
Пробовал работать в IAR, но JLink выдаёт такое сообщение: