|
|
  |
Вопросы новичка, Первая программа, первые вопросы |
|
|
|
Jan 22 2007, 13:26
|

Гуру
     
Группа: Свой
Сообщений: 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 подключится из него автоматически.  Привожу текст 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 */ Усе
--------------------
|
|
|
|
|
Jan 23 2007, 10:04
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jan 23 2007, 11:27
|

Частый гость
 
Группа: Участник
Сообщений: 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};
И с той и с этой программа работает!
И спасибо за пожелание успехов!
|
|
|
|
|
Jan 23 2007, 11:45
|

Шаман
     
Группа: Модераторы
Сообщений: 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 памяти.
|
|
|
|
|
Jan 23 2007, 11:46
|
Участник

Группа: Участник
Сообщений: 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 - указывает компилятору что переменная может изменится , например в прерывании. Т.е. он должен работать с ней по ее физичекому расположению и не создавать копию( например перегружая в регистр, хотя так и быстрее).
--------------------
Опыт - это та чудесная штука, которая позволяет вам узнать ошибку, когда вы ее повторите.
|
|
|
|
|
Jan 23 2007, 12:07
|

Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 23 2007, 12:38
|
Профессионал
    
Группа: Свой
Сообщений: 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
--------------------
|
|
|
|
|
Jan 23 2007, 13:40
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jan 23 2007, 15:17
|

Гуру
     
Группа: Модераторы
Сообщений: 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-bitHowever, 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_754IEEE 754 specifies four formats for representing floating-point values: single-precision (32-bit), double-precision (64-bit), И файл называется <std int.h>, т.е. только целые типы. Правда есть исключения, но тут уже ничего не поможет: Цитата http://gcc.gnu.org/ml/gcc-patches/2006-11/msg00475.htmlMIPS32 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)
|
|
|
|
|
Jan 23 2007, 17:25
|

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

|
Да собственно и нужны то только целые, так как с плавающей запятой никаких размерозависимых операций обычно не производится кроме операций выделения памяти, но тут спасает оператор sizeof.  А вот насчет stdint.h... дело в том что он введен в только в стандарт c99, и по этой причине отсутсвует во многих писюковых компиляторах, например в msvc.  Так что для пущей портируемости, когда не хочется править ни строчки в исходниках, проще пользоватся своими переопределеными целыми типами. Ладно хватит умничать...  (это я себе)
--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|