Обсуждаем контроллеры компании Atmel.
Ответить

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс мар 26, 2023 21:13:43

AQ29, если у тебя возникают проблемы и сложности с прерываниями, то дело именно в том, что ты "не умеешь их готовить."
ранее ты заявил, что в ассемблере логарифм вызывается одной строкой, а теперь оказалось, что там 17 строк.
то есть, там вообще оказывается не логарифм, а аппроксимация, то бишь хрен знает какое приближение к правильному значению.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс мар 26, 2023 21:26:44

Just_Fluffy
большая программа в прерывании – источник проблем:
- можно затереть какую-нибудь переменную,
- может возникнуть проблема из-за использования какого-нибудь аппаратного устройства (таймер, SPI и т.д.), которое используется в основном цикле,
- может возникнуть проблема из-за времени, поскольку программа слишком долго находится в прерывании,
- при работе в прерывании МК не реагирует на другие прерывания, если запретить, можно пропустить важное прерывание,
- сложности с дальнейшим развитием программы и т.д.
При обработке прерываний в основном цикле всё гораздо проще ... Достаточно времени, свободны ресурсы МК, хороший контроль работы и т.д. ... Вероятность совершения ошибки гораздо меньше ... Это вообще-то довольно большая тема.
Увы, но это довольно-таки большая глупость, а не тема. На все перечисленные проблемы размер не влияет (не является основной причиной), а некоторых проблем (сложности с развитием и слишком долго находится в прерывании) вообще не существует, равно как и перечисленных преимуществ обработки прерывания в основном цикле.
Не знаю, как у AVR, а у STM8 есть режим Interrupt-only activation level. An IRET instruction causes the CPU to go back to WFI/Halt mode without restoring the context. Никакого main{}
Последний раз редактировалось Martian Вс мар 26, 2023 21:30:14, всего редактировалось 1 раз.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс мар 26, 2023 21:33:53

AQ29 писал(а):Как уже писал, большая программа в прерывании – источник проблем:
- можно затереть какую-нибудь переменную,
- может возникнуть проблема из-за использования какого-нибудь аппаратного устройства (таймер, SPI и т.д.), которое используется в основном цикле,
- может возникнуть проблема из-за времени, поскольку программа слишком долго находится в прерывании,
- при работе в прерывании МК не реагирует на другие прерывания, если запретить, можно пропустить важное прерывание,
- сложности с дальнейшим развитием программы и т.д.
Извините, но это чушь.
Я вас не буду учить, как программировать и пользоваться прерываниями.
Но поверьте, я не первый год замужем программирую АВРки (и не только) и умею работать с прерываниями, какие бы они большие не были. И на ассемблере тоже.

AQ29 писал(а):К счастью, логарифм вызывается другой командой:
A = Log_10_2 V n
Что и требовалось доказать. Я уж думала, вы нарыли недокументированные инструкции самого AVR... Логарифм за один такт вычислять....
А по факту чуда не произошло. Э не команда ассемблера AVR, а подпрограмма расчета логарифма. И ваше Log_10_2 - не что иное, как RCALL.

Кстати, по поводу целочисленных алгоритмов.
f = k * log(m) / n
k = -10...10 с точностью 0.01
n = 0.01...1
m = 10Е-5..10Е7
Сможете сделать целочисленные вычисления? Точность вычислений устроит 0.01


Добавлено after 4 minutes 19 seconds:
Martian писал(а):Не знаю, как у AVR, а у STM8 есть режим Interrupt-only activation level. An IRET instruction causes the CPU to go back to WFI/Halt mode without restoring the context. Никакого main{}
Ну в АВР такого нету, но можно написать
Код:
main(){
  init();
  while(1) sleep();
}


Но расслабьтесь. Там не современный ассемблер, а Алгоритм-билдер. Очень нишевая штука, достаточно удобная (наверное). Но как по мне - тупиковая ветвь. Полученные знания не дадут ни асм нормально выучить, ни си.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс мар 26, 2023 21:36:59

Алгоритм-билдер. Очень нишевая штука, достаточно удобная (наверное).
Кому-то пытался помочь с программкой этого билдера, что-то мне не очень он понравился. Действительно, как боковая и тупиковая ветвь.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс мар 26, 2023 21:50:08

Martian, Я начала АВРки мучить с AtmelStudio 4. На асме. Много чего было сделано.
потом посоветовали АВ. Поставила. Вроде и прикольно... Но... Это какая то попытка в визуальное программирование. Требующая по прежнему знать архитектуру МК на уровне регистров и ассемблерных команд, но при этом еще нужно изучить принципы работы самой среды.
При этом репозитории готового кода ограничиваются вот такими русскоязычными ветками в форумах...
Ибо в сети в основном код - это ассемблер либо Си.

А, еще есть микропаскаль и васик для AVRок.... Тоже нишевая ветвь. Извилистая. И ведущая в конце концов, к необходимости выучить си или асм.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн мар 27, 2023 22:19:39

Это вообще-то довольно большая тема.
Сопли про эту вообще-то довольно большую тему я, пожалуй, пропущу. Не мой уровень. Да и передо мной уже сказали про это кратко, ёмко и по делу.
Вообще-то логарифм на целочисленной арифметике давно выкладывался в интернете. Не знаю, как делаются ссылки, напишу текстом.
И этот человек запрещает мне ковыряться в носу и прерываниях! Молодой человек, вы немножко не туда залезли. Здесь серьёзные люди обсуждают серьёзные (иногда) вещи, а если вы не можете написать вот такую светло-синюю фразу, то постойте пока в сторонке и подышите свежим воздухом.
Предупреждение насчёт RCALL и ICALL очень ценное, учту.
К счастью, логарифм вызывается другой командой:
К несчастью, логарифм в ассемблере такой командой не вызывается. А может и к счастью, если мы говорим именно об ассемблере. И предупреждение про RCALL и ICALL вы так и не учли. Возможно, что просто не поняли, об чём речь...
265 скачиваний.
Я был 266-м, но только для того, чтобы проверить, что за бред вы здесь несёте про вызов логарифма одной командой ассемблера.
Там логарифм написан на АБ.
Дык с этого и надо было начинать. АБ — это ни разу не ассемблер. Ни современный, никакой другой. Это совсем иной язык, совсем иная среда. Переносимость с АБ на другие языки практически никакая. Даже из среды Ардуино перенести на нормальный С (или наоборот) возможно без больших проблем, а вот что делать с АБ, я плохо понимаю. Полагаю, с вашими навыками в программировании вы это понимаете ещё хуже, поэтому и ляпнули глупость про логарифм...

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт мар 30, 2023 12:48:26

Некоторые, как назвал Eats, «серьёзные люди» не поняли ситуацию, поясню ещё разок.
Приведена не ассемблерная команда, а строка вызова логарифма в среде, которую я условно назвал, современным ассемблером. В ней помимо ассемблерных команд есть элементы ЯВУ, что сильно упрощает программирование. В частности, есть функция вызова логарифма, которую привёл.
В этой среде сама программа логарифма занимает 17 строк. А после компиляции получается программа объёмом 526 байт.
Starichok51, точность не «хрен знает какая», а гарантированная - полпроцента.

Just_Fluffy, про размер программы 526 байт писал ранее, а такая программа не может выполняться за 1 такт. Так что ваши надежды на чудо были обречены изначально.
Насчёт команд RCALL и ICALL – это шутка. Вызов логарифма и простая ассемблерная команда – сильно разные вещи, это очевидно.
При компиляции, конечно, как вы писали, на этом месте появится RCALL и ещё перед ней команды переброса аргумента во внутреннюю локальную переменную.
Насчёт примера – неясно, k и n – это переменные или одно или несколько фиксированных значений. Нехилый у вас диапазон аргумента, глобальные вещи делаете.
В первом приближении сделать можно, посмотрю попозже.

Программа АБ давно устарела, развитие не имеет смысла. Правда, она намного удобней обычного ассемблера, бесплатна, её легко освоить. Читал в интернете, что некоторые пишут на СИ, а для небольших МК используют АБ.
Программу логарифма из АБ, скорее всего, нетрудно переписать на другой язык.
В разработке целочисленного логарифма самое сложное – математический расчёт точек разбиения и коэффициентов, а далее написать программу уже несложно, там умножить и сложить.
А в сноске уже приведены эти рассчитанные параметры.

У меня нет проблем с прерываниями. При отладке максимальное время на отыскание ошибки где-то в пределах пары часов.
Нередко читал в интернете, как пишущие на СИ на отыскание ошибки тратят несколько дней. Возможно, это не из-за ошибки в прерываниях, а из-за проблем языка СИ.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт мар 30, 2023 15:07:39

строка вызова логарифма в среде, которую я условно назвал, современным ассемблером.
...
Программа АБ давно устарела, развитие не имеет смысла.
То есть не команда, а программа. И не в современном, а в давно устаревшем. И не ассемблере, а билдере. И не логарифма, а кусочной аппроксимации. Далее со всеми остановками.

P.S. анекдотик (для психологической разрядки):
— Скажите, а правда, что Кац выиграл в лотерею миллион?
— Правда. Но не Кац, а Рабинович. И не в лотерею, а в карты. И не миллион, а сто рублей. И не выиграл, а проиграл.

Добавлено after 43 minutes 21 second:
А теперь серьёзно.
сама программа логарифма занимает 17 строк. А после компиляции получается программа объёмом 526 байт.
Starichok51, точность не «хрен знает какая», а гарантированная - полпроцента.
Just_Fluffy, про размер программы 526 байт писал ранее, а такая программа не может выполняться за 1 такт. Так что ваши надежды на чудо были обречены изначально.
Итак, наши надежды на чудо:
Код:
.nolist
Log10:   .db  255,  1,  2... ; и так далее до 240, всю таблицу приводить не буду!
.list
; к этому моменту в r30 надо положить аргумент логарифма
   clr   r31
   adiw   r30, Log10*2   ; TmpB = pgm_read_byte_near(Log10 + X_);
   lpm   r16, Z      ;

Итого вместо 17 строк весь вызов уложился в три строки, в коде имеем пару слов на подготовку аргумента для вызова и одно слово на собственно вызов. Вся программа вписалась в 6 тактов. При этом погрешность вычисления 8-разрядного результата ограничивается его разрядностью и в самом худшем случае не превышает 1/256=0.39%. Общий объём (вместе с 256-байтной таблицей) флеша составляет 262 байта. Или для наглядности то же самое в табличке:
Код:
Параметр:      AB    Asm
Объём, байт   526   262
Время, такт   ХХL   6
Погрешность,% 0.5   0.4

Единственное ограничение на этот кусок кода, чтобы таблица располагалась в пределах первых 64 байт флеша. Это для того, чтобы не заморачиваться содержимым r31, а просто обнулить его и воспользоваться 16-разрядной командой сложения. В противном случае на подготовку вызова придётся затратить парой тактов больше. На Си оно так и будет.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт мар 30, 2023 22:07:06

AQ29 писал(а):Возможно, это не из-за ошибки в прерываниях, а из-за проблем языка СИ.
это из-за проблем в голове программирующего, а не из-за проблем языка Си.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт мар 30, 2023 22:26:07

AQ29, Может, прежде чем судить о языке Си - нужно его выучить? А не топить за АБ....
--
Но я повторюсь, каждая задача требует свои решения. Если флоаты нужны и с ними легче и проще - то я возьму флоат. Благо компилятор языка Си достаточно умный и где можно - он проведет хорошую оптимизацию кода. А если вдруг мне не будет хватать флеша в камне - то тогда я подумаю, извратиться с оптимизацией, придумать как отказаться от флоата ... или просто возьму камень потолще...
И мне не нужно будет тратить 2 часа на поиск ошибок, возникающих по вине прерывания. Ибо изоляцию обработчика прерывания от основной программы компилятор возьмет на себя.

Я сейчас участвую в разработке одной интересной штуки на МК. Компилятор программы на бейсике в байт-код и виртуальный процессор, выполняющий этот байт-код. Со своим выделенным ОЗУ, динамическим выделением ОЗУ под строки и массивы и с уборщиком мусора. С поддержкой сд-карточки.
И там флоаты есть, о ужос!!!! И логарифмы, и синусы, и косинусы.... И даже квадратные корни!!! Вы представляете!!!!!!
И флоат там от -3.4e38 до +3.4e38... Это ж застрелиться, 38 нулей, прикиньте!!!!
Интересно, сколько б мы на АБ с этим возились?..... (Но к счастью АБ не умеет в другие процы, окромя АВР)


ПС. По задаче с коэффициентами - коэффициенты не константа, все значения приходят извне.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс апр 02, 2023 14:46:35

Eats
Указанная среда – это не программа АБ. В АБ встроенных функций нет.
В среде при компиляции при обнаружении вызова функции в конце программы добавиться строки расчёта логарифма.
Вот этих строк будет 17, которые в дальнейшем преобразуются в ассемблерные команды объёмом 526 байт. Так что 17 строк – это не вызов, а вся программа.
Название: логарифм или кусочная аппроксимация логарифма – это несерьёзно. Ясно, что это не идеальный логарифм.

В вашу программу пока не вникал. У вас написано – 8-разрядный результат.
В моей программе результат – 2 байта.
Для корректного сравнения надо указать диапазон изменения аргумента, при котором обеспечивается заданная точность результата, например, 0,5 %.
В моей программе эта точность обеспечивается при изменении аргумента в диапазоне от 1024 до конца двухбайтной переменной (&НFFFF).
Меньше 1024 в пределах первого интервала тоже обеспечивается точность, а затем погрешность возрастает. Если аргумент существенно меньше 1024, то логарифм не считается, а действия по ситуации. Например, для измерителя концентрации выводится надпись: «Неисправен опорный канал».
В вашей программе в каком диапазоне аргумента обеспечивается заданная точность?

Just_Fluffy
Насчёт СИ пишу, конечно, не как эксперт, а какое сложилось мнение по прочтению постов.
Насчёт прерываний. Пишите, в СИ компилятор изолирует обработчик прерываний. Я пишу, фактически, на ассемблере, там надо самому следить.
Но в ассемблере свои большие преимущества.

10Е38 – такие числа уже к размерам Вселенной приближаются.
Однако, как говорилось в известном фильме, «А не замахнуться ли нам на Вильяма нашего Шекспира».
У вас был диапазон от 10Е-5 до 10Е7. Надо превратить в целое число, умножим на коэффициент К1, равный, скажем, 10Е5, получим максимальное число 10Е12. Это 5 байт.
У вас точность 1 %. Нетрудно посчитать, что для такой точности будет достаточно двух старших байт. Это сильно упрощает задачу.
Пусть старший пятый байт отличен от нуля.
Тогда надо посчитать логарифм числа: N = а5*256^5 + а4*256^4. Здесь а5 и а4 – старшие байты, ^ - показатель степени.
Тогда из школьной математики получаем:
Log(а5*256^5 + а4*256^4) = 4*Log(256) + Log(а5*256 + а4)
Умножим на коэффициент, равный, например, К2 =32768, для краткости записи введём обозначения с5 = К2*4*Log(256) и х = Log(а5*256 + а4), получаем
N = с5 + К2*Log(x)
Последнее слагаемое – это уже имеющийся встроенный логарифм.
Аналогичный расчёт для другого диапазона, если старший значащий байт – это а4 и т.д.

Программу можно написать в виде вызываемой процедуры с таким текстом (пишу в своей среде, скорее всего, перевести на другой язык – не проблема):
If a5 <> 0 Then
Logarifm = Log_10_2(Х5)
Logarifm += c5
Return
End If
If a4 <> 0 Then
Logarifm = Log_10_2(Х4)
Logarifm += c4
Return
End If
……..

с5, с4 и т.д. это численные коэффициенты К2*4*Log(256), К2*3*Log(256) и т.д.
Х5, Х4 и т.д. – это двухбайтные аргументы старших байтов, фактически надо просто прописать такие переменные в таблице определения аргументов.
В среде несколько другие обозначения, это не важно.
Наверно, удобнее сделать несколько в другом виде, это пока упрощённое схематическое решение.
Программа получается довольно простой. Да и код по объёму, скорее всего, сильно не увеличится.
Коэффициенты К1 и К2 надо выбрать по конкретной ситуации, чтобы сразу получить требуемый результат.
Умножение и деление на внешние коэффициенты – обычными методами. В моей среде для этого есть встроенные функции типа MultiPlay_2_2_4 – умножение 2 на 2 байта и т.д.

Размер числа 10Е38 где-то около 16 байт.
Можно делать аналогично, но многовато получится строчек. Логичнее сделать в виде цикла. Несколько сложнее, но компактнее. Да и для случая 5 байтов я бы сделал в виде цикла.
Если представляет интерес в виде цикла, можно написать.
Вообще, по первому впечатлению, не очень сложная программа, «ужаса» не наблюдаю. Конечно, детально не вникал, может быть, есть какие-нибудь подводные камни.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн апр 03, 2023 00:16:46

AQ29, ну можно придумать все, что угодно.
Можно придумывать конвертацию констант и входных данных в целочисленные представления. Тратить время на это.
А когда нужно поменять входные данные - заново придумывать всё.
Можно придумывать алгоритмы умножения двух 16-битных чисел.
Можно .. много чего можно.
А можно просто взять и написать
Код:
float f  = k * log(m) / n
Времени это занимает 30 секунд. И не нужно париться, как преобразовать константы в целочисленное представление.
Аналогично ваш MultiPlay_2_2_4
Всего лишь
Код:
uint16 x, y
uint32_t z = (uint32_t)x * y


10Е38 – такие числа уже к размерам Вселенной приближаются.
Нет, это стандартный float. И если мы реализовали полноценный компилятор и виртуальную машину Basic - то нужно придерживаться стандартов. И предоставлять нормальные вычисления с плавающей запятой.

Размер числа 10Е38 где-то около 16 байт.
Нет. Это число занимает ровно 4 байта. Это называется float.

Такое ощущение, что вы себе придумывает трудности, что бы их геройски преодолевать. И пытаетесь подсадить на свой путь других.
Причем, обратите внимание - вы пропагандируете свой АБ/крутой ассемблер в теме про язык Си.
Да, ваши программы могут занимать меньше флеша в конечном устройстве. Ценой увеличения времени разработки в разы.
Повторю свой старый вопрос - куда мне девать свободный флеш и лишнее процессорное время? Солить на зиму? Или отколупать и положить в соседний МК?

Кстати, грамотное использование Си дает небольшой оверхед против грамотно построенной ассемблерной программы. Я встречала в сети цифры 10-15-20%.
Но при этом время разработки отличается в разы.
Посмотрите здесь, на коте, проекты на атмеге 128. Навскидку помню в статьях дозиметр и двое часов с цветными дисплеями.
Рискнёте писать 128 кб кода на вашем современном ассемблере?
И сопровождать потом этот код?

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн апр 03, 2023 01:11:59

Вот этих строк будет 17, которые в дальнейшем преобразуются в ассемблерные команды объёмом 526 байт.
Я не знаю, о каких вы 526 байтах говорите. То, на что вы дали ссылку и что я скачал, будучи 266-м, имеет объём 1038 байт, то есть 519 слов, не считая таблицы векторов.
В вашу программу пока не вникал. У вас написано – 8-разрядный результат.
В моей программе результат – 2 байта.
При погрешности в полпроцента? Не смешите мои тапочки! Младший байт вашего результата содержит информационный мусор.
Для корректного сравнения надо указать диапазон изменения аргумента, при котором обеспечивается заданная точность результата, например, 0,5 %.
В моей программе эта точность обеспечивается при изменении аргумента в диапазоне от 1024 до конца двухбайтной переменной (&НFFFF).
УхОдите от темы (про Си). Какая разница, в каком диапазоне вы считаете? Логарифм достаточно считать в базовом диапазоне от единицы до основания, не включая само основание. Весь остальной диапазон следует приводить к базовому. Я считаю в базовом. Но, конечно, умножаю на масштабный коэффициент 256. Результат (от 0 до 1) умножен на 8192, так что его надо будет куда-то сдвинуть, кому куда нравится.
В вашей программе в каком диапазоне аргумента обеспечивается заданная точность?
Во всём, то есть от 1 до 9.965. Логарифм 10 считать не надо, потому что уже есть логарифм единицы. Вот график погрешности:
Log10.png
(64.78 KiB) Скачиваний: 23

Фишка заключается в заранее составленной таблице и разбиении всего диапазона аргумента на 4 поддиапазона. Я не стал показывать в своём примере это разбиение (оно займёт ещё несколько байтов и несколько тактов), но фактически у меня на выходе может оказаться не 8-, а 13-разрядное число, но значащих бит в нём только 8, поэтому я и не называю его 16-разрядным. Младшие биты при необходимости добиваю нулями. Старшие биты 16-разрядного слова и так нули. Я просто оптимизировал табличку для компактности с ограничением на погрешность в 0.4%. Да, пришлось изобрести велосипед (нечто среднее между целочисленным и плавающим форматами), но это демонстрация принципа разумной достаточности: для получения погрешности в полпроцента (и даже в 0.4%) не надо вычислять! Взять результат из таблицы и немного причесать его будет дешевле.

P.S.: я так понимаю, от идеи наличия в "современном ассемблере" команды логарифма мы уже отошли?

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн апр 03, 2023 02:23:41

Eats, Да забейте. Это разговор ради разговора. Каждый кулик свое болото хвалит.
И тема скатывается в оффтоп.

От себя скажу, что есть 2 варианта разработки единичных* устройств на МК:
1. Прикидываем по требованиям, сколько нужно флеша, ОЗУ и какой периферии - и выбираем камень из доступных. В любом случае цена камня вложится в цену изделия.
2. Смотрим, какие камни есть в тумбочке - и пытаемся натянуть сову на глобус, создавая какие то свои поделия.

И если что то для себя делается, то можно хоть на бумажке в клеточку разработку вести, пользуясь распечатанным на матричном принтере справочником машинных команд... И потом рассказывать - я потратил месяц на разработку сверхоптимального blink. Я крут! ( А ардуинщики набыдлокодят за это время десяток изделий и будут счастливы).
Но хвалить свой единственно верный метод разработки - увольте.
Особенно, когда есть другие методы, гораздо более эффективные как по времени, так и по удобству разработки.

*когда разрабатывается серия с многотысячными тиражами - там уже работа программиста может быть оплачена отдельно, для оптимизации кода, утрамбовки его в более дешевый МК и т.д. Поскольку там условные 5 центов на цене одного МК выливаются в сотни нефти на тиражах. И цена программиста тонет в этой нефти.

ПС. Товарищ ARV кстати, конкурс объявлял, на минимальный блинк на мелкой тине. Сошлись на десятке байт.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн апр 03, 2023 04:51:00

У меня вчера было, что написал пару строчек, глянул, как они там (вынужден следить - период прерываний небольшой, нельзя вылететь): а там можно десяток тактов сэкономить, если переписать через асм. И руки зачесались вначале, а потом сказал себе - нахрен ) Укладываюсь в требование - и хорошо. Нет никакого смысла в перфекционизме, просто потрачу время.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн апр 03, 2023 11:50:35

Just_Fluffy писал(а):Кстати, грамотное использование Си дает небольшой оверхед против грамотно построенной ассемблерной программы. Я встречала в сети цифры 10-15-20%.
код грамотно построенной ассемблерной программы ВСЕГДА будет короче грамотно построенной программы на Си и скомпилированной с максимальной оптимизацией.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн апр 03, 2023 17:03:48

Как то очень категорично. И, вроде как естественно, потому что Си уровнем повыше. Но и от сложности самой программы зависит. По крайней мере, зачастую, по объёму не хуже.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс апр 09, 2023 18:19:26

Я не знаю, о каких вы 526 байтах говорите. То, на что вы дали ссылку и что я скачал, будучи 266-м, имеет объём 1038 байт, то есть 519 слов, не считая таблицы векторов…
Не смешите мои тапочки! Младший байт вашего результата содержит информационный мусор…
P.S.: я так понимаю, от идеи наличия в "современном ассемблере" команды логарифма мы уже отошли?


Программа в АБ, действительно, занимает более одного килобайта, в новой среде получилось существенно меньше.
При переносе программы в новую среду, фактически, использовались только численные коэффициенты.
Одна из причин уменьшения размера – переменные не забрасывались в стек, другая – наверно, лучше написаны используемые подпрограммы.

Младший байт результата - не информационный мусор.
Аргумент Arg может меняться в диапазоне от около 1000 до &HFFFF, диапазон изменения более 60 раз.
Функция Log меняется в диапазоне двух байт.
Например, при Arg = 1025 получается Log = 13, при Arg = &HFFFF получается Log = 58963.
При использовании логарифма важна точность вблизи нулевого значения функции, т.е. вблизи точки х = 1 (здесь х – не умноженная на 1024 единица).
В этой программе при х = 1,002 получается точность 2,8 %.
При х = 1,0049 получается 0,46 %, это уже выход на заданную точность.
Какая точность получается в указанных точках в вашей программе?
Кроме того, программа выдаёт отрицательные значения при х < 1.
Как я понял, у вас диапазон изменения аргумента в 10 раз.
Для объективного сопоставления надо расширить диапазон хотя бы до 60 раз и сделать минус при х < 1, это увеличит размер программы.
Надо ещё сопоставить точность вблизи нуля.

«Идея наличия в "современном ассемблере" команды логарифма» для меня уже не идея, я уже работаю с такой командой.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс апр 09, 2023 19:27:42

AQ29, вот даже интересно, что вы пытаетесь доказать...
Что целочисленный логарифм лучше?

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс апр 09, 2023 19:40:56

что он есть как отдельная команда в ассемблере. Вероятно, для АВР :)
я уже работаю с такой командой.
Ответить