|
Представление адреса. Как лучше. |
|
|
|
Jun 18 2018, 10:04
|
Профессионал
Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 18 2018, 11:18
|
Универсальный солдатик
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362
|
Цитата(jcxz @ Jun 18 2018, 14:10) А когда нужно изменить размер какого-то элемента - пересчитываете все эти дефайны врукопашную? Опишите структуру своей флешь через 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) ... Предлагаете описать в виде структуры из массивов, а потом вытягивать адреса членов этой структуры? Можно и так. Зато я точно знаю, где что расположено и сколько страниц занимает, а вам считать придется. А вдруг переполните размер памяти?
|
|
|
|
|
Jun 18 2018, 11:30
|
Гуру
Группа: Свой
Сообщений: 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; ... };
|
|
|
|
|
Jun 18 2018, 12:01
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
я что то утерял нить повествования. проблема в том что адрес не влезает в uint16_t. к примеру чтение по такому то адресу - сначала я передаю дами+17-ый бит а потом оставшиеся два байта. ммм...в принципе количество блоков в данной памяти 2048. 17-й бит всегда будет 0. можно не париться я думаю.
Сообщение отредактировал Jenya7 - Jun 18 2018, 12:07
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 18 2018, 12:24
|
Гуру
Группа: Свой
Сообщений: 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-м случае.
|
|
|
|
|
Jun 18 2018, 12:44
|
Гуру
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713
|
Цитата(ViKo @ Jun 18 2018, 15:28) Я описываю структуры typedef-ми. Их точно никто никуда не кладет. Во времена поголовно-си++ компиляторов typedef в этом случае - анахронизм. Ну если так больше нравится, то без разницы, можно и с typedef. Цитата(ViKo @ Jun 18 2018, 15:28) Адрес как берете? Макрос покажите. Как взять адрес того, что нигде не лежит? Вроде всё очевидно..... Код 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);
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|