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

ViKo

Модератор
  • Постов

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

Весь контент ViKo


  1. Полгода назад столкнулся с подобным "явлением" - моя тема исчезла без следов, потом в ходе разговора в разделе жалоб обнаружил ее в разделе для начинающих, о котором до этого и не подозревал. В результате в "шапке" про ARM появилась тема, где новичков просят обратить внимание на раздел для начинающих. Но обращают далеко не все. Я тоже говорил, что разделение на начинающих и профи не логично. И сейчас так считаю. Или хотя бы на заглавной странице показать ссылку на раздел для начинающих. Но понял, что переделывать никто ничего не будет. Остается смириться и пользоваться тем, что имеем. Еще, давно хотелось сказать, вот, пришло время. Темы из "серьезных" разделов переносятся в раздел для начинающих "со свистом". Но почему-то я не встречался с обратным процессом. Типа, "Куда Вы пишете? Это раздел для начинающих! Вам туда-то и туда!" :)
  2. Спасибо всем! На сегодня и завтра - умолкаю. "Работа над ошибками". Возрадуемся - что в Cortex есть команда деления, которая иногда используется.
  3. Sign - а как же без него, он же потом используется, в пока не известном месте. 32 бита - согласен. Согласен понести наказание (вернее, уже понес :)) push/pop - разве они там есть? Массивы вместо указателей - не уверен, не исключаю что в данном случае это одно и то же. Заполнение пробелами - их может быть разное количество, здесь 32-битовые слова не помогут. Над этим подумаю... Докладываю - создал тестовый проект, в котором только itoa, компилятор задействовал SDIV. Возрадуемся, братья! :) 2 aaarrr Про формат 4.28 - что это, где почитать?
  4. В данный момент меня занимает алгоритм от aaarrr, поискал по компу своему книжку по цифровые трюки, но не нашел. А ведь была. Нельзя ли его расширить, чтобы принимал все числа. Второй вариант - преобразовать bin в BCD, а затем уже превратить в строку. Табличный способ меня не привлекает из-за громоздкости. Точные цифры по быстродействию и размеру кода я не смотрел. Если будет что сказать, доложу. P.S. Определился, пожалуй, что для меня значит оптимальность. = Компактность кода. А быстродействие мне STM32 и так обеспечит. P.P.S. Причем, часто бывает, что компактный код и работает быстро.
  5. 2 ssvSerge В ваших алгоритмах число записывается задом наперед, надо iStorePos++; и нет индикации знака числа. А в остальном - можно и так. Для чего код модернизировал - сделать то, что имею, лучше, оптимальнее. В идеале - оптимальнее и по производительности, и по компактности.
  6. Следуя рекомендациям, слегка модернизировал код. void itoa(int16_t Number, uint8_t *String) { uint8_t Sign = ' '; if (Number > 0) Sign = '+'; if (Number < 0) { Sign = '-'; Number = - Number; } String[6] = '\0'; int8_t i = 5; div_t QR = {Number, 0}; do { QR = div(QR.quot, 10); String[i--] = QR.rem + '0'; } while (QR.quot); String[i] = Sign; for (i--; i >= 0; i--) String[i] = ' '; } Результат оказался несколько неожиданным :) Ни в первом, ни во втором случае RealView MDK-ARM 4.10 не использует команды деления вообще. А код оказался равным по размеру (и по содержанию, похоже). Так что можно сделать вывод, что / и % компилятор все-же объединил. А заняла функция деления примерно 80 команд (не машинных тактов, а именно строк в ассемблерном коде). 2 Непомнящий Евгений На таком принципе основан мой код для PIC, который чуть выше в файле лежит. Только написан на ассемблере. Для всех ядер - это вы уж слишком многого от меня хотите. :) У меня и компиляторов таких нет. А для Cortex-M3 я написал и откомпилировал, и из ваших высказываний так и не понял, что бы такого можно было улучшить в моем коде. А примера, как надо делать, вы не привели.
  7. Поддерживаю. Уже непонятно, в каком из случаев if или case "истина", а где "ложь", с точки зрения разработчиков Quartus. На что ориентироваться? Вот так пропустишь что-нибудь, и не узнаешь...
  8. А я для чего написал? STM32. Вот и вы меня "не обижайте". Хоть я и не Керниган.:) Написал, как помнилось. Не входит в сферу моих обязательных знаний, которые нужно периодически обновлять. Наверное, вы правы. Признаю!
  9. Это я уже понял. Есть ли в Keil для Cortex-M3 не смотрел, надеюсь, есть. Тогда можно будет совместить деление и взятие остатка. Попробую на досуге. upd. Попробовал. Есть такая функция. Однако после замены деления и взятия остатка на div() размер кода остался тем же. Подробнее буду разбираться позже. Для ARM интересен вариант от aaarrr - из области трюков и фокусов. Реально полезный пример! А для процессоров без умножений и делений - вычитание, а на ассемблере - с помощью команд двоично-десятичной коррекции (вот бы на C ее задействовать).
  10. Покопался в своих проектах, нашел преобразование для PIC16. 2 байта преобразовываются в 3 двоично-десятичных упакованных. От которых рукой подать до ASCII. Выдаю кусок из файла. Может кому-то покажется интересным. Исключительно с целью обучения навыкам культурного ведения диалогов при общении. А badik , с которого все началось, эмбеддер? Он об этом не говорил. Bin2BCD.zip
  11. Пролистал K&R второе издание от корки до корки, нашел практически такое же "гуано" на языке Элочки Людоедовой, как у меня, defunct, да и Goodefin недалеко от него ушел :) Раздел 3.6 стр. 77. Те же деление и взятие остатка от деления. С учетом функции reverse - 2 цикла. (замечу в скобках, что книжка эта у меня появилась не так давно, до этого пользовался Шилдтом, но решил "продвинуться", так что любые совпадения - случайны :)) Еще приводится пример рекурсивного вызова на стр. 100, тоже не скажу, что блещет производительностью. А табличный способ - самый быстрый. Но и самый жрущий память кода :) Это одна из крайностей. Найти бы еще самый компактный. P.S. Кстати, автор топика не указал, для чего ему нужна функция itoa. А может, он под Windows пишет, и на производительность и компактность ему одинаково наплевать. :)
  12. Должно быть uint16_t *x
  13. А разве в коде Genadi видно, как у него реализована функция ldiv?
  14. Замечу, что я вам на ваши ошибки указал без оскорбительных выражений. Учу на собственном примере. :) О! А как... ?
  15. Это у вас синтаксическая ошибка в посте №18 И на этом закончим? Единственное, что я вынес из разговора - надо с указателем повозиться. И к коду aaarrr присмотреться, пока что не понимаю, как работает.
  16. Осталось только выложить его сюда. нужно писать "в отличие" А "минус" и "плюс" потом занести? Неужто эффективнее? У меня выводится следующим образом: (upd. добавил еще и 0 для полноты) " 0" " -12" "+32767"
  17. int16 укладывается в эти 6 символов, со знаком, ни больше, ни меньше. В первом цикле вычисляются цифры, во втором забивал пробелами оставшееся место слева. Можно было сразу инициализировать массив пробелами, но было бы ли это эффективнее?
  18. Я писал для STM32. Виноват, не сказал сразу. Для PIC или AVR написал бы другое "гуано" :) Критериев, собственно, два - высокое быстродействие и минимальный объем кода. Понятно, что это две крайности, а лучшее лежит где-то посередине. У вас есть что-нибудь для ARM - Cortex? И, если можно, выскажитесь о первом примере от Genadi Zawidowsky. И о последующих.
  19. Оставил только значимую часть сообщения :) Лучший способ воспитания - на собственном примере. Покажите, как надо.
  20. Я хотел приписать, что это один из первых моих "опусов", но подумал, что в качестве примера для изучения сгодится. Если можете выдать "достойный" образец, прошу! P.S. У меня знак рисуется непосредственно перед числом, выравнивается по правому краю. А, ну да, можно было применить указатель, но тогда не пришло в голову. P.P.S. Господа, давайте найдем, наконец, лучшее решение. А то, сколько людей, столько и мнений. Да, я помню высказывание zltigo, что тема избита. Однако...
  21. В свое время я задавал такой же вопрос. Получил несколько ответов, в том числе и не очень "полезных и приятных". Сам написал такое: void si16toad (int16_t Number, char * StrBuf) { char Sign = ' '; if (Number > 0) Sign = '+'; if (Number < 0) { Sign = '-'; Number = -Number; } StrBuf[6] = '\0'; signed char i = 5; do { StrBuf[i--] = Number % 10 + '0'; Number /= 10; } while (Number); StrBuf[i] = Sign; for (i--; i >= 0; i--) StrBuf[i] = ' '; }
  22. Можете пояснить? upd. Сам проверил. Действительно, для кода always_ff @(posedge clk_i, posedge rst_i) begin data_o <= data1_i; end варнинг выдается (не ошибка), а для case нет.
  23. Проблема не в case, а в always_ff, чувствительном к двум фронтам одинаково. Вот так-то работает :) always_ff @(posedge clk_i) Цитата из IEEE Std 1800-2009 раздел 9.2.2.4
  24. Какая разница, на чем сделано? Важно, что делает. Я даже миксер могу назвать кухонным процессором, а выключатель света - контроллером (а наоборот - не могу). Именно! Data flow processing. И чем это вас не устраивает?
  25. Ни в коей мере не предлагаю вам изменить свое желание, но хотелось бы услышать причины.
×
×
  • Создать...