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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Представление адреса. Как лучше.
Jenya7
сообщение Jun 18 2018, 10:04
Сообщение #1


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

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



У меня при обращении к памяти (чтение, запись) нужно передавать адрес. Адрес состоит из нескольких составляющих (на картинке).Изначально была такая конструкция
Код
typedef struct {
    uint32_t     page_add  :  6;
    uint32_t     block_add : 11;
    uint32_t    reserved  : 15;
}g_row_address;
typedef union{
    uint32_t all;
    g_row_address bits;
}g_flashrow_address;
Может так и проще работать но я как то сравнивал листинги и такой код компилирует в два раза больше инструкций чем mask&shift.Я подумал сделать по простому
Код
#define ROW_ADDRESS(BLOCK_ADDR,PAGE_ADDR)  (BLOCK_ADDR|(PAGE_ADDR<<6))
но адрес 17-битный. то есть возникает тот же гемор сдвигать влево а потом вправо. или я что то упускаю?

Сообщение отредактировал Jenya7 - Jun 18 2018, 10:04
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 18 2018, 11:03
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Задаю дефайнами нужные мне адреса в SPI flash, выравненные по началу страниц, и использую их в виде целого числа.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 18 2018, 11:10
Сообщение #3


Гуру
******

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



Цитата(ViKo @ Jun 18 2018, 14:03) *
Задаю дефайнами нужные мне адреса в SPI flash, выравненные по началу страниц, и использую их в виде целого числа.

А когда нужно изменить размер какого-то элемента - пересчитываете все эти дефайны врукопашную? biggrin.gif
Опишите структуру своей флешь через struct {...} и не конкурируйте с компилятором - времена рукопашной компоновки памяти давно прошли.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 18 2018, 11:18
Сообщение #4


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(jcxz @ Jun 18 2018, 14:10) *
А когда нужно изменить размер какого-то элемента - пересчитываете все эти дефайны врукопашную? biggrin.gif
Опишите структуру своей флешь через struct {...} и не конкурируйте с компилятором - времена рукопашной компоновки памяти давно прошли.

Зачем вручную? Препроцессор считает.
Код
#define SFM_SYSTEM_BASE        0x00060000U            //!< SFM System Variables
...
#define SFM_SET1        (SFM_SYSTEM_BASE + SFM_PAGESIZE *  8)
#define SFM_SET2        (SFM_SYSTEM_BASE + SFM_PAGESIZE *  9)
...


Предлагаете описать в виде структуры из массивов, а потом вытягивать адреса членов этой структуры? Можно и так. Зато я точно знаю, где что расположено и сколько страниц занимает, а вам считать придется. А вдруг переполните размер памяти?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 18 2018, 11:30
Сообщение #5


Гуру
******

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



Цитата(ViKo @ Jun 18 2018, 14:18) *
Зачем вручную? Препроцессор считает.

Ну да! Это пока у вас всего пара таких переменных и когда одного размера/типа.
А когда их будет 100, да все разные - кто будет все эти 8,9,...,99 пересчитывать?
Посмотрите насколько удобнее и понятнее:
Код
struct { //каждый байт структуры - страница FLASH
  char SFM_SET1;
  char SFM_SET2;
  ...
};
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 18 2018, 11:35
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(jcxz @ Jun 18 2018, 14:30) *
//каждый байт структуры - страница FLASH

А если массив на 8 страниц?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 18 2018, 11:39
Сообщение #7


Гуру
******

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



Цитата(ViKo @ Jun 18 2018, 14:35) *
А если массив на 8 страниц?

char massiv[8]; спасёт отца демократии? rolleyes.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 18 2018, 11:45
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(jcxz @ Jun 18 2018, 14:39) *
char massiv[8]; спасёт отца демократии? rolleyes.gif

Сомнительной красоты решение.
А как вы потом превращаете эти переменные в адрес? А куда, вообще, компилятор положит эту громадную структуру? В какую память? Пардон, не настолько громадную... в 256 раз меньше, но все равно.
У меня код конфигурирования ПЛИС хранится в этой памяти. Половину объема занимает. Предлагаете мне килобайт ОЗУ или ПЗУ потратить для имитации SPI памяти? Можно определить тип структуры, но ее по некоему (нулевому?) адресу нужно прописать.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 18 2018, 12:01
Сообщение #9


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

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



я что то утерял нить повествования.
проблема в том что адрес не влезает в uint16_t. к примеру чтение по такому то адресу - сначала я передаю дами+17-ый бит а потом оставшиеся два байта.

ммм...в принципе количество блоков в данной памяти 2048. 17-й бит всегда будет 0. можно не париться я думаю.

Сообщение отредактировал Jenya7 - Jun 18 2018, 12:07
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 18 2018, 12:12
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Jenya7 @ Jun 18 2018, 15:01) *
я что то утерял нить повествования.
проблема в том что адрес не влезает в uint16_t. к примеру чтение по такому то адресу - сначала я передаю дами+17-ый бит а потом оставшиеся два байта.

Храните 32-битовый адрес, а передавайте 24 бита из него. Порциями по 8 битов.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 18 2018, 12:16
Сообщение #11


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

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



Цитата(ViKo @ Jun 18 2018, 18:12) *
Храните 32-битовый адрес, а передавайте 24 бита из него.


что то я туплю нипадецки. а как мне построить адрес - скажем последний блок 2048 - 0000 1000 0000 0000 - значит блок << 4 + адрес страницы << 6?
или нет - блок << 16 + адрес страницы << 22

Сообщение отредактировал Jenya7 - Jun 18 2018, 12:18
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 18 2018, 12:24
Сообщение #12


Гуру
******

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



Цитата(ViKo @ Jun 18 2018, 14:45) *
А как вы потом превращаете эти переменные в адрес?

Макросом. Что сложного?

Цитата(ViKo @ Jun 18 2018, 14:45) *
А куда, вообще, компилятор положит эту громадную структуру? В какую память? Пардон, не настолько громадную... в 256 раз меньше, но все равно.

Зачем он должен куда-то ложить???
Вы похоже не поняли.... Эта структура просто описывает размещение объектов внутри любой памяти. Формат размещения. Ничего никуда не кладётся.
Таким же образом я например адреса на CAN-шине распределяю.
И это всяко удобнее ручного пересчитывания всех смещений. И нагляднее.

Цитата(ViKo @ Jun 18 2018, 14:45) *
Можно определить тип структуры, но ее по некоему (нулевому?) адресу нужно прописать.

Вы не поверите, но тип можно прописать даже без всего остального.
Вот это:
struct TVar {
...
};
в си называется объявлением типа TVar.
А вот это:
TVar var;
определение переменной типа TVar.
И Вы путаете эти два случая. Размещение в памяти делается только во 2-м случае.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 18 2018, 12:28
Сообщение #13


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Я описываю структуры typedef-ми. Их точно никто никуда не кладет.
Адрес как берете? Макрос покажите. Как взять адрес того, что нигде не лежит?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 18 2018, 12:44
Сообщение #14


Гуру
******

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



Цитата(ViKo @ Jun 18 2018, 15:28) *
Я описываю структуры typedef-ми. Их точно никто никуда не кладет.

Во времена поголовно-си++ компиляторов typedef в этом случае - анахронизм. Ну если так больше нравится, то без разницы, можно и с typedef.

Цитата(ViKo @ Jun 18 2018, 15:28) *
Адрес как берете? Макрос покажите. Как взять адрес того, что нигде не лежит?

Вроде всё очевидно..... wacko.gif
Код
struct DFLASH {
  u8 firmware[8];
  u8 fifoJournal1[6];
  u8 fifoJournal2[12];
  u8 fifoJournal3[7];
};
#define DFLASHoffset(member) ((size_t)&((DFLASH *)NULL)->member)
#define DFLASHsize(member) sizeof(((DFLASH *)NULL)->member)
#define DFLASHoffsetSize(member) DFLASHoffset(member), DFLASHsize(member)
в коде:
Код
//Чтение len байт данных в *data из DFLASH начиная с адреса addr
void DflashRead(u32 addr, u32 len, void *data)
{
...
}
читаем первую страницу образа прошивки:
Код
DflashRead(DFLASHoffset(firmware), DFLASHsize(firmware[0]), buf);
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 18 2018, 12:56
Сообщение #15


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Не вижу увеличения size на размер страницы.
Чем ваши [8], [6]... лучше моих * 8, * 9?

Мои функции проще.
void SfmData_read(uint8_t *pbuf, uint32_t addr, uint32_t num);
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th April 2024 - 13:53
Рейтинг@Mail.ru


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