Свежие обсуждения
Микроконтроллеры

Поясните по Си

1 2 8

А какая разница????

 

Вот тут - http://pro-radio.ru/controllers/3473/ все хорошо разжевали про "volatile" .
А так, я больше по С++, а с чистым С и контроллерами дел не имел, но скоро малина придет из Китая и попробую чего-нибудь интересное слепить.

 

>Тоесть слово на слово - OCR0A=255 это встроенная в компилятор команда - так ?

Не совсем. OCR0A - имя регистра. То что туда записано определяет скважность сигнала на выходе.
SET_PWM(х) легче запомнить. Вместо него могло бы быть "УСТАНОВИТЬ_ШИМ(255)".

В AVR Studio тип кристала задается в описании проэкта а не в тексте программы, хотя можно было бы и там.

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

> а что значит ххх_t ? в типе - unit8 как-то понятнее - значит _t это какое-то добавление ?

Ничего не значит. Просто подсказка человеку что это тип а не имя переменной.
unit8 - название произвольное. Где то сказано
#typedef unit8 unsigned char

и теперь компилятор знает что когда видит unit8 надо понимать unsigned char

 

Атрибут volatile используется для объявления переменных, которые могут быть изменены где-то вне обычного русла программы, напр. в обработчике прерывания. Этот атрибут заставляет компилятор всегда брать значение переменной из памяти, а не использовать значение когда-то загруженное в регистр и оставшееся там.
Это гарантирует, что всегда будет использоваться "свежее" значение, а не "прошлогоднее".

Wladimir_TS: а что значит ххх_t ? в типе - unit8 как-то понятнее - значит _t это какое-то добавление ?

Это значит, что данных типы где-то переопределены именно таким образом.
uint8_t равноценно unsigned char

 

Pedantic mode ON:
"uint8_t равноценно unsigned char"

Угу, только это не гарантирует, что это будет 8 бит. В теории верно лишь, что sizeof(char) меньше или равно sizeof (int). Так что может зависеть от аппаратной платформы. Кроме того, поскольку uint8_t это не встроенный тип, то надо поглядеть, что там накорябано в соответствующем typedef.

Блин, что за хрень ? при сохранении смайликов и последовательности символов "меньше, равно" сообщение корежится...

 

> поскольку uint8_t это не встроенный тип, то надо поглядеть, что там накорябано в соответствующем typedef.

А почитать одно сообщение выше?

Skeptic mode ON: можете назвать микроконтроллер с "С" компилятором для которого char не 8 бит?

 

Весьма приличный справочник по С - http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/main.htm
Раздел по типам данных - http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/02/0201.htm
Можно и другие посмотреть:
http://www.c-cpp.ru/
http://c-book-help.narod.ru/

 

Swamp_Dok: я больше по С++

Ужос полный...

"...а красные это скажу я вам вообще полный п....ц" (с) неофициальная озвучка одного известного фильма

alexf58: : можете назвать микроконтроллер с "С" компилятором для которого char не 8 бит?

DSPic - там внутренняя шина данных и регистров большая часть - 32 разряда... и соответственно если мы храним в памяти 8 бит, то отжираем все-равно вчетверо больше, как я понял.

Кстати AVR Studio при хранении констант в памяти программ постоянно пытается использовать по пол ячейки, так как разрядность шины данный памяти программ - 16, а памяти данных - 8...

 

Толи крыша не едет, тоди одно из 2х

#define PORT_(port) PORT ## port
#define DDR_(port) DDR ## port
#define PORT(port) PORT_(port)
#define DDR(port) DDR_(port)
#define SET_DDR(p) DDR(p##_PORT) |= (1p##_BIT)

Можно разжевать сию конструкцию - зачем (1 и 3 строка) переприсваивать друг-другу ?

В тексте программы например есть команда SET_DDR(OCR0B) - это эквивалентно

LDI Rх, $FFh (SER Rx)
OUT OCR0B, Rх

 

Wladimir_TS: 32 разряда... и соответственно если мы храним в памяти 8 бит, то отжираем все-равно вчетверо больше, как я понял.

Это к делу не относится - сколько памяти используется. Результаты операций зависят от типа данных. Некоторые программы написанные на х86 перестают работать на 64 битных ОС потому что логика программы предполагает что int 32 бита, а тут - 64.
Многие архитектуры не могут адресовать память меньше чем слово: обычно 32 бит. Тем не менее тип char никто не отменял. Даже если не упаковывать 4 штуки в одно слово, все равно операции 8 битные.