whale 1 18 марта, 2021 Опубликовано 18 марта, 2021 · Жалоба Господа. есть входной поток данным с макс размером скажем 1000, его нужно ужать в один байт те 255, причем основная инфа в потоке содержится в первой половине размера, те <=500, при >500 инфа тоже интересна но менее важна, в итоге самое простое это взять логарифм но он слишком долго считает даже по таблице, тк обработка идет на stm32 m0. Может есть какие то еще быстрые функции для такого преобразования ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 18 марта, 2021 Опубликовано 18 марта, 2021 · Жалоба Так сделайте таблицу для прямого преобразования, если всего 10 бит на входе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 1 18 марта, 2021 Опубликовано 18 марта, 2021 (изменено) · Жалоба В смысле 1000х2 = 3кБ ? Долго искать будет. Изменено 18 марта, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 18 марта, 2021 Опубликовано 18 марта, 2021 · Жалоба 9 minutes ago, whale said: В смысле 1000х2 = 3кБ ? тут столько памяти нет. А сколько там памяти есть ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 1 18 марта, 2021 Опубликовано 18 марта, 2021 · Жалоба Допустим 3 000 байт найти можно попробовать но как отыскать быстро нужное значение ? Разве номер в памяти как входное значение задать ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 18 марта, 2021 Опубликовано 18 марта, 2021 · Жалоба 18 minutes ago, whale said: Разве номер в памяти как входное значение задать ? Почему нет ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 1 18 марта, 2021 Опубликовано 18 марта, 2021 (изменено) · Жалоба В принципе можно в пзу все сложить, надо только глянуть на скорость чтения и как туда таблицу из экселя запихать, действительно это наверно будет самый быстрый вариант. Изменено 18 марта, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 18 марта, 2021 Опубликовано 18 марта, 2021 · Жалоба 1 hour ago, whale said: В принципе можно в пзу все сложить, надо только глянуть на скорость чтения и как туда таблицу из экселя запихать, действительно это наверно будет самый быстрый вариант. Вот, из книжки Hackers' Delight. Никогда сам не пользовался, но заколлекционировал. ilog.c.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 1 18 марта, 2021 Опубликовано 18 марта, 2021 (изменено) · Жалоба Just now, Aleksandr Baranov said: Вот, из книжки Hackers' Delight. Никогда сам не пользовался, но заколлекционировал. ilog.c.txt 4.98 kB · 0 downloads Спасибо, но тут дело уже на такты идет, пока попробую так #define start_add_arr 0x0801F800 // последняя страница #pragma location = start_add_arr __no_init uint8_t my_arr[]={1,2,3,40,5}; uint32_t FLASH_Read(uint32_t address) { return (*(__IO uint32_t*)(address+start_add_arr)); } те входное значение будет указывать адрес в памяти, куда заранее зальем значение преобразования, должно работать очень быстро если не ошибся в коде пока не пробовал ) Изменено 18 марта, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 18 марта, 2021 Опубликовано 18 марта, 2021 · Жалоба 34 minutes ago, whale said: должно работать очень быстро если не ошибся в коде пока не пробовал ) Вот зачем для чтения памяти понадобилась какая-то функция (с ошибкой в коде), которую компилятор еще должен догадаться заинлайнить? out = my_arr[in] my_arr может быть массивом с принудительным размещением, а может быть просто указателем на uint8_t. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 19 марта, 2021 Опубликовано 19 марта, 2021 · Жалоба 4 часа назад, whale сказал: Допустим 3 000 байт найти можно попробовать но как отыскать быстро нужное значение ? Так, а разве индексом таблицы не может быть ваше входное значение? const auto outValue = lookupTable[ myInputValue ]; 2 часа назад, whale сказал: uint32_t FLASH_Read(uint32_t address) Память читайте как обычную. Ничем флешка с точки зрения чтения не отличается от тоже ОЗУ. Никакие функции тут не нужны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 1 19 марта, 2021 Опубликовано 19 марта, 2021 (изменено) · Жалоба Те это будет достаточно ? uint8_t my_arr[]={1,2,3,40,5}; out = my_arr[in]; Изменено 19 марта, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 1 19 марта, 2021 Опубликовано 19 марта, 2021 · Жалоба Короче сам себя заблудил в трех соснах, наследие авр ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 19 марта, 2021 Опубликовано 19 марта, 2021 (изменено) · Жалоба 8 часов назад, whale сказал: Короче сам себя заблудил в трех соснах, наследие авр ) uint8_t compress(uint16_t in) { static const uint8_t out[1001] = {0,0,0,1,1, ...}; if(in<=1000) {return out[in];} else { return 0;} } В локальном статическом константном массиве надо руками прописать каждый из 1001 его элементов. Их значения будут находиться в диапазоне от 0 до 255. Входное значение in используется в качестве индекса массива. Массив здесь - ни что иное, как табличное представление вашей функции сжатия для целочисленных аргументов из диапазона от 0 до 1000 включительно (итого их 1001 - отсюда и количество элементов массива). Индекс массива in играет роль аргумента функции (в диапазоне от 0 до 1000), а элемент массива out[in] - значение функции от этого аргумента (в диапазоне от 0 до 255). При ошибочном входном значении (большем 1000) будет возвращаться 0 - не лучшее решение. Но за пару минут ничего нормального не придумалось. Изменено 19 марта, 2021 пользователем Darth Vader Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 1 19 марта, 2021 Опубликовано 19 марта, 2021 (изменено) · Жалоба Just now, Darth Vader said: Все давно заработало :) Просто в авр нельзя было читать память команд просто так в а stm все объединили Изменено 19 марта, 2021 пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться