Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Ответ:
Отправлено
Юрий_СВ (213.5.199.158) 23 февраля 2011, г. 17:28
В ответ на:
Ответ: отправлено
Oleg_IT 23 февраля 2011, г. 16:57
1) Кстати, по возможности, если переменная имеет неиспользуемые значения (для FlagTx_0 это 2-255) отсекайте их в сравнении. Не пишите "==" - пишите "<=", ">=". В Си делают тоже самое. В данном случае лучше использовать стандартный подъод Си (if (FlagTx_0) или if (!FlagTx_0)). Для логических переменных сравнение всегда с нулём ("==", "!="), но не с "1".
4)Опереция PORTF &=~ (1 << 0); - это, как минимум, 3 команнды:
IN(LD)
AND
OUT(ST)
Может быть и более (загрузка константы и адресов(для ST)).
Прерывание может произойти между любыми из этих команд.
Т.е., н-р, в StartTX_0(void) выполнилась команда IN(LD) (сохранили старое значение бит1), происходит прерывание ISR (USART3_UDRE_vect) - бит1 поменялся, а по команде OUT(ST) он затрётся старым (сохранённым) значением. При чём затираться будет иногда (именно при попаданиях прерывания на время исполнения этой опериции в фоне).
:) Естественно, в прерывании критическая секция не нужна - прерывания там и так запрещены (т.к. вы не используете вложенные прерывания).
А если вы ставите в прерывании SEI - то у вас могут появиться вложенные прерывания - тогда всё ещё хуже - все ваши "и/или" аукнутся по той же причине (п.4)
Составить ответ | Вернуться на конференцию
Ответы
- Ответ: - Oleg_IT (23.02.2011, 18:02:58 188.123.240.44, 448 байт)