|
__flash |
|
|
|
Feb 27 2008, 11:16
|
Частый гость
 
Группа: Новичок
Сообщений: 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
|
|
|
|
|
 |
Ответов
(1 - 13)
|
Feb 27 2008, 11:46
|

Профессионал
    
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Feb 27 2008, 11:47
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(URANst @ Feb 27 2008, 13:16)  Код static __flash char str1[] = "Message 1"; char str1[] = "Message 2"; Это у вас в одной функции?
|
|
|
|
|
Feb 27 2008, 12:04
|
Частый гость
 
Группа: Новичок
Сообщений: 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.
|
|
|
|
|
Feb 27 2008, 12:13
|
Частый гость
 
Группа: Новичок
Сообщений: 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
|
|
|
|
|
Feb 27 2008, 12:24
|
Частый гость
 
Группа: Новичок
Сообщений: 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; }
|
|
|
|
|
Feb 27 2008, 12:28
|

Профессионал
    
Группа: Модераторы
Сообщений: 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 (где это необходимо)
|
|
|
|
|
Feb 27 2008, 12:35
|
Частый гость
 
Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912

|
да черт с ним с прерыванием , это я просто тренируюсь, дело в том что на строку Код char __flash str1[] = "Message 1"; выдает Код Error[Be009]: memory attributes not allowed on auto variables or parameters Я этого не могу понять.
|
|
|
|
|
Feb 27 2008, 12:40
|

Профессионал
    
Группа: Модераторы
Сообщений: 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, или снаружи функции как глобальную.
|
|
|
|
|
Feb 27 2008, 12:42
|
Частый гость
 
Группа: Новичок
Сообщений: 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 Блин, извените меня за ламерство, что то вообще затупил, все работает  .
Сообщение отредактировал URANst - Feb 27 2008, 12:45
|
|
|
|
|
Feb 27 2008, 14:32
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|