|
WINAVR: ламерский вопрос |
|
|
|
Feb 11 2008, 11:59
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Господа, помогите тормозящему. Надо получить библиотеку для RS-485 (это я так упражняюсь). Все бы ничего, но есть ножка, переключающая прием/передачу, и расположение ее не определено. Ясно, что #define здесь не годится. Объявление Код extern uint8_t Flow_Port, Flow_Pin_Mask; Тоже неприемлемо, потому что мы пытаемся получить инструкции sbi/cbi Значит, надо объявить extern inline функцию. Как правильно это сделать - не могу найти. Помогите,пожалуйста.
|
|
|
|
|
 |
Ответов
|
Feb 11 2008, 12:42
|

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

|
Цитата(_Pasha @ Feb 11 2008, 13:59)  Все бы ничего, но есть ножка, переключающая прием/передачу, и расположение ее не определено. Очень полезные макросы. Чуть-чуть поправить #ifdef и будут работать с avr-gcc. А вот тут они же, но уже под avr-gcc, спасибо сказать ReAlу
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 11 2008, 13:10
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Сергей Борщ @ Feb 11 2008, 15:42)  Очень полезные макросы... Спасибо, но я имел ввиду чуть другое. Хотел отвязаться от порядка компиляции модулей, из-за чего не хочется пользоваться макросом. Так, чтобы линкер подставил то ,что надо, а именно Flow_Port |=(1<<Flow_Pin); . Например: Код extern void Flow_Rx(void); // как ее правильно inline описать в главном модуле? ISR (UART_TX_vect) { Flow_Rx(); /*чтобы здесь оказалось Flow_Port &= ~(1<<Flow_Pin); без пролога/эпилога и вообще вызова подпрограммы*/ } Может, это вообще невозможно? А макросы великолепные.
Сообщение отредактировал _Pasha - Feb 11 2008, 13:14
|
|
|
|
|
Feb 12 2008, 10:46
|

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

|
Цитата(_Pasha @ Feb 11 2008, 15:10)  Спасибо, но я имел ввиду чуть другое. Хотел отвязаться от порядка компиляции модулей, из-за чего не хочется пользоваться макросом. Так, чтобы линкер подставил то ,что надо, а именно Flow_Port |=(1<<Flow_Pin); . Так вам не нужно это выносить в функцию. Вместо описания отдельных Flow_Port и Flow_Pin сделайте Код #define FLOW_PIN D,4,H // PORTD.4 переключает направление
ISR (UART_TX_vect) { off(FLOW_PIN); /*здесь как раз и окажется PORTD &= ~(1<<4); без пролога/эпилога и вообще вызова подпрограммы*/ ......... on(FLOW_PIN); /*а здесь PORTD |= (1<<4); без пролога/эпилога и вообще вызова подпрограммы*/ } А чтобы сделать что-то "без пролога/эпилога и вообще вызова подпрограммы", функцию можно определить как static inline __attribute__((__always_inline__)).
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 13 2008, 08:57
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Сергей Борщ @ Feb 12 2008, 13:46)  А чтобы сделать что-то "без пролога/эпилога и вообще вызова подпрограммы", функцию можно определить как static inline __attribute__((__always_inline__)). Дык с этим аттрибутом Winavr все равно умудряется иногда сформировать подпрограмму. Когда подключал работу с eeprom, заметил это, хотя чтение вызывалось всего один раз. Поэтому не стал разбираться, а задал вопрос. Повторюсь, что вопрос вызван ошибкой в проектировании и явился следствием долгого писания на асме. ИМХО, правильная портируемая библиотека должна на своем нижнем уровне, работающем с железом, как раз и иметь все варианты через #ifdef..#endif, следовательно, подлежать самой частой перекомпиляции. На примере с RS-485 на данном уровне достаточно экспортировать функции настройки / работы с буферами, на котором сидят прерывания / единую кодировку ошибок. И все это с выбором номера порта. А протоколы - это уже другая песнь, но если не хватает ресурсов, проще, например, работу с 9-ти битной адресацией МК, мультимастеры и прочие дебри решать на данном "полужелезном" уровне. В данном случае "нисходящее проектирования" - отличный способ водить себя за нос, как сказал бы Эйнштейн.
|
|
|
|
Сообщений в этой теме
_Pasha WINAVR: ламерский вопрос Feb 11 2008, 11:59   AHTOXA Цитата(Сергей Борщ @ Feb 12 2008, 15:46) ... Feb 12 2008, 16:48    Сергей Борщ Цитата(AHTOXA @ Feb 12 2008, 18:48) Так в... Feb 12 2008, 17:14     AHTOXA Цитата(Сергей Борщ @ Feb 12 2008, 22:14) ... Feb 12 2008, 17:38      Сергей Борщ Цитата(AHTOXA @ Feb 12 2008, 19:38) То ес... Feb 12 2008, 18:03       AHTOXA Цитата(Сергей Борщ @ Feb 12 2008, 23:03) ... Feb 12 2008, 18:53        Сергей Борщ Цитата(AHTOXA @ Feb 12 2008, 20:53) Так э... Feb 12 2008, 20:48         AHTOXA Цитата(Сергей Борщ @ Feb 13 2008, 01:48) ... Feb 12 2008, 21:11          Сергей Борщ Цитата(AHTOXA @ Feb 12 2008, 23:11) Дык, ... Feb 13 2008, 08:33           AHTOXA Цитата(Сергей Борщ @ Feb 13 2008, 13:33) ... Feb 13 2008, 08:55         AHTOXA Цитата(Сергей Борщ @ Feb 13 2008, 01:48) ... Feb 13 2008, 10:49          Сергей Борщ Цитата(AHTOXA @ Feb 13 2008, 12:49) Вылет... Feb 13 2008, 13:06           AHTOXA Цитата(Сергей Борщ @ Feb 13 2008, 18:06) ... Feb 13 2008, 14:13            gotty Цитата(AHTOXA @ Feb 13 2008, 16:13) Ну и ... Feb 13 2008, 14:31            Сергей Борщ Цитата(AHTOXA @ Feb 13 2008, 16:13) А где... Feb 13 2008, 14:48    Сергей Борщ Цитата(_Pasha @ Feb 13 2008, 10:57) Дык с... Feb 13 2008, 10:25 _Pasha Подумал и понял свою ошибку.
Это ошибка анализа за... Feb 11 2008, 16:57
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|