Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 23.07.2010, 18:36  
_grey_
Частый гость
 
Регистрация: 13.12.2006
Сообщений: 47
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
_grey_ на пути к лучшему
По умолчанию Помогите разобраться с кодом

Всех приветствую.

Пытаюсь разобраться с кодом из примеров KEILа, для работы USB в LPC2368.
А именно функция чтения данных из буфера конечной точки.

Код:
 
DWORD USB_ReadEP (DWORD EPNum, BYTE *pData) {
  DWORD cnt, n;

  USB_CTRL = ((EPNum & 0x0F) ‹‹ 2) | CTRL_RD_EN;	
  do {
    cnt = RX_PLENGTH;
  } while ((cnt & PKT_RDY) == 0);
  cnt &= PKT_LNGTH_MASK;			//До этого момента все понятно

  for (n = 0; n ‹ (cnt + 3) / 4; n++) {		//Зачем нужно "(cnt + 3) / 4" ??
    *((__packed DWORD *)pData) = RX_DATA;	//Как работает эта конструкция ? что значит __packed ?
    pData += 4;					//Зачем нужна эта операция ?
  }

  USB_CTRL = 0;

  if (((EP_MSK_ISO ›› EPNum) & 1) == 0) {   /* Non-Isochronous Endpoint */
    WrCmd(CMD_SEL_EP(EPAdr(EPNum)));
    WrCmd(CMD_CLR_BUF);
  }

  return (cnt);
}
Объясните пожалуйста как работает эта функция, что такое __packed, почему такие странные операции с регистром количества байт пакета ((cnt + 3) / 4), зачем pData += 4 и вообще как оно работает?

Прилагаю проект.

Спасибо.
Вложения:
Тип файла: zip USBDev.zip (351.8 Кб, 56 просмотров)
Реклама:
_grey_ вне форума  
Непрочитано 23.07.2010, 19:16  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Помогите разобраться с кодом

Сообщение от _grey_ Посмотреть сообщение
что такое __packed
Расписывать все некогда. _packed означает что данные на которые указывает pData не выровнены по границе слова. *((__packed DWORD *)pData) = RX_DATA; - Реально будет 4 записи по 1 байту.
pData += 4; - потому что указатель BYTE *pData, а читаем мы по 32 бита.
(cnt + 3) / 4 объяснить сложнее. Хотя причина та же - читаем по 4 байта за раз, а cnt в байтах. Если cnt==0, не читаем ничего, если 1,2,3,4 - читаем 1 раз, если 5,6,7,8 - 2 раза. Ну и т.д. Удачи в разборах.
Хотя в такую погоду лучше на природу! Я лично уже вещи собираю

Последний раз редактировалось kison; 23.07.2010 в 19:33.
kison вне форума  
Сказали "Спасибо" kison
_grey_ (23.07.2010)
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Решено] Помогите разобраться с генератором igor1000 Электроника средств транспорта 10 05.07.2010 12:53
mega8 помогите разобраться с кодом AGAT0365 Микроконтроллеры, АЦП, память и т.д 10 27.05.2010 16:08
Помогите разобраться в схеме микросхемы koiah Электроника - это просто 85 14.05.2010 17:53
Помогите разобраться с работой ЖКИ Gonchar Микроконтроллеры, АЦП, память и т.д 8 23.04.2010 17:45
Помогите разобраться с кодом Micro C for AVR deeman30rus Электроника - это просто 7 09.02.2010 11:46


Часовой пояс GMT +4, время: 09:50.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot