#c #алгоритм
Здравствуйте, уважаемые коллеги! Вопрос, может быть, достаточно тривиальный. Есть память EEPROM, размер страницы в ней - 16 байт (см. рисунок). Можно начать запись с любого байта, но за один сеанс записи нельзя вылезти в соседнюю страницу. В связи с этим требуется определить количество страниц памяти, которые подлежат записи. При этом известен номер ячейки, с которой начинается запись, и общее количество записываемых байт. Следует учесть и ту ситуацию, что одно и то же количество информации может занимать разное количество страниц в зависимости от начального адреса (см. рисунок). Итак, коллеги, можете ли вы предложить маленькую красивую формулу, по которой можно вычислить количество страниц? Мне бы не хотелось использовать циклические алгоритмы. Язык - Си. Не буду выкладывать свои наработки, скажу только, что моё решение не учитывает последней обозначенной проблемы, результат получается как в нижней части рисунка.
Ответы
Ответ 1
static inline n_pages (unsigned int addr, unsigned int len) { return len ? ((addr + len - 1) >> 4) - (addr >> 4) + 1 : 0; } вроде так? (первое выражение -- номер страницы с адресом последнего байта данных (addr + len - 1 это адрес последнего байта) , второе -- номер страницы с началом данных, соответственно их разница + 1 -- это количество страниц)Ответ 2
http://codepad.org/pfU3A77J inline unsigned page_of_byte(unsigned i) { return i >> 4; } inline unsigned pages_count(unsigned l, unsigned r) { return page_of_byte(r) - page_of_byte(l) + 1; }Ответ 3
До кучи, мой вариант: pages = ((addr & 0xFUL) + size + 15UL) >> 4 + 1; PS: не понятно, как поможет упростить алгоритм записи знание числа страниц, если для записи в первую надо учитывать смещение, а при записи в последнюю остаток.
Комментариев нет:
Отправить комментарий