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

 
 
> __flash
URANst
сообщение Feb 27 2008, 11:16
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912



Почему 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, а не в тактах, что бы не привязываться к кварцу - есть ли такая функция?

Сообщение отредактировал URANst - Feb 27 2008, 11:25
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 13)
KRS
сообщение Feb 27 2008, 11:46
Сообщение #2


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

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



Цитата(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)
Go to the top of the page
 
+Quote Post
msalov
сообщение Feb 27 2008, 11:47
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(URANst @ Feb 27 2008, 13:16) *
Код
static __flash char str1[] = "Message 1";
char str1[] = "Message 2";

Это у вас в одной функции?
Go to the top of the page
 
+Quote Post
URANst
сообщение Feb 27 2008, 11:52
Сообщение #4


Частый гость
**

Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912



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

Сообщение отредактировал URANst - Feb 27 2008, 11:53
Go to the top of the page
 
+Quote Post
CSB
сообщение Feb 27 2008, 12:04
Сообщение #5


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



По всей видимости, у Вас 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.
Go to the top of the page
 
+Quote Post
vet
сообщение Feb 27 2008, 12:04
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



собственно, правильно объявили.
неясно, правда, зачем заводить две переменные с одним и тем же именем.
не забудьте прописать в свойства проекта Compiler/Extra options дополнительную опцию --string_literals_in_flash, чтобы компилятор не пытался размещать константные строки в ОЗУ.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
URANst
сообщение Feb 27 2008, 12:13
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912



Код
#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;
  }
}


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

Сообщение отредактировал URANst - Feb 27 2008, 12:15
Go to the top of the page
 
+Quote Post
CSB
сообщение Feb 27 2008, 12:24
Сообщение #8


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



Зачем Вам прерывания?
Зачем вместо 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;
  }
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 27 2008, 12:28
Сообщение #9


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

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



Цитата(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 (где это необходимо)
Go to the top of the page
 
+Quote Post
URANst
сообщение Feb 27 2008, 12:35
Сообщение #10


Частый гость
**

Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912



да черт с ним с прерыванием , это я просто тренируюсь,
дело в том что на строку
Код
char __flash str1[] = "Message 1";

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


Я этого не могу понять.
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 27 2008, 12:40
Сообщение #11


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

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



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

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


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

нельзя объявить локальную перменную (она или в регистре или в стеке находится) во флеше!
можно если только как static, или снаружи функции как глобальную.
Go to the top of the page
 
+Quote Post
URANst
сообщение Feb 27 2008, 12:42
Сообщение #12


Частый гость
**

Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912



Код
int main(void){
__enable_interrupt();
static __flash char  str1[] = "Message 1";
char __flash *msg;
  while (1){
   msg=str1;
  }
}

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

Блин, извените меня за ламерство, что то вообще затупил, все работает smile.gif.

Сообщение отредактировал URANst - Feb 27 2008, 12:45
Go to the top of the page
 
+Quote Post
CSB
сообщение Feb 27 2008, 12:42
Сообщение #13


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



Error[Be009] - данный тип переменной не может быть автоматической переменной.

Я же Вам дал код, который работает. Только __enable_interrupt();, потому что у меня почему то пропал АВР'овский intrinsics.h.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 27 2008, 14:32
Сообщение #14


Гуру
******

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



Цитата(URANst @ Feb 27 2008, 14:42) *
Так вроде ошибок не выдает, а если static убрать то выдает предыдущую ошибку ?
Видел примеры где __flash используетчся без static
Без static можно объявлять во флеше только глобальные переменные. Внутри функции переменные, размещенные во флеш должны быть объявлены с static, чтобы запретить компилятору создавать эту переменную при каждом входе в функцию, поскольку он этого сделать не может физически (о чем и ругается Be009).


--------------------
На любой вопрос даю любой ответ
"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

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:57
Рейтинг@Mail.ru


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