Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: __flash
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
URANst
Почему IAR ругается на такие конструкции, которые я взял из документации:

Код
static __flash char str1[] = "Message 1";
char str1[] = "Message 2";

char __flash *msg;
msg=str1;



на строку static __flash char str1[] = "Message 1";
пишет Warning[Pe177]: variable "str1" was declared but never referenced

И еще как сделать задержку в us или там в ms, а не в тактах, что бы не привязываться к кварцу - есть ли такая функция?
KRS
Цитата(URANst @ Feb 27 2008, 14:16) *
пишет Warning[Pe177]: variable "str1" was declared but never referenced

Не ругается, пердупреждает. что перменная не используется

Цитата(URANst @ Feb 27 2008, 14:16) *
И еще как сделать задержку в us или там в ms, а не в тактах, что бы не привязываться к кварцу - есть ли такая функция?

Так умножте частоту на время - получите такты
Код
#define CLOCK_FREQ = 16000000
#define delay_ms(v) __delay_cycles((CLOCK_FREQ*(v))/1000)
msalov
Цитата(URANst @ Feb 27 2008, 13:16) *
Код
static __flash char str1[] = "Message 1";
char str1[] = "Message 2";

Это у вас в одной функции?
URANst
нет
Вобщем покажите правильный код объявления массива во флеше, плиз.
CSB
По всей видимости, у Вас AVR.
Вы бы дали полный текст своей программы, а то если скопи-пастить то что Вы дали, то варниг не получится.

Код
static __flash char str1[] = "Message 1";
char __flash *msg;


int main( void )
{
    char str1[] = "Message 2";
    msg=str1;

    return 0;
}

Вот в этом случае Warning[Pe177] имеет место быть. Компилятор предупреждает что переменная описана, но к ней нет обращения, т.е. она не используется.

Тут есть как сделать задержку для AVR.

Цитата
Вобщем покажите правильный код объявления массива во флеше, плиз.

125 старница в CompilerReference.
vet
собственно, правильно объявили.
неясно, правда, зачем заводить две переменные с одним и тем же именем.
не забудьте прописать в свойства проекта Compiler/Extra options дополнительную опцию --string_literals_in_flash, чтобы компилятор не пытался размещать константные строки в ОЗУ.
URANst
Код
#include <iom8.h>
#include <inavr.h>
#include <pgmspace.h>
int main(void){
__enable_interrupt();
__flash char str1[] = "Message 1";
char __flash *msg;
  while (1){
   msg=strl;
  }
}


Вот это же должно работать ?
CSB
Зачем Вам прерывания?
Зачем вместо 1 написали букву "l"? o_O
Код
#include <iom8.h>
//#include <inavr.h>
#include <pgmspace.h>

__flash char str1[] = "Message 1";
char __flash *msg;

int main(void){
//__enable_interrupt();
  while (1){
   msg=str1;
  }
KRS
Цитата(URANst @ Feb 27 2008, 15:13) *
Код
#include <iom8.h>
#include <inavr.h>
#include <pgmspace.h>
int main(void){
__enable_interrupt();
__flash char str1[] = "Message 1";
char __flash *msg;
  while (1){
   msg=strl;
  }
}


Вот это же должно работать ?

IAR выкенет все переменные, если включена оптимизация! И правильно сделает.
надо использовать volatile (где это необходимо)
URANst
да черт с ним с прерыванием , это я просто тренируюсь,
дело в том что на строку
Код
char __flash str1[] = "Message 1";

выдает
Код
Error[Be009]: memory attributes not allowed on auto variables or parameters


Я этого не могу понять.
KRS
Цитата(URANst @ Feb 27 2008, 15:35) *
да черт с ним с прерыванием , это я просто тренируюсь,
дело в том что на строку
Код
char __flash str1[] = "Message 1";

выдает
Код
Error[Be009]: memory attributes not allowed on auto variables or parameters


Я этого не могу понять.

нельзя объявить локальную перменную (она или в регистре или в стеке находится) во флеше!
можно если только как static, или снаружи функции как глобальную.
URANst
Код
int main(void){
__enable_interrupt();
static __flash char  str1[] = "Message 1";
char __flash *msg;
  while (1){
   msg=str1;
  }
}

Так вроде ошибок не выдает, а если static убрать то выдает предыдущую ошибку ?
Видел примеры где __flash используетчся без static

Блин, извените меня за ламерство, что то вообще затупил, все работает smile.gif.
CSB
Error[Be009] - данный тип переменной не может быть автоматической переменной.

Я же Вам дал код, который работает. Только __enable_interrupt();, потому что у меня почему то пропал АВР'овский intrinsics.h.
Сергей Борщ
Цитата(URANst @ Feb 27 2008, 14:42) *
Так вроде ошибок не выдает, а если static убрать то выдает предыдущую ошибку ?
Видел примеры где __flash используетчся без static
Без static можно объявлять во флеше только глобальные переменные. Внутри функции переменные, размещенные во флеш должны быть объявлены с static, чтобы запретить компилятору создавать эту переменную при каждом входе в функцию, поскольку он этого сделать не может физически (о чем и ругается Be009).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.