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

 
 
 
Reply to this topicStart new topic
> Как определить массив больше 32768 значений?, IAR AVR внешняя память
Target
сообщение Jan 27 2012, 09:43
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 21-05-08
Пользователь №: 37 691



Есть Atmega2561, внешняя память и сам чип позволяют адресовать до 64К ОЗУ.
В то же время не могу определить массив
Код
__no_init byte array[40000];


Компилятор IAR для AVR ругается "array is too large".

Можно ли как-нибудь обойти ограничение в 32768 значений и определить байтовый массив до 64К?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 27 2012, 09:55
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Extended keyword __far
Go to the top of the page
 
+Quote Post
Target
сообщение Jan 27 2012, 09:58
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 21-05-08
Пользователь №: 37 691



Цитата(Палыч @ Jan 27 2012, 13:55) *
Extended keyword __far


Пробовал.
Error[Pa043]: the keyword "__far" is not available with the current settings
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 27 2012, 10:06
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Memory model ?
Go to the top of the page
 
+Quote Post
Target
сообщение Jan 27 2012, 10:07
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 21-05-08
Пользователь №: 37 691



Цитата(Палыч @ Jan 27 2012, 14:06) *
Memory model ?


Small. Другой нет.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jan 27 2012, 12:50
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Нафига вообще определять такой массив.
Определите указатель на эту область памяти и все.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 27 2012, 12:52
Сообщение #7


Гуру
******

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



QUOTE (Target @ Jan 27 2012, 11:43) *
Компилятор IAR для AVR ругается "array is too large".
Да. Согласно стандарту максимальный размер массива - INT_MAX. Обойти никак. Вы можете сделать структуру из нескольких массивов и через приведение указателей обращаться к массивам как к одному сплошному через *(ptr+index), при обращении же через ptr[index] index будет трактоваться как знаковое число. Я так думаю.


--------------------
На любой вопрос даю любой ответ
"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
Палыч
сообщение Jan 27 2012, 13:14
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Сергей Борщ @ Jan 27 2012, 16:52) *
Согласно стандарту максимальный размер массива - INT_MAX.

Здесь - иное. Например, массив типа int нельзя создать с числом элементов больше чем 16383, для float - 8191...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 27 2012, 20:01
Сообщение #9


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Палыч @ Jan 27 2012, 15:14) *
Здесь - иное. Например, массив типа int нельзя создать с числом элементов больше чем 16383, для float - 8191...
Всё правильно, здесь именно «это». Максимальный размер массива — INT_MAX байтов.
Максимальное число элементов типа T — INT_MAX / sizeof(T)
Причина: в языке C разница двух указателей имеет тип int (именно знаковая) и допустима для любых двух (под)элементов одного агрегата (включая элемент сразу за последним элементом массива). Учитывая возможность приведения к char*.
Вот и получается, что раз разница двух приведённых к char* указателей должна влазить в int, то и размер (в смысле sizeof() — размера объекта) любого агрегата — массива или структуры — не может превышать INT_MAX.
Всё остальное — расширения языка.

Цитата(Сергей Борщ @ Jan 27 2012, 14:52) *
Вы можете сделать структуру из нескольких массивов
Нельзя.
Код
struct {
    char a[XXX];
    char b[YYY];
} foo;
ptrdiff_t d1 = &foo.b[YYY] - &foo.a[0];
ptrdiff_t d2 = &foo.a[0] - &foo.b[YYY];
Для того, чтобы можно было получить обе разности, должно быть sizeof(foo) <= INT_MAX

upd:
Тьху, это уже (ещё) привычка равенства размера указателя и int работает.

Строго говоря, не int, а таки ptrdiff_t, так что на x86_64 можно и больше, чем INT_MAX, там sizeof(int) = 4 а sizeof(void*) = 8

Так что вполне может быть «модель памяти» для 8- или 16-битной архитектуры, у которой указатель по умолчанию 24-или-более-битный и объект может занимать больше INT_MAX. С такими вещами сталкивался, но никогда не пользовался ввиду неэффективности и поэтому забыл.

В большинстве случаев таки упор в INT_MAX.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 27 2012, 20:54
Сообщение #10


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Сергей Борщ @ Jan 27 2012, 17:52) *
... при обращении же через ptr[index] index будет трактоваться как знаковое число. Я так думаю.

А какая разница, если адрес 16-битный? Пусть как хочет его трактует, но адресует-то всё-равно правильно.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 27 2012, 20:57
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(ReAl @ Jan 28 2012, 00:01) *
Всё правильно, здесь именно «это».

Я с Вами соглашусь, если Вы объясните: при чём здесь INT_MAX ?
Имхо: размер определяется типом size_t (и значением SIZE_MAX), а разность указателей - типом ptrdiff_t

В компиляторе IAR для mega2561:
typedef size_t unsigned long
typedef ptrdiff_t signed long
Go to the top of the page
 
+Quote Post

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

 


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


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