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

 
 
 
Reply to this topicStart new topic
> указатель на __flash, Преобразование типов
andrvisht
сообщение Nov 30 2005, 09:25
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Имеется вот такой код:
Код
void foo(void)
{
  volatile char c[] = {0x00, 0x00, 0x00, 0x00, 0x00};
  __flash static unsigned char ResetFrame[]={0x08,0x01,0x00,0x00,0x00};
  pFLASH = (__flash unsigned char *)ResetFrame;
  for (char i = 5; i != 0; i--)
  {
    c[i] = *(pFLASH+i);
  }
}

Указатель pFLASH
обьявлен ранее как
Код
unsigned char *pFLASH;

Копмилятору не нравиться строка
Код
pFLASH = (__flash unsigned char *)ResetFrame;
Error[Pe513]: a value of type "unsigned char __flash *" cannot be assigned to an entity of type "unsigned char *"

Если написать так
Код
(unsigned char __flash *)pFLASH = ResetFrame;
Error[Pe137]: expression must be a modifiable lvalue
Warning[Pe549]: variable "pFLASH" is used before its value is set

Конечно можно отдельно сделать указатель, тогда все работает, но вот с преобразованием не хотит sad.gif
Как это правиьно сделать ?
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 30 2005, 09:29
Сообщение #2


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



указатели на флеш и на рам не совместимы!!! используются разные команды для доступа к данным!! приведение типа ничего не даст, даже елси обмануть компилер!

надо описывать указатель так

unsigned char __flash *pFLASH;

Сообщение отредактировал KRS - Nov 30 2005, 09:33
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 30 2005, 09:32
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(&-rey @ Nov 30 2005, 11:25) *
...Как это правиьно сделать ?

Так и сделайте (в обьявлении):
Код
unsigned char __flash *pFLASH;

Дело в том, что для работы с RAM и FLASH используются разные инструкции, поэтому и указатели должны быть конкретными.

PS: KRS оказался проворнее wink.gif
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 30 2005, 09:35
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(KRS @ Nov 30 2005, 13:29) *
указатели на флеш и на рам не совместимы!!! используются разные команды для доступа к данным!! приведение типа ничего не даст, даже елси обмануть компилер!

надо описывать указатель так

__flash unsigned char *pFLASH;

Понятно, было желание *2 но думал что С сам разберется.
кстати если записать

__flash unsigned char *pFLASH;

будет Error[Be009]: memory attributes not allowed on auto variables or parameters

а если
unsigned char __flash *pFLASH;
то все нормально.
Это связано с IAR? или где-то что-то нужно в опциях ?

Вообщем ясно, так и сделал. Просто хотел через так.
Go to the top of the page
 
+Quote Post
Old1
сообщение Nov 30 2005, 09:50
Сообщение #5


Знающий
****

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



Цитата(&-rey @ Nov 30 2005, 12:35) *
кстати если записать

__flash unsigned char *pFLASH;

будет Error[Be009]: memory attributes not allowed on auto variables or parameters

Ты пытаешся переменную (типа указатель) засунуть в память программ, вот он иругается...
Go to the top of the page
 
+Quote Post

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

 


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


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