реклама на сайте
подробности

 
 
> Вычислить офсет в памяти.
Jenya7
сообщение Apr 21 2016, 05:55
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Apr 21 2016, 07:26
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



В чем затык?
CODE
typedef struct
{
    uint8_t Raw_data[12];
} record_t;

typedef struct
{
    uint32_t Identifier;
    record_t Record[5];
} page_t;

extern page_t Ext_storage[512]; // разместить Ext_storage где надо средствами линкера.

record_t * get_record(uint_fast16_t page, uint_fast8_t record)
{
    return Ext_storage[page].Record[record];
}
На плюсах можно сделать красивее.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Apr 21 2016, 08:13
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Apr 21 2016, 13:26) *
В чем затык?

ой... сейчас попробую.

а page то мы не знаем. мы знаем текущую страницу а страницу требуемой записи надо вычислять.

а что в линкере можно указать область памяти? у меня память 24LC256. я пишу по I2C.

Сообщение отредактировал Jenya7 - Apr 21 2016, 08:34
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 21 2016, 09:19
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Jenya7 @ Apr 21 2016, 10:13) *
а page то мы не знаем. мы знаем текущую страницу а страницу требуемой записи надо вычислять.
Мне кажется это арифметика за первый класс начальной школы.
QUOTE (Jenya7 @ Apr 21 2016, 10:13) *
а что в линкере можно указать область памяти? у меня память 24LC256. я пишу по I2C.
Я не телепат.
С учетом новых исходных данных можно идти двумя путями:
1) как было сделано в avr-gcc для eeprom: В свободном месте адресного пространства (скажем, с адреса 0xA0000000) объявить регион памяти, сложить в него все относящиеся к внешней памяти секции данных. Работать с этими данными через адреса, т.е. I2C_read(&Ext_storage[page].Record[record]), старшую тетраду (байт, полуслово) адреса игнорировать. Если где-то забыли & или обратились напрямую к Ext_storage[page].Record[record] - получили исключение. Чаще всего это будет происходить во время или после сдачи изделия заказчику.

2) Освоить С++, написать класс, для которого переопределить operator=, operator[] и скрыть все обращения к внешней памяти в этих двух операторах.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Apr 21 2016, 09:28
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Apr 21 2016, 15:19) *
Мне кажется это арифметика за первый класс начальной школы.

мне не очень нравиться первый вариант.
второй вариан - лучше уж С# я его уже хорошо освоил.

Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 21 2016, 10:21
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Apr 21 2016, 15:28) *
второй вариан - лучше уж С# я его уже хорошо освоил.

Интересно - как Вы представляете работу C#, с его компиляцией кода на лету, на embedded платформе?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 09:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016