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

 
 
> 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:31
Сообщение #2


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

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



Ну дык назад они как раз проще вываливают, правда я не разбирался как они обрабатывают пакеты с нечетным количеством байтов...
Ну а что можно требовать от смуглолицых програмеров, начитались книжек по 150$ за штуку и хренячат не разбираясь что как и почем...

In the following pages two location addresses are reported: the one to be used by
application software while accessing the packet memory, and the local one relative to USB
Peripheral access. To obtain the correct STM32F10xxx memory address value to be used in
the application software while accessing the packet memory, the actual memory location
address must be multiplied by two. The first packet memory location is located at
0x4000 6000. The buffer descriptor table entry associated with the USB_EPnR registers is
described below.
Go to the top of the page
 
+Quote Post
klen
сообщение Nov 27 2009, 14:46
Сообщение #3


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

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



Цитата(d__ @ Nov 27 2009, 16:31) *
Ну дык назад они как раз проще вываливают, правда я не разбирался как они обрабатывают пакеты с нечетным количеством байтов...
Ну а что можно требовать от смуглолицых програмеров, начитались книжек по 150$ за штуку и хренячат не разбираясь что как и почем...

с нечетными они лишний байт копируют - никому зло от этого не причиняется.

не книжек не читали . неможет быть чтоб так в книжках писали. хотя батя мне в первом классе стоя с ремнем говорил обо мне - смортишь в книгу, видишь фигу.


переписал таки... вот


код было
Код
void UserToPMABufferCopySTM(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++;
  }
}


стало
Код
void UserToPMABufferCopy(uint16_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
{
  uint32_t n = (wNBytes + 1) >> 1;
  uint32_t *pma = (uint32_t *)((uint32_t)wPMABufAddr * 2 + PMAAddr);
  while(n--)
    *pma++ = *pbUsrBuf++;
}



листинг асм
Код
UserToPMABufferCopy:
    add    r3, r1, #536870912
    add    r1, r3, #12288
    adds    r2, r2, #1
    lsls    r1, r1, #1
    asrs    r2, r2, #1
    movs    r3, #0
    b    .L2
.L3:    ldrh    ip, [r0], #2
    adds    r3, r3, #1
    str    ip, [r1], #4
.L2:    cmp    r3, r2
    bcc    .L3
    bx    lr


Код
UserToPMABufferCopySTM:
    add    r3, r1, #536870912
    add    r1, r3, #12288
    adds    r2, r2, #1
    push    {r4, lr}
    lsls    r1, r1, #1
    asrs    r2, r2, #1
    movs    r3, #0
    b    .L9
.L10:    ldrb    r4, [r0, #-1]    @ zero_extendqisi2
    ldrb    ip, [r0, #-2]    @ zero_extendqisi2
    orr    ip, ip, r4, lsl #8
    strh    ip, [r1, r3, lsl #2]    @ movhi
    adds    r3, r3, #1
.L9:    adds    r0, r0, #2
    cmp    r3, r2
    bcc    .L10
    pop    {r4, pc}


на выходе компиллера не сильно то и большая разница ( 5 иструкций из 17 по размеру, а по скорости подъем и лив двух регистров в стек, то при большом числе байтов теряются на общем фоне ), но зато пусть в меня кинет камнем тот кто скажет что исходник не читается с первого раза!
вот так

гдето когдато я слышал что индусам платят за количество строк ! во как. если так то разработчики железа(еще большей памяти и еще более быстрого процессора) никогда без работы не останутся smile.gif
Go to the top of the page
 
+Quote Post



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

 


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


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