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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Вопросы новичка, Первая программа, первые вопросы
prottoss
сообщение Jan 22 2007, 13:26
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Anjey_N @ Jan 22 2007, 16:51) *
Цитата(prottoss @ Jan 22 2007, 12:38) *

Цитата(Anjey_N @ Jan 22 2007, 15:31) *

...
PORTD=decode[Tens]; // не работает
PORTB&=~Bit(1); // включаем 2 индикатор
...
А что, строчка ниже подчеркнутой работает?
Да, эта строчка работает
Тогда читайте, что сказал выше Сергей Борщ

Цитата(Сергей Борщ @ Jan 22 2007, 16:48) *
Кстати, чтобы компилятор не ругался на __enable_interrupt(), __disable_interrupt() и т.п. достаточно включить <inavr.h>, intrinsic.h подключится из него автоматически.
smile.gif Привожу текст inavr.h (IAR 4.10B)

Код
/**************************************************************
**             - INAVR.H -
**
**     Intrinsics for iccAVR
**
**     Used with iccAVR.
**
**     Copyright IAR Systems 1999. All rights reserved.
**
**     File version: $Revision: 1.10 $
**
**************************************************************/

#include <intrinsics.h>
/* The intrinsics for iccAVR has been moved to intrinsics.h */
Усе


--------------------
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Jan 22 2007, 22:32
Сообщение #17


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

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Спасибо всем, кто мне помогал, особенно Сергею Борщу. Он оказался прав. Программа теперь работает
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 23 2007, 10:04
Сообщение #18


Гуру
******

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



Цитата(Anjey_N @ Jan 22 2007, 21:32) *
Он оказался прав. Программа теперь работает
На самом деле правы были все. Обратите внимание на замечания otrog и aesok по поводу volatile. Без этого вполне возможно что программа у вас сейчас работает, а при смене уровня оптимизации, версии компилятора или просто добавлении лишней команды вдруг перестанет. Причем компилятор будет совершенно не виноват. Поскольку вы только начинаете - лучше сразу приучить себя писать правильно, чтобы потом не наступать на эти очень распространенные грабли на ровном месте.

Успехов!


--------------------
На любой вопрос даю любой ответ
"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
Anjey_N
сообщение Jan 23 2007, 11:27
Сообщение #19


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

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Согласен, правы были все и всем за это спасибо.

Объясните, пожалуйста. как понимать слово volatile!
И чем отличаются строки
char decode[10]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90};

и

__flash char decode[10]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90};

И с той и с этой программа работает!


И спасибо за пожелание успехов!
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 23 2007, 11:45
Сообщение #20


Шаман
******

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



Цитата(Anjey_N @ Jan 23 2007, 10:27) *
Объясните, пожалуйста. как понимать слово volatile!
И чем отличаются строки
char decode[10]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90};
и
__flash char decode[10]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90};
И с той и с этой программа работает!

volatile означает "изменчивый". Это слово даёт компилятору указание не оптимизировать обращения к переменной или обьекту.

Строки, приведённые Вами, отличаются местом их хранения. Первая хранится в ОЗУ (грузится туда из flash при старте), вторая хранится во flash памяти.
Go to the top of the page
 
+Quote Post
satellite-plus
сообщение Jan 23 2007, 11:46
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 8-01-07
Из: Одесса
Пользователь №: 24 196



Цитата(Anjey_N @ Jan 23 2007, 10:27) *
Согласен, правы были все и всем за это спасибо.

Объясните, пожалуйста. как понимать слово volatile!
И чем отличаются строки
char decode[10]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90};

и

__flash char decode[10]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90};

И с той и с этой программа работает!


И спасибо за пожелание успехов!


char decode[10] - переменные в ОЗУ. Параметры прописываются во флэш и при старте переписываются в ОЗУ.

__flash char decode[10] - константы. Расположены во флэши.

volatile - указывает компилятору что переменная может изменится , например в прерывании. Т.е. он должен работать с ней по ее физичекому расположению и не создавать копию( например перегружая в регистр, хотя так и быстрее).


--------------------
Опыт - это та чудесная штука, которая позволяет вам узнать ошибку, когда вы ее повторите.
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Jan 23 2007, 12:07
Сообщение #22


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

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Цитата(satellite-plus @ Jan 23 2007, 12:46) *
Цитата(Anjey_N @ Jan 23 2007, 10:27) *

Согласен, правы были все и всем за это спасибо.

Объясните, пожалуйста. как понимать слово volatile!
И чем отличаются строки
char decode[10]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90};

и

__flash char decode[10]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90};

И с той и с этой программа работает!


И спасибо за пожелание успехов!


char decode[10] - переменные в ОЗУ. Параметры прописываются во флэш и при старте переписываются в ОЗУ.

__flash char decode[10] - константы. Расположены во флэши.

volatile - указывает компилятору что переменная может изменится , например в прерывании. Т.е. он должен работать с ней по ее физичекому расположению и не создавать копию( например перегружая в регистр, хотя так и быстрее).



Т.е. если записать __flash char decode[10]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90};, то экономим ОЗУ?
Тогда все константы, таблицы лучше размещать во flash? Например какую-нибудь таблицу перекодировки!

Сообщение отредактировал Anjey_N - Jan 23 2007, 12:09
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Jan 23 2007, 12:30
Сообщение #23


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Да.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 23 2007, 12:38
Сообщение #24


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

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Только лучше написать __flash const char decode[10]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90};, а то при оптимизации компилятор может скопировать массив в ОЗУ

Сообщение отредактировал GDI - Jan 23 2007, 12:45


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Jan 23 2007, 12:56
Сообщение #25


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

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Ура! Жизнь налаживается! cheers.gif
Пора заводить словарик!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 23 2007, 13:40
Сообщение #26


Гуру
******

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



Цитата(GDI @ Jan 23 2007, 11:38) *
Только лучше написать __flash const char decode[10]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90};, а то при оптимизации компилятор может скопировать массив в ОЗУ
Это имеет еще одно скрытое преимущество - если вы захотите перенести код на другую платформу (например для отладки алгоритма на PC), где нет понятия флеш или ключевого слова __flash, вы просто добавите в начало исходника строчку #define __flash и переменная будет продолжать вести себя адекватно, т.е. константой, и компилятор сможет проконтролировать попытки записи в нее.

И сразу на будущее - наверняка придется таскать код между платформами (пример только что привел), сразу же наткнетесь на то, что int, ling, float, double, в общем практически все типы имеют различный размер. Например int у AVR, MSP430, win16 = 2 байта, а у ARM, win32 - 4 байта. И чтобы не попадать в зависимость от этой неоднозначности есть два пути -
1)подключаете стандартный файл <stdint.h> и везде в программе используете переопределенные в нем типы uint8_t, int8_t, uin16_t, int16_t и т.д. (по названию понятно что они означают)
2)пишете для каждой платформы свой файл в котором подбираете подходящий тип:
Код
typedef unsigned char  byte;
typedef signed char    sbyte;
typedef unsigned short word;
typedef unsigned long  dword;

typedef volatile byte  sfr_byte;
typedef volatile word  sfr_word;


--------------------
На любой вопрос даю любой ответ
"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
SpiritDance
сообщение Jan 23 2007, 14:17
Сообщение #27


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



эээ...
long и float разный размер на разных платформах?
насчет long может и соглашусь, так как нигде не указана его длина, но float - 32 разряда.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 23 2007, 15:17
Сообщение #28


Гуру
******

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



Цитата(SpiritDance @ Jan 23 2007, 13:17) *
эээ...
long и float разный размер на разных платформах?
насчет long может и соглашусь, так как нигде не указана его длина, но float - 32 разряда.

про long (никаких домыслов, только факты):
Цитата
http://en.wikipedia.org/wiki/64-bit

However, in many programming environments on 64-bit machines, "int" variables are still 32 bits wide, but "long"s and pointers are 64 bits wide. These are described as having an LP64 data model.
Про float подловили :-) Действительно:
Цитата
http://en.wikipedia.org/wiki/IEEE_754
IEEE 754 specifies four formats for representing floating-point values: single-precision (32-bit), double-precision (64-bit),
И файл называется <stdint.h>, т.е. только целые типы. Правда есть исключения, но тут уже ничего не поможет:
Цитата
http://gcc.gnu.org/ml/gcc-patches/2006-11/msg00475.html

MIPS32 rev 2 optionally supports 64bit floating unit. This patch allows the use of 64bit floats by passing the -mfp64 option when used along with a MIPS32R2 cpu (the 24k/34k family with float point all have 64bit floating point units).


--------------------
На любой вопрос даю любой ответ
"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
SpiritDance
сообщение Jan 23 2007, 17:25
Сообщение #29


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Да собственно и нужны то только целые, так как с плавающей запятой никаких размерозависимых операций обычно не производится кроме операций выделения памяти, но тут спасает оператор sizeof. smile.gif
А вот насчет stdint.h... дело в том что он введен в только в стандарт c99, и по этой причине отсутсвует во многих писюковых компиляторах, например в msvc. sad.gif Так что для пущей портируемости, когда не хочется править ни строчки в исходниках, проще пользоватся своими переопределеными целыми типами.

Ладно хватит умничать... smile.gif (это я себе)


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 24 2007, 03:11
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Сергей Борщ @ Jan 23 2007, 14:40) *
1)подключаете стандартный файл <stdint.h> и везде в программе используете переопределенные в нем типы uint8_t, int8_t, uin16_t, int16_t и т.д. (по названию понятно что они означают)


Вау! Я прямо горд за себя. Пришёл к этому самостоятельно когда оценивал компиляторы. Файлик свиснул из GCC. Правда подправлял чего-то там, а то не шло на IAR.

smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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