Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Решение задач. Количество страниц памяти

#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: не понятно, как поможет упростить алгоритм записи знание числа страниц, если для записи в первую надо учитывать смещение, а при записи в последнюю остаток.

Комментариев нет:

Отправить комментарий