|
как в IAR объявить массив в памяти кода? |
|
|
|
Jun 29 2006, 13:49
|
Частый гость
 
Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638

|
Подскажите как в IAR объявить массив в памяти кода mega128, а то 4KB памяти данных не хватает.
Заранее спасибо.
--------------------
Завтра пойму, что нужно было сделать вчера...
|
|
|
|
|
Jun 29 2006, 15:39
|
Частый гость
 
Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638

|
Цитата(vet @ Jun 29 2006, 17:29)  __flash int mas[] = {1,2,3,4}; Спасибо. А указатель на массив как определить? Пробовал __flash char *Apik=setup_window; ругается: Error[Be009]: memory attributes not allowed on auto variables or parameters В чем причина? Может быть в том, что память кода по 16бит, а у меня массив переменных char и компилятор не может сам автоматически правильно адресовать?
--------------------
Завтра пойму, что нужно было сделать вчера...
|
|
|
|
|
Jun 29 2006, 17:46
|

Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 15-10-05
Из: Томск
Пользователь №: 9 680

|
Цитата(Faradey @ Jun 29 2006, 21:39)  Цитата(vet @ Jun 29 2006, 17:29)  __flash int mas[] = {1,2,3,4};
Спасибо. А указатель на массив как определить? Пробовал __flash char *Apik=setup_window; ругается: Error[Be009]: memory attributes not allowed on auto variables or parameters что сделать-то хотел? может так поможет: __flash char setup_window[] = "xxx"; void my_func(void) { char __flash *ptr=setup_window; PORTB=ptr[0]; //пример использования }
|
|
|
|
|
Jun 30 2006, 01:21
|
Группа: Новичок
Сообщений: 2
Регистрация: 14-07-05
Пользователь №: 6 801

|
Цитата(dRaider @ Jun 30 2006, 01:55)  Если указатель на масив то так
__flash int mas[] = {1,2,3,4}; int __flash * point; А вот так можно ? int __flash mas[] = {1,2,3,4}; int __flash * point; или так ? typedef int __flash fl_int; fl_int mas[] ; fl_int* point ;
|
|
|
|
|
Jun 30 2006, 07:38
|
Частый гость
 
Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638

|
Все всем спасибо.
Массив объявляется как __flash char main_window[]={...}; а указатель как char __flash *Apik=main_window; и все работает, т.е. массив помещается в память кода.
--------------------
Завтра пойму, что нужно было сделать вчера...
|
|
|
|
|
Jun 30 2006, 09:15
|

Знающий
   
Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095

|
Цитата(Faradey @ Jun 30 2006, 10:38)  Все всем спасибо.
Массив объявляется как __flash char main_window[]={...}; а указатель как char __flash *Apik=main_window; и все работает, т.е. массив помещается в память кода. Можете и сам указатель туда же запихнуть: Цитата __flash char __flash *Apik=main_window;
|
|
|
|
|
Jun 30 2006, 10:28
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Faradey @ Jun 30 2006, 10:38)  Все всем спасибо.
Массив объявляется как __flash char main_window[]={...}; а указатель как char __flash *Apik=main_window; и все работает, т.е. массив помещается в память кода. Код __flash char *ap; // Указатель в flash памяти на массив в ОЗУ char __flash *ap; // Указатель в ОЗУ на массив в flash памяти char *ap; // Указатель в ОЗУ на массив в ОЗУ
|
|
|
|
|
Jul 17 2009, 05:58
|
Местный
  
Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35

|
А двумерный? На такую строчку Код char ResultADC[ 24 ][ 32 ] = { 0 }; char **ptrResultADC = ResultADC; IAR 5.20 ругается: Цитата Error[Pe144]: a value of type "char (*)[32]" cannot be used to initialize an entity of type "char **" Z:\main.c 27 Вроде запись правильная... нет?
--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
|
|
|
|
|
Jul 17 2009, 07:10
|
Местный
  
Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35

|
Цитата(Dog Pawlowa @ Jul 17 2009, 10:51)  Массив в реальности остается одномерным, и в нем записаны переменные типа char. Почему у Вас две звезды получилось? понял, получилось из серии "я не волшебник, я только учусь - вот вам стеклянные тапочки" Где-то вроде видел такую запись. Почему-то отложилась как работающая. Двумерные раньше не использовал. По задаче - можно и не использовать. Но хотелось бы потренироваться. Как я понимаю, надо объявить указатель на строки в двумерном массиве. И передавать в функции уже именно указатель на конкретную строку. В любом случае буду благодарен за кусочек или ссылку.
--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
|
|
|
|
|
Jul 17 2009, 08:27
|

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

|
Цитата(Panych @ Jul 17 2009, 10:10)  Где-то вроде видел такую запись. Почему-то отложилась как работающая. Двумерные раньше не использовал. Она действительно работает. Только означает она не то, что вы подумали, а "указатель на указатель на char". Поскольку (как отметил Dog Pawlowa) массив фактически в памяти расположен одномерно, то "двумерный" указатель должен содержать (знать на этапе компиляции) одну из размерностей. Цитата(Panych @ Jul 17 2009, 10:10)  Но хотелось бы потренироваться. Как я понимаю, надо объявить указатель на строки в двумерном массиве. И передавать в функции уже именно указатель на конкретную строку. Да, совершенно верно. Код #define LINE_SIZE 10 typedef uint8_t line_t[LINE_SIZE]; // новый тип "строка массива" line_t Array[4]; // массив 10*4
void func1(line_t line) // синтаксически передается строка. { // однако по правилам С массивы передаются не по значению, // а по указателю. Поэтому работаем со строкой как с одномерным массивом. printf(" %d ",line[1]); }
void func2(line_t * line) // явно передаем указатель на строку { printf(" %d ",(*line)[2]); }
void func3(line_t * line) // он же указатель на массив { printf(" %d ",line[3][2]); }
int main() { for(uint8_t y = 0; y < sizeof(Array) / sizeof(Array[0]); ++y) for(uint8_t x = 0; x < sizeof(line_t); ++x) Array[y][x] = x + y * sizeof(line_t); func1(Array[1]); func2(&Array[2]); func3(Array);
return EXIT_SUCCESS; } Чуть позже выложу пример без объявления типа.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 17 2009, 09:33
|
Местный
  
Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35

|
Цитата(Сергей Борщ @ Jul 17 2009, 12:27)  Чуть позже выложу пример без объявления типа. С примером разобрался вроде, хотя "не чувствую", в чем преимущество объявления типа. По идее, наверное, неплохо бы использовать структуру, ведь есть массив и две координаты в нем. Но, опять же, для каких случаев есть смысл городить это - нет ясности. Нашел много книг в инете, но всё это описано как-то отстраненно, в общем случае.
--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|