WinAvr в вопросах и ответах
Ну если макросы sbi и cbi определены, то почему бы этому не работать ?
- Реклама
Ну, если бы у бабушки был...Аlex писал(а):Ну если макросы sbi и cbi определены, то почему бы этому не работать ?
С другой стороны согласен, а с третьей: если CHECKBIT(x,y) определили, то и пару строчек о sbi() и cbi() можно было черкнуть.
Ну, если бабушке всё рассказать и всему научить, то ей и дедушка не понадобитьсяIM1 писал(а):пару строчек о sbi() и cbi() можно было черкнуть.
А так, согласен, новичка эти слова могут ввести в ступор. Можно было и описать их в примере.
Хотя, с другой стороны, - http://yandex.ru/yandsearch?clid=9582&t ... 8+cbi&lr=5
Да что далеко ходить
http://radiokot.ru/forum/viewtopic.php? ... 3#p1576663
Там чуть подругому, но тоже в тему.
Там чуть подругому, но тоже в тему.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Я просто к ним настолько привык, что считаю стандартными в отличие от макроса проверки бита. Уже сам не помню где они определены. Вот мой джентельменский набор: Defines.h.
В WinAVR-20100110 они определены в deprecated.h:
Т.е. пользоваться ими не рекомендуется, но они стандартные, т.к. определены в библиотеке. Вообще, следует просматривать иногда эти заголовочники, чтобы не изобретать велосипедов.
В WinAVR-20100110 они определены в deprecated.h:
Код: Выделить всё
/**
\ingroup deprecated_items
\def sbi(port, bit)
\deprecated
Set \c bit in IO port \c port.
*/
#define sbi(port, bit) (port) |= (1 << (bit))
/**
\ingroup deprecated_items
\def cbi(port, bit)
\deprecated
Clear \c bit in IO port \c port.
*/
#define cbi(port, bit) (port) &= ~(1 << (bit))Россия навсегда!
- Реклама
А Atmel Studio посылает очень далеко с такими конструкциями.uni писал(а):Т.е. пользоваться ими не рекомендуется, но они стандартные, т.к. определены в библиотеке. Вообще, следует просматривать иногда эти заголовочники, чтобы не изобретать велосипедов.
Вообще то это дело вкуса, я например, предпочитаю лишний раз написать типа (port) |= (1 << (bit)) или (port) &= ~(1 << (bit)) непосредственно в тексте, просто и понятно.
Может вы просто не умеете её готовить?
\Atmel Toolchain\AVR8 GCC\Native\3.4.2.939\avr8-gnu-toolchain\avr\include\compat\deprecated.h - вот тут они находятся. Нужно лишь правильно подключить заголовочники:
\Atmel Toolchain\AVR8 GCC\Native\3.4.2.939\avr8-gnu-toolchain\avr\include\compat\deprecated.h - вот тут они находятся. Нужно лишь правильно подключить заголовочники:
Код: Выделить всё
#include <compat/deprecated.h>Россия навсегда!
Готовить умею, просто не люблю. Посмотрел папку, да уж, круто, аж 2005г. макросы! Ради несчастных sbi - cbi...uni писал(а):Может вы просто не умеете её готовить?
Уже писал, что дело вкуса и привычки. В стандарте нет, значит нет, а макрос можно любой склепать.
А что за стандарт такой? PROGMEM и работа с флеш там тоже есть, а с EEPROM? Если есть, то и sbi() и cbi() точно совершенно также. Тут вам не ПК. Если когда-нить решитесь озаботиться изучением ассемблера AVR, то обратите внимание на инструкции SBI и CBI и подумайте почему макросы так названы. Люди, которые изучали AVR с низу, не будут иметь проблем с пониманием этих команд и макросов.IM1 писал(а):Готовить умею, просто не люблю. Посмотрел папку, да уж, круто, аж 2005г. макросы! Ради несчастных sbi - cbi...uni писал(а):Может вы просто не умеете её готовить?
Уже писал, что дело вкуса и привычки. В стандарте нет, значит нет, а макрос можно любой склепать.
Россия навсегда!
- Сообщения: 134
- Зарегистрирован: Вс авг 01, 2010 16:05:25
Доброго всем времени суток, объясните в чём дело
void slojim_str(char* sdc){
fg=sizeof(sdc);
...................
..................
................}
slojim_str(read_SMS);
При таком построении кода функция sizeof выдаёт неправельный результат,
и как это исправить?
void slojim_str(char* sdc){
fg=sizeof(sdc);
...................
..................
................}
slojim_str(read_SMS);
При таком построении кода функция sizeof выдаёт неправельный результат,
и как это исправить?
- Сообщения: 134
- Зарегистрирован: Вс авг 01, 2010 16:05:25
Вот вот. где то вдалеке я это понимаю, вот как бы это по граммотному сделать.a_skr писал(а):Наверное, нужна длина строки (см. strlen), а не размер указателя.
А где смотреть?
Вот Вы неугомонный, я же сказал: дело вкуса и делайте, что хотите. Почитайте классику что ли, например K&R.uni писал(а):А что за стандарт такой?
Сходите по ссылке http://microsin.ru/content/view/629/44/ , там Вам покажут на примерах, что не нужны ненужные макросы, простите за тавтологию.
Здорово Вы меня приложили. У меня тоже была мысль, что в Вас бродит ностальгия по ассемблеру, раз так рьяно используете названия его команд. Но постеснялся написать, чтобы не обидеть.uni писал(а):Если когда-нить решитесь озаботиться изучением ассемблера AVR, то обратите внимание на инструкции SBI и CBI и подумайте почему макросы так названы.
А по поводу ассемблера, то уже давно озаботился, более того периодически проверяю по дизассемблеру узкие места при оптимизаниции ибо компилятор иногда шибко умничает и выбрасывает куски кода. Ну, можете еще посмотреть в теме "Ассемблер (ASM) для AVR в вопросах и ответах", там я даю фрагменты кода для 1WIRE с разъяснениями.
Ну, вроде бы все обсудили. Успехов
Послушайте, уважаемый IM1, здесь был конкретный вопрос (прочтите внимательно его, пожалуйста):
Я дал на него исчерпывающий ответ, а вы ДВА раза не смогли понять как заставить его работать!kapitaneo писал(а):Помогите разобраться
Как присвоить значение с ноги одного порта на ногу другого?
В Codevisione все просто PORTC.1=PINB.2;
А как в WINAVre
Я уже голову сломал, гуглин нифига.
Спасибо, заранее.
IM1 писал(а):И, что, прям ЭТО работает в GCC?uni писал(а):Код: Выделить всё
#define CHECKBIT(x,y) ((x) & (1<<(y))) CHECKBIT( PINB, 2 ) ? sbi( PORTC, 1 ) : cbi( PORTC, 1 );
Так что кого вы тут учите? Садитесь за букварь и изучайте инструментальные средства, которыми пользуетесь, угомонитель вы наш.IM1 писал(а):А Atmel Studio посылает очень далеко с такими конструкциями.uni писал(а):Т.е. пользоваться ими не рекомендуется, но они стандартные, т.к. определены в библиотеке. Вообще, следует просматривать иногда эти заголовочники, чтобы не изобретать велосипедов.
Россия навсегда!
sizeof() - это не совсем функция, скорее это оператор типа +, -, * и т.д. только унарный, т.е. с одним операндом. Так вот, этот оператор возвращает размер типа в байтах. Если тип - указатель, то выражение sizeof(указатель) можно считать константой, т.к. компилятору это известно на момент компиляции. Если операнд - массив, то выражение sizeof(массив) - вернёт размер массива в байтах, короче говоря, sizeof() используется, когда нужно указать размер объекта в байтах, и, если это известно на момент компиляции программы.TICLIR писал(а):Вот вот. где то вдалеке я это понимаю, вот как бы это по граммотному сделать.a_skr писал(а):Наверное, нужна длина строки (см. strlen), а не размер указателя.
А где смотреть?
Если нам нужен размер строки, которая передаётся не через буфер с известным размером, а через указатель на область памяти, то нужно использовать функции работы со строками. Именно функции, т.к. они работают уже во время выполнения программы, когда размер строки не известен, и высчитывают этот размер по указателю на неё в памяти. Т.е. функция strlen() будет перебирать символы с начала строки до встречи с символом завершения '\0' - нулевым байтом, поэтому такие строки называются ASCIIZ, где ASCII - это кодовая таблица (стандарт), а Z - это Zero (ноль) на конце такой строки.
Смотреть можно в заголовочнике string.h, выбирая оттуда имена функций и вставляя их в строку поиска Google.
Россия навсегда!
Все обидеть норовите?uni писал(а):Так что кого вы тут учите? Садитесь за букварь и изучайте инструментальные средства, которыми пользуетесь, угомонитель вы наш.
Тема была закрыта сразу мной с Alexом в связи с взаимным согласием, что макросы надо было описать, если используете таковые, а не пугать начинающих.
Не надо нести чушь на пустом месте, - есть правила, есть стандарты. Например, Вы же не ездите по левой стороне и не ходите голым по улице?Аlex писал(а):А так, согласен, новичка эти слова могут ввести в ступор. Можно было и описать их в примере.
Про асм Вы уже не? Что еще мне изучить? Если можно, то со ссылками. А я могу посоветовать http://avr-libc.narod.ru/group__avr__sfr.html Цитата оттуда: "В новых версиях компилятора инструкции манипуляций с битами - sbi/cbi больше не поддерживаются". Может мне станцевать для доходчивости?
IM1, я вам про стандарты уже написал, вы мимо ушей пропустили. Где в ваших стандартах "стандартная" работа с Flash и Eeprom? Может ещё цитату из K&R приведёте? Не может быть гнутый компилятор полностью "стандартным", т.к. архитектура AVR этого не позволяет. Поэтому есть два компилятора: iar cc и gnu cc. Они только частично совместимы, хотя оба пользуются вашими т.н. "стандартами". Что могут от них, то используют, а что не могут - тут уж извините... спускайтесь с небес на Землю.
Инструментарий манипуляции с битами на мк не может не поддерживаться в компиляторе для мк. Это нонсенс, ибо кто будет изменять состояние порта (!), если нужно поменять состояние его бита? Здравый смысл у вас есть? В каком-то ином виде, но пройти мимо инструкций мк манипулирующих битами не получится, ибо вредить самим себе никто не будет. Ещё раз повторяю, если вы пользуетесь PROGMEM'ом или другим его аналогом для указания адреса во Flash или то же с Eeprom, то не говорите мне про какие-то там стандарты. Это нехорошо. Есть компилятор, есть заголовчники к нему. Хотите, чтобы ваши исходники компилировались от одной версии к другой? Тогда используйте только те конструкции, которые определены в этих самых библиотечных заголовочниках, либо пишите конструкции, производные от них. Это и есть и правила, и стандарты для практиков, а не теоретиков чистого Си на гарвардской архитектуре.
Инструментарий манипуляции с битами на мк не может не поддерживаться в компиляторе для мк. Это нонсенс, ибо кто будет изменять состояние порта (!), если нужно поменять состояние его бита? Здравый смысл у вас есть? В каком-то ином виде, но пройти мимо инструкций мк манипулирующих битами не получится, ибо вредить самим себе никто не будет. Ещё раз повторяю, если вы пользуетесь PROGMEM'ом или другим его аналогом для указания адреса во Flash или то же с Eeprom, то не говорите мне про какие-то там стандарты. Это нехорошо. Есть компилятор, есть заголовчники к нему. Хотите, чтобы ваши исходники компилировались от одной версии к другой? Тогда используйте только те конструкции, которые определены в этих самых библиотечных заголовочниках, либо пишите конструкции, производные от них. Это и есть и правила, и стандарты для практиков, а не теоретиков чистого Си на гарвардской архитектуре.
Россия навсегда!
- Сообщения: 134
- Зарегистрирован: Вс авг 01, 2010 16:05:25
CПасибо uni за подробное объяснение.
Помогите вот с этим:
while(!(PINA&0x10));
Компилятор игнорирует этот код,сразу скажу что внеш прерывания все
в дальнейшем будут использоваться. Стоит мне добавить:
volatile unsigned char tt;
-
-
while(!(PINA&0x10)){
tt++;
}
безполезное "tt++" как всё работает. И что мне сделать, оставить tt++, или как то по другому можно решить вопрос?
Помогите вот с этим:
while(!(PINA&0x10));
Компилятор игнорирует этот код,сразу скажу что внеш прерывания все
в дальнейшем будут использоваться. Стоит мне добавить:
volatile unsigned char tt;
-
-
while(!(PINA&0x10)){
tt++;
}
безполезное "tt++" как всё работает. И что мне сделать, оставить tt++, или как то по другому можно решить вопрос?
Не игнорирует:
Код: Выделить всё
00000034 <main>:
#include <avr/io.h>
int main(void)
{
while(!(PINA&0x10));
34: cc 9b sbis 0x19, 4 ; 25
36: fe cf rjmp .-4 ; 0x34 <main>
}
38: 80 e0 ldi r24, 0x00 ; 0
3a: 90 e0 ldi r25, 0x00 ; 0
3c: 08 95 ret
- Сообщения: 134
- Зарегистрирован: Вс авг 01, 2010 16:05:25
Спасибо, а если вот такa_skr писал(а):Не игнорирует:
while(strcmp(sms_ka,">"));
как быть в таком случае, оч надо.


