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

 
 
> AVR-GCC: указатель для адресного пространства более 64К, как?!?!
ARV
сообщение Oct 22 2010, 16:36
Сообщение #1


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

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



возможно ли каким-то образом заставить AVR-GCC сделать указатель, в котором будет не 16 бит, а больше - 24 или 32?
подмена типа меня не устраивает, т.к. хочется, чтобы компилятор верно вычислял смещения адресов полей в структурах:
pgm_read_byte_far(ptr->field5) - как обявить ptr, если допустим, он должен быть равен 0x10027?!


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
xelax
сообщение Oct 25 2010, 14:59
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



В IAR решили эту проблему, там указатели для мег с >128к памятью 3-х байтовые.
Программист эту проблему не ощущает. Но только когда пытается указатели на ОЗУ к указателям на флэш кастовать biggrin.gif

А в avr-gcc вроде есть какая-то секция, что-то вроде trampoline, куда могут вести указатели на функции, расположенные в верхней половине 256кб, в этой секции находится таблица, а уже в этой таблице находятся реальные адреса функций...
И спомощью линкера, что-то подобное можно организовать. И это должно как-то помочь с двубайтовым ограничением на указатель.
Сам никогда не пробовал, но помойму на avr фриках что-то читал об этом. Разве не должно помочь?

Хотелось бы в иделае, всё адресное пространство флэши использовать под код, а то для больших мег применение gcc не имеет смысла.
Go to the top of the page
 
+Quote Post
ARV
сообщение Oct 26 2010, 05:09
Сообщение #3


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

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(xelax @ Oct 25 2010, 18:59) *
В IAR решили эту проблему, там указатели для мег с >128к памятью 3-х байтовые.
наверное все-таки >64К
Программист эту проблему не ощущает. Но только когда пытается указатели на ОЗУ к указателям на флэш кастовать biggrin.gif

Цитата(xelax @ Oct 25 2010, 18:59) *
Хотелось бы в иделае, всё адресное пространство флэши использовать под код, а то для больших мег применение gcc не имеет смысла.
с кодом-то как раз проблем нет, проблема начинается, когда приспичит бОльшую часть флеши под данные использовать...

P.S. Вот вчера сделал проектик, в котором в atmega2560 хранятся 20 штук 2,2 килобайтных кусочка разных массивов. вышло в аккурат 48 килобайт вместе с кодом. теперь думаю - явно заказчик захочет не 20, а 40 или еще больше блоков данных впихнуть (аппетит, он, же такой...) - и что тогда? отказаться от красивых Сишных записей и вместо работы с указателями работать с long-адресами? впору думать о каком-то особом классе С++...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
xelax
сообщение Oct 26 2010, 06:29
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(ARV @ Oct 26 2010, 09:09) *
наверное все-таки >64К

Нет.. Имено >128к, ибо измеряю память в байтах biggrin.gif Килопопугаи не устраивают, так как меняются от архитектуры к архитектуре.

Цитата(ARV @ Oct 26 2010, 09:09) *
Программист эту проблему не ощущает. Но только когда пытается указатели на ОЗУ к указателям на флэш кастовать biggrin.gif

Соблюдайте copyright. maniac.gif

И именно с кодом беда, особенно когда активно используешь указатели на функции. В итоге при попытке вызвать функцию по указателю, расположенную в верхних 128килобайт, программа улетает чёрт знает куда.
Go to the top of the page
 
+Quote Post
ARV
сообщение Oct 26 2010, 08:13
Сообщение #5


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

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(xelax @ Oct 26 2010, 10:29) *
Нет.. Имено >128к, ибо измеряю память в байтах biggrin.gif Килопопугаи не устраивают, так как меняются от архитектуры к архитектуре.
в avr-gcc любая память адресуется байтами, и флешь тоже, поэтому все-таки 64К предел для 16-битного указателя... это атмеловцы внутри своих даташитов словами ее меряют...

Цитата(xelax @ Oct 26 2010, 10:29) *
Соблюдайте copyright. maniac.gif
ok, учту smile.gif

Цитата(xelax @ Oct 26 2010, 10:29) *
И именно с кодом беда, особенно когда активно используешь указатели на функции. В итоге при попытке вызвать функцию по указателю, расположенную в верхних 128килобайт, программа улетает чёрт знает куда.
с этим не спорю. я как-то озабочен данными и потому вопрос с функциями оставил без внимания


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 26 2010, 11:13
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ARV @ Oct 26 2010, 12:13) *
в avr-gcc любая память адресуется байтами, и флешь тоже, поэтому все-таки 64К предел для 16-битного указателя... это атмеловцы внутри своих даташитов словами ее меряют...

не всегда:
Код
(*(void(*)(void))(BOOTLOADER_START_ADDRESS/2))();  // div 2 is to convert byte to word addressing mode for icall


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ARV
сообщение Oct 26 2010, 13:07
Сообщение #7


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

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(demiurg_spb @ Oct 26 2010, 15:13) *
не всегда:
Код
(*(void(*)(void))(BOOTLOADER_START_ADDRESS/2))();  // div 2 is to convert byte to word addressing mode for icall
по-моему, ваш пример подтверждает мои слова smile.gif
константа BOOTLOADER_START_ADDRESS определена в GCC-шном стиле в байтах, а для icall надо в словах, вот и приходится делить на 2. разве не так?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 26 2010, 15:22
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ARV @ Oct 26 2010, 17:07) *
разве не так?

Конечно так - это ведь мой пример и мои каменты:-)

Если бы всё было в GCC-шном стиле, то и делить на 2 не пришлось.
А тут как Вы видите приходится, т.к. адресация функций словная.
Это же компилятор делает вызов функций, а не я на asm'е кропаю.
Я может быть и не хотел бы знать об особенностях адресации в инструкциях call icall, а тем не менее вынужден.

Так что в avr-gcc не вся адресация байтная - и это, судя по форуму, многих сбивает с толку.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ARV   AVR-GCC: указатель для адресного пространства более 64К   Oct 22 2010, 16:36
- - aesok   Цитата(ARV @ Oct 22 2010, 20:36) возможно...   Oct 22 2010, 17:11
|- - demiurg_spb   Есть такой макрос для взятия адреса, может быть Ва...   Oct 23 2010, 08:24
- - ARV   все эти макросы и т.п. мне известны, но это совсем...   Oct 23 2010, 18:21
|- - Petka   Цитата(ARV @ Oct 23 2010, 22:21) все эти ...   Oct 23 2010, 19:52
- - ReAl   Единственное, что остаётся - стараться всё такое р...   Oct 23 2010, 19:39
|- - demiurg_spb   Цитата(ReAl @ Oct 23 2010, 23:39) Единств...   Oct 24 2010, 07:38
|- - ARV   Цитата(demiurg_spb @ Oct 24 2010, 11:38) ...   Oct 24 2010, 17:04
- - ReAl   Имелось ввиду "всё такое (где структуры/поля)...   Oct 24 2010, 09:45
|- - demiurg_spb   Цитата(ReAl @ Oct 24 2010, 13:45) строки ...   Oct 25 2010, 08:57
|- - demiurg_spb   Цитата(ARV @ Oct 26 2010, 09:09) наверное...   Oct 26 2010, 06:31
- - IgorKossak   В IAR AVR для указателей на дальние области были к...   Oct 26 2010, 06:46
|- - demiurg_spb   Цитата(IgorKossak @ Oct 26 2010, 10:46) В...   Oct 26 2010, 06:56
- - xelax   Вот к стати народ обсуждает как trampoline секцию ...   Oct 26 2010, 07:43


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 16:05
Рейтинг@Mail.ru


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