|
AVR-GCC: указатель для адресного пространства более 64К, как?!?! |
|
|
|
 |
Ответов
|
Oct 25 2010, 14:59
|

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

|
В IAR решили эту проблему, там указатели для мег с >128к памятью 3-х байтовые. Программист эту проблему не ощущает. Но только когда пытается указатели на ОЗУ к указателям на флэш кастовать А в avr-gcc вроде есть какая-то секция, что-то вроде trampoline, куда могут вести указатели на функции, расположенные в верхней половине 256кб, в этой секции находится таблица, а уже в этой таблице находятся реальные адреса функций... И спомощью линкера, что-то подобное можно организовать. И это должно как-то помочь с двубайтовым ограничением на указатель. Сам никогда не пробовал, но помойму на avr фриках что-то читал об этом. Разве не должно помочь? Хотелось бы в иделае, всё адресное пространство флэши использовать под код, а то для больших мег применение gcc не имеет смысла.
|
|
|
|
|
Oct 26 2010, 05:09
|

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

|
Цитата(xelax @ Oct 25 2010, 18:59)  В IAR решили эту проблему, там указатели для мег с >128к памятью 3-х байтовые. наверное все-таки >64К Программист эту проблему не ощущает. Но только когда пытается указатели на ОЗУ к указателям на флэш кастовать Цитата(xelax @ Oct 25 2010, 18:59)  Хотелось бы в иделае, всё адресное пространство флэши использовать под код, а то для больших мег применение gcc не имеет смысла. с кодом-то как раз проблем нет, проблема начинается, когда приспичит бОльшую часть флеши под данные использовать... P.S. Вот вчера сделал проектик, в котором в atmega2560 хранятся 20 штук 2,2 килобайтных кусочка разных массивов. вышло в аккурат 48 килобайт вместе с кодом. теперь думаю - явно заказчик захочет не 20, а 40 или еще больше блоков данных впихнуть (аппетит, он, же такой...) - и что тогда? отказаться от красивых Сишных записей и вместо работы с указателями работать с long-адресами? впору думать о каком-то особом классе С++...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Oct 26 2010, 06:29
|

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

|
Цитата(ARV @ Oct 26 2010, 09:09)  наверное все-таки >64К Нет.. Имено >128к, ибо измеряю память в байтах  Килопопугаи не устраивают, так как меняются от архитектуры к архитектуре. Цитата(ARV @ Oct 26 2010, 09:09)  Программист эту проблему не ощущает. Но только когда пытается указатели на ОЗУ к указателям на флэш кастовать biggrin.gif Соблюдайте copyright. И именно с кодом беда, особенно когда активно используешь указатели на функции. В итоге при попытке вызвать функцию по указателю, расположенную в верхних 128килобайт, программа улетает чёрт знает куда.
|
|
|
|
|
Oct 26 2010, 08:13
|

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

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

неотягощённый злом
     
Группа: Свой
Сообщений: 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
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Oct 26 2010, 13:07
|

Профессионал
    
Группа: Свой
Сообщений: 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 по-моему, ваш пример подтверждает мои слова  константа BOOTLOADER_START_ADDRESS определена в GCC-шном стиле в байтах, а для icall надо в словах, вот и приходится делить на 2. разве не так?
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
Сообщений в этой теме
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, 17:07) разве не... Oct 26 2010, 15:22  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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|