Разработка электронных устройств

Серийное и единичное производство аналоговой и цифровой электроники, приборов для промышленности, медицины, автоматизации. Разработка программного обеспечения для микроконтроллеров и сигнальных процессоров. Полное сопровождение проекта и написание технической литературы

Прототипы и серийное производство

Разработка и изготовление корпусов и передних панелей. Разработка и изготовление печатных платы любой сложности. Монтаж печатных плат.

Написание программного обеспечения

Весь путь от создания, поддержания и качества программного обеспечения под любую операционную систему. Основные направления сетевое и системное программирование, взаимодействие клинт - серверных систем.

Разработка механизмов различной степени сложности

Проектирование и прототипирование подвижных и неподвижных механизмов и узлов устройств и агрегатов. Полное сопровождение проекта и написание технической литературы

Создание, продвижение и обслуживание сайтов

Написание php/perl/c кода или использование cms. Собственный сервер для размещения Ваших проектов под любые нагрузки. Поддержание сайта в актуальности и продвижение в поисковых системах.

 
 

Альтернативная реализация SQRT() для STM32 Cortex-M3

Автор: от 11 Февраль 2015 года, просмотров 2428

Google

Статья будет очень короткой, но надесь весьма полезной.

Долго рассказывать смысла нет. Данное решение вытекло из постановки задачи сделать максимально быстрое вычисление целочисленного квадратного корня 32-х битного значения. То есть на вход подаём значение от 0 до 4294967295 (0xFFFFFFFF), а на выходе получаем целое число квадрат которого и будет равен числу на входе.

Сразу же оговорюсь команды ассемблера которые используются в коде 100% есть в ядре Cortex-M3, другие ядра не проверял, но думаю и в M4 заработает без проблем.

Думаю довольно лирики - по ближе к делу.

Функция usr_sqrt(x) − Вычисление квадратного корня.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*! Функция usr_sqrt(x) − Вычисление квадратного корня.
* \param uint32_t value − число квадратный корень которого нужно вычислять
* \return uint32_t значение квадратного корня
 */
 uint32_t usr_sqrt(uint32_t value)
{
	uint32_t d, a;
 
	__asm {   // поиск номера старшего бита
		CLZ 	a, value
		RSB	a, a, #0x1F 
	};
	// Нахождение квадратного корня методом Ньютона
	d = 1 << ((a >> 1)+1);    // первое приближение 
	a = (d + ( value >> a )) >> 1;
	d = (a + value / a)>>1;
	a = (d + value / d)>>1;
	d = (a + value / a)>>1;
	a = (d + value / d)>>1;
	return a;
}

 Код достаточно хорошо прокомментирован и лишний разъ думаю объяснять его не стоит. Но если кратко, то на ассемблере находится номер старшего единичного бита числа, это означает, что:

1
2
// 41646465 = 00000010 01111011 01111001 10000001
// номер старшего единичного бита будет 25, необходимо учесть, счёт начинается с 0

 Далее в качестве первого приближения используется исходное значение, но сдвинутое на половину номера максимального бита. Ну а далее как в класике. Для тех кто не особо знаком с данным алгоримом прошу обратиться за помощью в Википедию:  РАЗ и ДВА.

Буду рад любым комментариям по поводу ускорения данныго кода.

Ну и на последок архив с файлами.

 [ Файл: usr_math.zip ]

Метки: stm32, cortex-m3, sqrt()

Категория: