Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-янв-20 02:00

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Строчка СИ
СообщениеДобавлено: 2017-окт-20 13:06 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 39
Уважаемые форумчане, подскажите пожалуйста, что означает такая запись на СИ?
#define RIGHT (0<<14) // PС14
.....
if (!(MDR_PORTC->RXTX & RIGHT))
Я имею в виду вторую строчку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строчка СИ
СообщениеДобавлено: 2017-окт-20 13:31 
Не в сети

Зарегистрирован: 2014-май-15 11:04
Сообщения: 127
Откуда: Москва
Если бит 14 порта не ноль.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строчка СИ
СообщениеДобавлено: 2017-окт-20 14:02 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 39
Большое спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строчка СИ
СообщениеДобавлено: 2017-окт-20 14:06 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 644
Откуда: г. Санкт-Петербург
רגוזין רומאן писал(а):
Если бит 14 порта не ноль.

неверно для #define RIGHT (0<<14) // PС14
для #define RIGHT (1<<14) // PС14
Если бит 14 порта ноль


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строчка СИ
СообщениеДобавлено: 2017-окт-20 16:51 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1043
Откуда: Тула
vladh писал(а):
Уважаемые форумчане, подскажите пожалуйста, что означает такая запись на СИ?
#define RIGHT (0<<14) // PС14
.....
if (!(MDR_PORTC->RXTX & RIGHT))
Я имею в виду вторую строчку.

Эквивалентна while(1).

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

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строчка СИ
СообщениеДобавлено: 2017-окт-21 05:50 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 39
А вот теперь уже становится занятно. 4 человека, 4 мнения. Один человек - бестолковый(я) готов был прислушаться к любому мнению. Двое специалистов высказали диаметрально противоположные мнения и еще появилась 3 версия. Так что же эта строка все таки может значить? Этот пример я взял из учебного пособия И.Н. Огородникова "Микропроцессорная техника: Введение в CORTEX-M3" стр. 62. Я его немного переделал:

#include <MDR32F9Qx_config.h> // Device Startup
#include <MDR32Fx.h> // Device Header
#define RIGHT (0<<14) // PС14
#define LEFT (0<<13) // PС13
#define SEL (0<<10) // PC10
#define VD5 (1<<10) // PD10
#define VD6 (1<<11) // PD11

void frq_init_pll(void); // Объявляем функцию frq_init_pll
void joystick_init(void); // Объявляем функцию joystick_init
void led_on(unsigned short); // Объявляем функцию for led_on
void led_off(unsigned short); // Объявляем функцию led_off
/*------------------------------------------------------------*/
int main (void)
{
//frq_init_pll();
joystick_init();
while (1){
if ((MDR_PORTC->RXTX & RIGHT)) // ???
led_on(1);
else led_off(0);
if (!(MDR_PORTC->RXTX & SEL)) { // SEL
led_on(1);
}
if (!(MDR_PORTC->RXTX & LEFT)) led_on(1); // LEFT
else led_off(1);
}
}
/*------------------------------------------------------------*/
void led_on(unsigned short num)
{
if(num == 0) MDR_PORTD->RXTX |= VD5;
else MDR_PORTD->RXTX |= VD6;
}
void led_off(unsigned short num)
{
if(num == 0) MDR_PORTD->RXTX &= ~VD5;
else MDR_PORTD->RXTX &= ~VD6;
}

void joystick_init (void)
{
//MDR_RST_CLK->PCLK_PORTC | RST_CLK_PCLK_PORTD, ENABLE);
MDR_RST_CLK->PER_CLOCK |=((1<<23)|(1<<24)|(1<<25)); // PORTs: B, C, E
/* PORT C */
MDR_PORTC->OE = ((0<<10)|(0<<13)|(0<<14)); // SEL (PC2)
MDR_PORTC->ANALOG |= ((1<<10)|(1<<13)|(1<<14));
MDR_PORTC->PWR &= ~(((2+1)<<SEL) | 0x00A);
MDR_PORTC->PWR |= (( 2 <<SEL) | 0x005);
MDR_PORTC->RXTX=0xFFFF;
/* PORT D */
MDR_PORTD->OE = ((1<<10)|(1<<11)|(1<<12)); // RIGHT (PB6)
MDR_PORTD->ANALOG |= RIGHT;
MDR_PORTD->PWR &= ~((6+1)<<RIGHT);
MDR_PORTD->PWR |= (6 <<RIGHT);
MDR_PORTD->RXTX=0;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строчка СИ
СообщениеДобавлено: 2017-окт-21 19:29 
Не в сети

Зарегистрирован: 2014-май-15 11:04
Сообщения: 127
Откуда: Москва
Ну кто мешает проверить, то?
Из-за такой ерунды целую тему поднимать...
Код:
#include   <avr/io.h>

#define RIGHT (0<<14) // P?14
volatile uint16_t   b;

int   main   (void)
{
b=0x4000;
  if (!(b & RIGHT))
  {
   b=1; Сюда попадёшь если бит 14=1.
  }
  else
  {
   b=0; Сюда попадёшь если бит 14=0.
  }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строчка СИ
СообщениеДобавлено: 2017-окт-21 23:41 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1043
Откуда: Тула
Так что тут проверять то?
1. Ноль, сдвинутый на любое кол-во разрядов даёт ноль.
2. Логическое И чего угодно с нулём всегда ноль.
3. Поскольку там инверсия то условие всегда истинно и будет выполняться соответствующая истине ветвь.

Ошибки бывают и в банковских системах и в марсоходах, куда там учебным пособиям. (хотя ошибка досадная, обидная, да)

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Строчка СИ
СообщениеДобавлено: 2017-окт-26 01:15 
Не в сети

Зарегистрирован: 2016-окт-14 19:39
Сообщения: 33
Откуда: СПБ
В книжке, кстати, все правильно написано. http://elar.urfu.ru/bitstream/10995/348 ... 1499-7.pdf
Код:

#include <MDR32F9Qx_config.h> // Device Startup
#include <MDR32Fx.h> // Device Header
#define RIGHT (1<<6) // PB6
#define LEFT (1<<3) // PE3
#define SEL (1<<2) // PC2
#define VD1 (1<<1) // PC1
#define VD0 0x001 // PC0

А вот в случае:
Код:
#define RIGHT (0<<14) // PС14
.....
if (!(MDR_PORTC->RXTX & RIGHT))

1 прочитается в никуда регистр RXTX порта PORTC (потому как volatile)
2 выполнится все, что стоит под if, так как выражение равносильно
if(!(x & 0))
что равносильно
if(!0)
что равносильно
if(1)
В общем, бессмыслненная и беспощадная конструкция если #define bla_bla (0 << xxx)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB