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

 
 
 
Reply to this topicStart new topic
> Прошу помощи по CodeVisionAVR, Не могу скопировать массив из flash в ram
altlogic
сообщение May 9 2008, 00:59
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Здравствуйте!

Пишу в CodeVisionAVR. Есть тип данных для хранения содержимого экрана
Код
typedef unsigned char displ_t[4][16];

Есть константа размещённая во флеше
Код
flash displ_t MT_START={"Режим:","Температура","",""};

Есть переменная размещённая в SRAM
Код
displ_t displ_buf;

Копирую массив из RAM во FLASH тупо:
Код
for(y=0;y<4;y++)
{
   for(x=0;x<16;x++)
      statetext[y][x] = MT_START[y][x];
}

А вот написать функцию, копирующую массив из одной памяти в другую не могу. Тот же код выделяю в отдельную функцию. Но не знаю как передать в неё параметры. Объявление функции
Код
void flash2ram(displ_t flash_buf, displ_t  ram_buf)

является неверным, так как она не принимает указатель на структуру во флеше, а указать модификатор хранения flash в аргументах функции не разрешает компилятор. Как произвести копирование?


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
altlogic
сообщение May 9 2008, 02:42
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Решил проблему. Просто под рукой не было хорошего справочника по Си. Шилд в справочнике по Си++ очень скудно освещает работу с массивами. При передаче двумерного массива через указатель, с ним нужно работать как с одномерным. Верный код следующий:
Код
void flash2ram(flash char *flash_buf, char  *ram_buf)
{
    char i;
    for(i=0;i<16*4;i++)
    {            
         ram_buf[i] = flash_buf[i];
    }
}


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
WHALE
сообщение May 9 2008, 05:36
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



А почему библиотечными фукциями не пользуетесь?Зачем изобретать велосипед?
char *strcpyf(char *dest, char flash *src)
copies the string src, located in FLASH, to the string dest, located in SRAM.
Returns a pointer to the string dest.
не забудьте проинклюдить string.h.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
altlogic
сообщение May 9 2008, 05:45
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Цитата(WHALE @ May 9 2008, 16:36) *
А почему библиотечными фукциями не пользуетесь?Зачем изобретать велосипед?
char *strcpyf(char *dest, char flash *src)
copies the string src, located in FLASH, to the string dest, located in SRAM.
Returns a pointer to the string dest.
не забудьте проинклюдить string.h.

У меня двухмерный массив. Вызывать функцию четыре раза? Некрасиво. Как я уже отметил, изначально у меня была проблема с передачей в качестве параметра двухмерного массива.


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
WHALE
сообщение May 9 2008, 07:57
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



ну в цикле можно-же?имхо,всегда лучше пользоваться библиотечными функциями-глюков меньше.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post

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

 


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


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