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

 
 
> STM32_USB-FS-Device_Driver usb_mem.c, функции в usb_mem.c
klen
сообщение Nov 27 2009, 12:28
Сообщение #1


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Это код исходника

от кода в циклах у меня шерсть дыбом встает. у компиллера кстате тоже.
это можно написать по простому а не так заумно?

сижу - гадаю, тодлько у меня отторжение вызовет это или нет smile.gif
есть ощущение что как пойму че тут имели ввиду c указателями перепишу на асме smile.gif
по логике всегото - перекопировать байты из одного место в другое.. но как витиевато, с двумя временными переменными! изготовлено то...



Код
/*******************************************************************************
* Function Name  : UserToPMABufferCopy
* Description    : Copy a buffer from user memory area to packet memory area (PMA)
* Input          : - pbUsrBuf: pointer to user memory area.
*                  - wPMABufAddr: address into PMA.
*                  - wNBytes: no. of bytes to be copied.
* Output         : None.
* Return         : None    .
*******************************************************************************/
void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
{
  uint32_t n = (wNBytes + 1) >> 1;   /* n = (wNBytes + 1) / 2 */
  uint32_t i, temp1, temp2;
  uint16_t *pdwVal;
  pdwVal = (uint16_t *)(wPMABufAddr * 2 + PMAAddr);
  for (i = n; i != 0; i--)
  {
    temp1 = (uint16_t) * pbUsrBuf;
    pbUsrBuf++;
    temp2 = temp1 | (uint16_t) * pbUsrBuf << 8;
    *pdwVal++ = temp2;
    pdwVal++;
    pbUsrBuf++;
  }
}
/*******************************************************************************
* Function Name  : PMAToUserBufferCopy
* Description    : Copy a buffer from user memory area to packet memory area (PMA)
* Input          : - pbUsrBuf    = pointer to user memory area.
*                  - wPMABufAddr = address into PMA.
*                  - wNBytes     = no. of bytes to be copied.
* Output         : None.
* Return         : None.
*******************************************************************************/
void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
{
  uint32_t n = (wNBytes + 1) >> 1;/* /2*/
  uint32_t i;
  uint32_t *pdwVal;
  pdwVal = (uint32_t *)(wPMABufAddr * 2 + PMAAddr);
  for (i = n; i != 0; i--)
  {
    *(uint16_t*)pbUsrBuf++ = *pdwVal++;
    pbUsrBuf++;
  }
}
/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
d__
сообщение Nov 27 2009, 13:12
Сообщение #2


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

Группа: Свой
Сообщений: 197
Регистрация: 26-08-04
Пользователь №: 548



Конечно кривовато написано, но вся фишка состоит в том, что усеровский буфер байтный, а PMAшный вордный. вот он перепаковывает байты в слова, а потом слова вытаcкивает на выход. И наоборот. Скорее всего побайтное обращение в PMA буфер не допускается. Прямых аналогоф таких функций в стандартной библиотеке не наблюдается...

isochronous and double-buffered
bulk endpoints have special handling of packet buffers (Refer to Section 17.5.4: Isochronous
transfers and Section 17.5.3: Double-buffered endpoints respectively).
Go to the top of the page
 
+Quote Post
klen
сообщение Nov 27 2009, 13:26
Сообщение #3


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



ну а копировать тупо uint16_t без всякого шаманства? юзеровский это ведь на RAM, туда можно тыкатся 8,16,32 бита, как нравится от сутуации, объявить указатель на pbUsrBuf как uint16_t*, в случае если число байтов в копировании нечетное то один в виде хвостика крайнего полуслова пролетит. разве не получится?

щас пробывать буду. если USB отвалится значит неправильно сделал! если нет то сравню на скольк мой менее кривее чем STMовский
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 11th August 2025 - 23:59
Рейтинг@Mail.ru


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