Перейти к содержанию

    

AlexeyT

Участник
  • Публикаций

    45
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о AlexeyT

  • Звание
    Участник
  1. Умножение и деление в ядрах АРМ

    Ну у Уоррена есть примеры сверхбыстрого вычисления sqrt для float. А на сколько быстрее? Сам пока оценить не могу, нет ни компилятора, чтобы ассемблерный листинг посмотреть, ни само собой отладочной платы. Может кто-нибудь дать оценку?
  2. Умножение и деление в ядрах АРМ

    Всем доброго дня! Есть вопрос: какие операции с плавающей точкой выполняются быстрее - умножение или деление? То есть, как эффективней считать нормировку на ядре Arm: double a; double b, c, d;//значения присваиваются в ходе выполнения программы a = sqrt(b*b + c*c + d*d); b /= a; c /= a; d /= a; Или: double a; double b, c, d;//значения присваиваются в ходе выполнения программы a = 1./sqrt(b*b + c*c + d*d); b *= a; c *= a; d *= a; Ядрa: Cortex-M1 и Cortex-M4F (что не особо важно, т.к. расчеты должны быть в формате double и плавающая запятая в Cortex-M4F не поможет) Спасибо
  3. Контроллер RS-485

    Цитата(редактор @ Nov 20 2017, 12:20) У вас наверняка устаревшие данные. В описании сказано UART до 9 Мбит/сек, IrDA 460800 Мбит/сек. (Описание от 31.01.2014 г. стр 323) Вот страница 301 (описание с сайта Миландра) и тут четко сказано, чему равна предельная частота UART. Можно ткнуть меня носом в место, где написано про "UART до 9 Мбит/сек"?
  4. Контроллер RS-485

    Цитата(@Ark @ Nov 18 2017, 00:58) Если тактовая частота позволяет, то скоростной UART можно программно реализовать. Передача вообще не представляет ни какой сложности. С приемом - чуть сложнее. Нужно задействовать прерывание. Мы используем Миландровский 1986ВЕ1Т с тактовой 144 МГц. На такой частоте по Вашей оценке можно реализовать программный контроллер RS-485 со скоростью 2 Мбит/с?
  5. Контроллер RS-485

    Цитата(AVR @ Nov 13 2017, 15:58) Назовите хоть один отечественный современный МК без UART. И да, такая существует: http://ic.milandr.ru/products/interfeysnye...my/rs485-rs422/ Даже такая: http://ic.milandr.ru/products/interfeysnye...s422/2011vv024/ Спасибо за ответы, только у Миландра - это приемопередатчики, а нужен бы специализированный контроллер. Почему не можем использовать UART - потому что скорости не хватает - 921600 бод, а нам надо около 2 Мбит (RS-485 с такими скоростями позволяет работать)
  6. Контроллер RS-485

    Всем привет! Нет ли у кого-нибудь информации по отечественным ARM-процесорам с встроенным контроллером RS-485? Может быть, кто о разработках таких знает? Может отдельная отечественная микросхема существует? Сразу отвечаю, что Гугл не помог
  7. Передача управления на Cortex-M4F

    Цитата(Forger @ May 31 2017, 12:23) Этот регистр есть во всех Cortex-M, а тут речь про Cortex-M4, но ТС по неизвестным причинам упорно скрывает маркировку камня, поэтому дальнейшие гадания в этом направлении лишены всякого смысла К слову, я использую тока STM (подсел). Так вот в них во всех NVIC_SystemReset сбрасывает весь камень (ядро, шины, память, периферию). Никакого секрета. Используем свой камень 1914ВА018 (http://mvc-nn.ru/продукция/микропроцессоры-и-микроконтроллеры/), очень стойкий ко всякой гадости (проверено испытаниями). Еще раз спасибо всем за ответы
  8. Передача управления на Cortex-M4F

    ЦитатаЕсли нет ПЗУ, то где тогда находится загрузчик? ПЗУ не может не есть. laughing.gif ЦитатаВангую, что в вашем процессоре есть некая ROM с загрузчиком, но нету FLASH-памяти. Так? Есть 4 кБ ПЗУ с загрузчиком, зашитым на заводе (намертво, не Flash). Пользователю оно доступно только на чтение. Процессор стартует из него. Для пользователя есть 128 кБ ОЗУ под инструкции и 64 кБ ОЗУ под данные. Пользовательская программа может появиться в ОЗУ двумя способами: через JTAG или в результате работы заводского загрузчика. После чего управление передается на нее способом, описанным в первом посте, т.е. без сброса. ЦитатаНеужели после подобного "вандализма" вы ожидали другого поведения проца? sm.gif Именно потому, что раньше проблем не было, ожидал - это способ, используемый заводским загрузчиком. ЦитатаА при чем тут некие магические "системные процедуры"? Сброс - есть сброс, иначе он назывался бы иначе: например, передача управления в начало программы или типа того. "Магические процедуры" - типа __main, которая вызывается в векторе RESET. Собственно, и вопрос - в чем отличие? NVIC_SystemReset() - это таки "сброс" или "Передача управления в начало программы"? ЦитатаОчевидно что нужно сбросить и всю периферию. Использовать WDT. Периферия - блоки на шинах AHB/APB? Или все-таки регистры SCB? Мысль с WDT проработаю, спасибо.
  9. Передача управления на Cortex-M4F

    Уважаемые коллеги, помогите разобраться: Есть процессор на базе Cortex-M4, с FPU. У него есть встроенный загрузчик, но нет ПЗУ - только ОЗУ. Есть подключенные к нему внешняя флэш-память и программатор JTAG. Есть тестовая прошивка - настройка тактовой частоты, СОМ-порта и пока всё, дальше бесконечный цикл while(1) {}. Раньше было больше, но при уменьшении до нынешнего варианта косяк не исчез. Принципиальный момент - NVIC в тестовой прошивке не настраивается, обработчики исключений не переопределены. Последовательность работы: При подаче питания процессор начинает исполнять код заводского загрузчика, анализирует линии задания режима загрузки и переходит в режим исполнения программы из внешней флэш-памяти. Она успешно исполняется, используя прерывания - одно от периферийного блока СнК (контроллер МКИО) и одно внешнее. После чего в какой-то момент надо передать управление другой программе. Имитирую передачу управления. Для этого я выполняю останов (команда "h") процессора через J-Link Commander. А вот дальше есть два варианта развития событий: 1) не_выполняя_сброса, заливаю в ОЗУ инструкций образ тестовой прошивки, пишу во VTOR новый адрес таблицы, указываю новую вершину стека (первое слово прошивки), пишу в PC адрес вектора сброса (второе слово прошивки) и запускаю (команда "g"). После чего снова останавливаю ядро и вижу, что упал в исключение NMI. 2) выполняю сброс (команда "R"), и выполняю те же действия, что и ранее, над той же тестовой прошивкой. После чего останавливаю ядро и вижу, что что ядро спокойно остановлено (NoException). В чем может быть принципиальное отличие этих режимов? Какие регистры SCB нужно сбросить в начале п.1, чтобы состояние стало близким к идеальному, т.е. после Reset? Чем сброс через JTAG отличается от сброса через NVIC_SystemReset() с точки зрения системных процедур, выполняемых перед main?
  10. Всем спасибо! Пойдем чуть дальше - действительно есть возможность доработать аналоговую часть, перенеся сигнал с полосой в 20 МГц на несущую в 15 МГц, например. Дальше - 14-битный АЦП с тактовой 50-60 МГц. При таком раскладе можно быть уверенным, что TigerSharck с тактовой 450 сдюжит?
  11. Есть ламерский вопрос: Может ли сигнальный процессор TigerSharck справиться с такой задачей: У нас с 14-битного АЦП с частотой 200 МГц поступают оцифрованные отсчеты сигнала (несущая 70 МГц, полоса - 20 МГц). Задача - сбросить спектр сигнала в квадратуру, т.е. разделить его на две ветки, умножить на sin(2*pi*70e+6*t) и cos(2*pi*70e+6*t) соответственно, пропустить результаты умножения через цифровые ФНЧ полосой 10 МГц, получить I/Q компоненты, снизить частоту дискретизации. Дальше с полученными I/Q компонентами делается стандартная обработка. Сейчас мы эту обработку делаем на Virtex5, есть вопрос, может ли с этим справиться TigerSharck с тактовой 450 МГц (конкретно 1967ВЦ2Ф http://milandr.ru/index.php?mact=Products,...t01returnid=68) Понимаю, что вопрос ламерский и заранее благодарю всех желающих посоветовать пользоваться поиском форума, гуглом, чтением книг))) С подобными процессорами дела никогда не имели, а принципиальный ответ заказчику надо дать быстро. Спасибо
  12. Есть ламерский вопрос: Может ли сигнальный процессор TigerSharck справиться с такой задачей: У нас с 14-битного АЦП с частотой 200 МГц поступают оцифрованные отсчеты сигнала (несущая 70 МГц, полоса - 20 МГц). Задача - сбросить спектр сигнала в квадратуру, т.е. разделить его на две ветки, умножить на sin(2*pi*70e+6*t) и cos(2*pi*70e+6*t) соответственно, пропустить результаты умножения через цифровые ФНЧ полосой 10 МГц, получить I/Q компоненты, снизить частоту дискретизации. Дальше с полученными I/Q компонентами делается стандартная обработка. Сейчас мы эту обработку делаем на Virtex5, есть вопрос, может ли с этим справиться TigerSharck с тактовой 450 МГц (конкретно 1967ВЦ2Ф http://milandr.ru/index.php?mact=Products,...t01returnid=68) Понимаю, что вопрос ламерский и заранее благодарю всех желающих посоветовать пользоваться поиском форума, гуглом, чтением книг))) С подобными процессорами дела никогда не имели, а принципиальный ответ заказчику надо дать быстро. Спасибо Update: перенес тему в раздел "Вопросы новичка"
  13. Формирование int из массива char

    Цитата(scifi @ Feb 12 2016, 18:27) Нет. Этот код указателю tst присваевается адрес элемента другого массива &test_buff[2]. Само собой, указателю tst присваивается адрес массива test_buff[2]. При этом значение int-переменной я получаю, обратившись к *tst. В каком именно месте происходит зависание, сказать не могу, процессор - 1986ВЕ1Т, там с дебагом туго. Вот полный исходник тестового кода, на котором все виснет: unsigned char test_buff[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; unsigned char *tst_point = &test_buff[0]; unsigned int *tst; unsigned int temp; tst = (unsigned int *)(tst_point + 2*sizeof(unsigned char)); //должны получить 0x06050403 = 100992003 temp = *tst; printf("%d", temp);
  14. Формирование int из массива char

    Цитата(Lmx2315 @ Feb 12 2016, 18:10) tst = (test_buff[0]<<24) + (test_buff[1]<<16) + (test_buff[2]<<8) + (test_buff[3]<<0); ???? 1) Мне нужна int-переменная, состоящая из test_buff[2]...test_buff[5]. 2) test_buff[0]<<24 даст все нули, т.к. имеет 8 бит. 3) При чем тут арифметическое сложение, вообще непонятно.
  15. Формирование int из массива char

    Задача такая - есть массив test_buff, из подряд идущих 4-х элементов которого нужно сформировать переменную unsigned int. unsigned char test_buff[20] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; unsigned char *tst_point = &test_buff[0]; unsigned int *tst; tst = (unsigned int *)(tst_point + 2*sizeof(unsigned char)); //должны получить 0x06050403 = 100992003 Т.е. в *tst пытаюсь записать unsigned int, состоящий из байтов массива с 3-го по 6-й. При исполнении этого кода на ARM-процессоре (ядро Cortex-M1) происходит зависание ядра (когда обращаюсь к адресу, некратному 4 байтам). При исполнении этого же кода на ПК - все ок, *tst = 100992003, как и должно быть. Компилятор Keil. Есть идеи, как решить задачу?