Easyelectronics.ru

Электроника для всех
Текущее время: 29 сен 2020, 03:56

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Вычислить офсет в памяти.
СообщениеДобавлено: 21 апр 2016, 10:54 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
Есть внешняя память. 512 страниц. каждая страница 64 байт.
на каждой странице первые 4 байта - метка и потом 5 записей по 12 байт.
у меня есть структура в которой я записываю номер текущей страницы и номер текущей записи на странице.
нужно считать например N-ю запись от текущей. сижу думаю над алгоритмом. ничего красивого в голову не приходит. может кто подскажет интересное решение?


Вложения:
page.png
page.png [ 4.05 Кб | Просмотров: 1378 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вычислить офсет в памяти.
СообщениеДобавлено: 21 апр 2016, 11:13 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1799
Откуда: Новокузнецк
Примерно как-то так
Код:
page = myStrucrt.currentPage + (N / 5);
log = myStrucrt.currentLog + (N % 5);
if (log >= 5)   {
   log = log - 5;
   page++;
}
if (page >= 512)   {
   //error
}

Тут я вычисляю номер страницы и номер записи, отстоящий на N от текущей записи и страницы.
Или нужно вычислить адрес?

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вычислить офсет в памяти.
СообщениеДобавлено: 21 апр 2016, 11:17 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
elisey писал(а):
Примерно как-то так
Код:
page = myStrucrt.currentPage + (N / 5);
log = myStrucrt.currentLog + (N % 5);
if (log >= 5)   {
   log = log - 5;
   page++;
}
if (page >= 512)   {
   //error
}

Тут я вычисляю номер страницы и номер записи, отстоящий на N от текущей записи и страницы.
Или нужно вычислить адрес?

но у нас есть метка 4 байта в начале каждой страницы. мы должны учитывать и ее тоже. в этом вся загвоздка.

нужно знать адресс откуда считать требуемую запись.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вычислить офсет в памяти.
СообщениеДобавлено: 21 апр 2016, 11:23 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1799
Откуда: Новокузнецк
Ну тоесть нам нужно адрес лога в памяти
Делаем функцию, котором передаем номер страницы и номер лога на странице
Код:
uint32_t getAddress(unsigned int pageIndex, unsigned int logIndex)
{
   uint32_t address = (pageIndex * 64) + 4 + (logIndex * 12);
   return address;
}

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вычислить офсет в памяти.
СообщениеДобавлено: 21 апр 2016, 11:37 
Старожил
Аватара пользователя

Зарегистрирован: 23 июл 2010, 09:54
Сообщения: 207
Откуда: Чебоксары
Offsetof - может им?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вычислить офсет в памяти.
СообщениеДобавлено: 21 апр 2016, 11:44 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
elisey писал(а):
Ну тоесть нам нужно адрес лога в памяти
Делаем функцию, котором передаем номер страницы и номер лога на странице
Код:
uint32_t getAddress(unsigned int pageIndex, unsigned int logIndex)
{
   uint32_t address = (pageIndex * 64) + 4 + (logIndex * 12);
   return address;
}

завидую людям с мозгами. :) сейчас попробую.

это адрес текущей записи а нам надо адрес скажем 10-ой записи от текущей. то есть 10 записей назад.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вычислить офсет в памяти.
СообщениеДобавлено: 21 апр 2016, 13:37 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3459
Код:
const int HEADER_LENGTH = 4;
const int LOGS_PER_PAGE = 5;
const int LOG_LENGTH = 12;
const int PAGE_LENGTH = HEADER_LENGTH + LOG_LENGTH * LOGS_PER_PAGE;

inline int LogNum(int page, int idx)    { return page * LOGS_PER_PAGE + idx; }
inline int LogPage(int num)             { return num / LOGS_PER_PAGE; }
inline int LogIdx(int num)              { return num % LOGS_PER_PAGE; }
inline int LogOffset(int page, int idx) { return page * PAGE_LENGTH + HEADER_LENGTH + idx * LOG_LENGTH; }
inline int LogOffset(int num)           { return LogOffset(LogPage(num), LogIdx(num)); }

LogOffset(n + 10);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вычислить офсет в памяти.
СообщениеДобавлено: 21 апр 2016, 13:54 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
_pv писал(а):
Код:
const int HEADER_LENGTH = 4;
const int LOGS_PER_PAGE = 5;
const int LOG_LENGTH = 12;
const int PAGE_LENGTH = HEADER_LENGTH + LOG_LENGTH * LOGS_PER_PAGE;

inline int LogNum(int page, int idx)    { return page * LOGS_PER_PAGE + idx; }
inline int LogPage(int num)             { return num / LOGS_PER_PAGE; }
inline int LogIdx(int num)              { return num % LOGS_PER_PAGE; }
inline int LogOffset(int page, int idx) { return page * PAGE_LENGTH + HEADER_LENGTH + idx * LOG_LENGTH; }
inline int LogOffset(int num)           { return LogOffset(LogPage(num), LogIdx(num)); }

LogOffset(n + 10);

а что такое n в LogOffset(n + 10); ?

а аргумент int num - это текущий адрес?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вычислить офсет в памяти.
СообщениеДобавлено: 21 апр 2016, 18:08 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
спасибо всем за помощь. :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB