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

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

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

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

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

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

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

 
Опции темы

Помогите разобраться с кодом

Непрочитано 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.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
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, время: 02:39.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.