реклама на сайте
подробности

 
 
> Вопрос по С по AVR
impuls-v
сообщение Feb 12 2006, 01:54
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 130
Регистрация: 15-01-06
Пользователь №: 13 190



Извиняюсь сразу может вопрос показаться глупым. Просто всегда программировал ни ASM а теперь понадобилось перейти на С. Не могу понять что означает запись !( UCSRA & (1<<UDRE)),
а точнее 1<<UDRE ведь << это сдвиг регистра влево, поэтому и непонятно. А тупо использовать без понимания процесса не мой стиль.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
defunct
сообщение Feb 12 2006, 06:08
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Feb 12 2006, 10:28
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 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, но может вполне быть что-то другоеwink.gif на число, указанное в правой части (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
Go to the top of the page
 
+Quote Post
impuls-v
сообщение Feb 14 2006, 11:02
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 130
Регистрация: 15-01-06
Пользователь №: 13 190



Спасибо за разьяснение. Просто упустил тот момент что я сдвигаю(1<<UDRE) не ригистр а 1 на номер регистра.
Ну и чтобы дибить до конца. Если к примеру мне нужно проверить RXC и TXC то я должен записать UCSRA & (3<<TXC).
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 14 2006, 11:23
Сообщение #5


кекс
******

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



Цитата(impuls-v @ Feb 14 2006, 13:02) *
Ну и чтобы дибить до конца. Если к примеру мне нужно проверить RXC и TXC то я должен записать UCSRA & (3<<TXC).


Это у вас получится RXC "или" TXC, но лучше записывать так:
UCSRA & ( (1 << TXC) | ( 1 << RXC) ), чтобы было нагляднее.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Feb 14 2006, 11:26
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Совершенно верно, хотя нагляднее:
UCSRA & ((1<<TXC)|(1<<RXC))


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
Георгий
сообщение Feb 14 2006, 12:11
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 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


--------------------
Обычно последним смеется тот, кто хуже соображает!
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 16 2006, 08:44
Сообщение #8


Шаман
******

Группа: Модераторы
Сообщений: 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.
Если и в этом случае не хватит, то надо либо программу перепланировать (запретив, например, вложенные прерывания) либо Вы ошиблись с МК.
Go to the top of the page
 
+Quote Post
Георгий
сообщение Feb 16 2006, 08:50
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 269
Регистрация: 17-11-05
Из: Киров-Москва
Пользователь №: 10 957



А второго уровня нет. И памяти вроде хватает, но очень уж критично получается - несколько байт туда-сюда, и можно в стек заехать. Вот и хотелось бы узнать, как ориентироваться по этим данным


--------------------
Обычно последним смеется тот, кто хуже соображает!
Go to the top of the page
 
+Quote Post
alm_
сообщение Feb 16 2006, 09:14
Сообщение #10


Участник
*

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



Как контролтровать стек ? Не знаю как в AVR, но для 51 я делал так:
при старте программы, еще до установки stack pointer'a, заполняешь всю область стека специальным кодом, например 0x55. Затем в процессе работы программы (после вызова наиболее вложенных фенкций), идешь с конца стека на начало (в направлении, противоположному росту стека), и там, где специальный код кончается, и есть максимальная вершина стека. Таким образом можно проверять и остальные области памяти, которые выделяет программа в процессе выполнения
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 16 2006, 09:38
Сообщение #11


Шаман
******

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



Цитата(Георгий @ Feb 16 2006, 10:50) *
А второго уровня нет. И памяти вроде хватает, но очень уж критично получается - несколько байт туда-сюда, и можно в стек заехать. Вот и хотелось бы узнать, как ориентироваться по этим данным

Если Вы уверены, что никакая из функций, вызываемых из main не вызывает больше никакую другую, даже библиотечную, то установите размеры стеков 12 и 8 байт соответственно.
Кроме того, чтобы функция main не вызывалась определьте её с атрибутом __task.
Код
__task void main()
{
   ;
}
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016