|
Вопрос по С по AVR |
|
|
|
 |
Ответов
(1 - 10)
|
Feb 12 2006, 06:08
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(impuls-v @ Feb 12 2006, 03:54)  !( UCSRA & (1<<UDRE)), эта запись обозначает - проинвертировать значение байта прочитанного из UCSRA из которого выделен только бит UDRE. Цитата а точнее 1<<UDRE ведь << это сдвиг регистра влево не регистра, а 1 на некоторое число UDRE. UDRE - константа, которая соответствует позиции бита UDRE в регистре UCSRA.
Сообщение отредактировал defunct - Feb 12 2006, 07:05
|
|
|
|
|
Feb 12 2006, 10:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата(defunct @ Feb 12 2006, 08:08)  Цитата(impuls-v @ Feb 12 2006, 03:54)  !( UCSRA & (1<<UDRE)),
эта запись обозначает - проинвертировать значение байта прочитанного из UCSRA из которого выделен только бит UDRE. Цитата а точнее 1<<UDRE ведь << это сдвиг регистра влево не регистра, а 1 на некоторое число UDRE. UDRE - константа, которая соответствует позиции бита UDRE в регистре UCSRA. ! - логическое НЕ, а не побитовое, т.е. значит "инвертировать логическое значение выражения ( UCSRA & (1<<UDRE))" , что в свою очередь определяется умолчанием, принятым в С для результатов выражений при использовании их как логическое значение - "всё, что не ноль есть единица", точнее TRUE. Не во всех языках такое умолчание есть. Далее UDRE - не просто число, а действительно позиция (по сути номер бита в байте), т.е. (1<<UDRE) обозначает получить маску для сравнения нужного бита в байте. Производится сдвиг левой части (в данном случае 1, но может вполне быть что-то другое  на число, указанное в правой части (UDRE), а не наоборот. Помнится, что в ATmega128 UDRE0 5-й (от 0 до 7) бит в байте UCSR0A, соответственно (1<<UDRE) эквивалентно (1<<5), эквивалентно (0x01<<5), эквивалентно 0x20 (00100000). Соответственно проверка значения регистра на флаг осуществляется путём наложения маски на его значение (побитовое И - зануление всех "ненужных" битов), т.е. UCSRA0 & 0x20 даст число отличное от нуля (а именно 0x20) при установленном 5-м бите (UDRE0), иначе будет нуль. 0 - FALSE, 0x20 - TRUE, соответственно !(FALSE) будет эквивалентно TRUE, и наоборот - !(TRUE) эквивалентно FALSE. Т.е. запись !( UCSRA & (1<<UDRE)) обозначает "не установлен бит UDRE в байте UCSRA".
--------------------
aka Vit
|
|
|
|
|
Feb 14 2006, 12:11
|
Местный
  
Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957

|
Код Function CSTACK RSTACK -------- ------ ------ main 6 4 -> DoEEPROMRead 6 2 -> receive 6 2 -> Set_Mem 6 2 -> Read_Mem1 6 2 -> receive 6 2 -> receive 6 2 -> Read_Mem1 6 2 -> receive 6 2 -> receive 6 2 -> gsb_decoder 6 2 -> strcmp 6 2 -> response_sms 6 2 -> DoEEPROMRead 6 2 -> DoEEPROMWrite 6 2 -> response_sms 6 2 -> response_sms 6 2 -> b_transmit 6 2 -> receive 6 2 -> receive 6 2 Как по этим параметрам правильно задать CSTACK RSTACK в установках IAR
--------------------
Обычно последним смеется тот, кто хуже соображает!
|
|
|
|
|
Feb 16 2006, 08:44
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(Георгий @ Feb 14 2006, 14:11)  Код Function CSTACK RSTACK -------- ------ ------ main 6 4 -> DoEEPROMRead 6 2 -> receive 6 2 -> Set_Mem 6 2 -> Read_Mem1 6 2 -> receive 6 2 -> receive 6 2 -> Read_Mem1 6 2 -> receive 6 2 -> receive 6 2 -> gsb_decoder 6 2 -> strcmp 6 2 -> response_sms 6 2 -> DoEEPROMRead 6 2 -> DoEEPROMWrite 6 2 -> response_sms 6 2 -> response_sms 6 2 -> b_transmit 6 2 -> receive 6 2 -> receive 6 2 Как по этим параметрам правильно задать CSTACK RSTACK в установках IAR Вложенности первого уровня недостаточно. Нужно также учитывать все остальные вложенности, а также прерывания со своими вложенностями. Если сложно вычислять, то можно под стеки отвести всю оставшуюся память в соотношении размеров стеков 3:1 или 4:1. Если и в этом случае не хватит, то надо либо программу перепланировать (запретив, например, вложенные прерывания) либо Вы ошиблись с МК.
|
|
|
|
|
Feb 16 2006, 09:14
|
Участник

Группа: Свой
Сообщений: 25
Регистрация: 2-02-06
Пользователь №: 13 904

|
Как контролтровать стек ? Не знаю как в AVR, но для 51 я делал так: при старте программы, еще до установки stack pointer'a, заполняешь всю область стека специальным кодом, например 0x55. Затем в процессе работы программы (после вызова наиболее вложенных фенкций), идешь с конца стека на начало (в направлении, противоположному росту стека), и там, где специальный код кончается, и есть максимальная вершина стека. Таким образом можно проверять и остальные области памяти, которые выделяет программа в процессе выполнения
|
|
|
|
|
Feb 16 2006, 09:38
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(Георгий @ Feb 16 2006, 10:50)  А второго уровня нет. И памяти вроде хватает, но очень уж критично получается - несколько байт туда-сюда, и можно в стек заехать. Вот и хотелось бы узнать, как ориентироваться по этим данным Если Вы уверены, что никакая из функций, вызываемых из main не вызывает больше никакую другую, даже библиотечную, то установите размеры стеков 12 и 8 байт соответственно. Кроме того, чтобы функция main не вызывалась определьте её с атрибутом __task. Код __task void main() { ; }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|