ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
26 июня
19710 Топик полностью
Bill (17.01.2005 22:12, просмотров: 1) ответил General на Мне , например, интересно. Помню, Bill выражался насчет "ортогональности" MSP. Или споры насчет RISC/ неRISC. Вот тестирование пусть и покажет обоснованность этих "только 27 простых инструкций" и "аппаратных умножителей" Ху
Прошу прощения, что повторяюсь, но вот маленький пример: Исходный текст стандартной функции
char *strcpy(char *dst, char *src)
	{
	char	*ptr = dst;

	while (*ptr++ = *src++);

	return dst;
	}
Результат трансляции для AVR
      1          char *strcpy(char *dst, char *src)
      2          	{
   \   __nearfunc char *strcpy(char *, char *);
   \                     strcpy:
   \   00000000   2F5B                       MOV     R21,R27
   \   00000002   2F4A                       MOV     R20,R26
   \   00000004   01D9                       MOVW    R27 : R26,R19 : R18
      3          	char	*ptr = dst;
   \   00000006   01F8                       MOVW    R31 : R30,R17 : R16
      4          
      5          	while (*ptr++ = *src++);
   \                     ??strcpy_0:
   \   00000008   912D                       LD      R18,X+
   \   0000000A   9321                       ST      Z+,R18
   \   0000000C   2322                       TST     R18
   \   0000000E   F7E1                       BRNE    ??strcpy_0
      6          
      7          	return dst;
   \   00000010   2FA4                       MOV     R26,R20
   \   00000012   2FB5                       MOV     R27,R21
   \   00000014   9508                       RET
      8          	}

   Maximum stack usage in bytes:

     Function  CSTACK  RSTACK
     --------  ------  ------
     strcpy        0       0 
 
     22 bytes in segment CODE
То же самое для MSP-430
     1          char *strcpy(char *dst, char *src)
   \                     strcpy:
      2          	{
      3          	char	*ptr = dst;
   \   000000   0F4C                 MOV.W   R12, R15
      4          
      5          	while (*ptr++ = *src++);
   \                     ??strcpy_0:
   \   000002   6D4E                 MOV.B   @R14, R13
   \   000004   1E53                 ADD.W   #0x1, R14
   \   000006   CF4D0000             MOV.B   R13, 0(R15)
   \   00000A   1F53                 ADD.W   #0x1, R15
   \   00000C   4D93                 CMP.B   #0x0, R13
   \   00000E   F923                 JNE     ??strcpy_0
      6          
      7          	return dst;
   \   000010   3041                 RET
      8          	}

   Maximum stack usage in bytes:

     Function CSTACK
     -------- ------
     strcpy       2

   Segment part sizes:

     Function/Label Bytes
     -------------- -----
     strcpy           18
Вопросы: Насколько оптимально откомпилированы функции? Нельзя ли их модифицировать с целью увеличения их эффективности? Кто может посчитать их быстродействие, хотя бы время выполнения одного цикла? Если я знаю AVR в достаточной степени я могу ответить относительно AVR, а относительно MSP должен сказать тот, кто знает его лучше. И, специально для борцов за "чистоту" Си. Подобные стандартные библиотечные функции пишут чаще всего на ассемблере. А они иногда играют решающую роль в работе всей программы в целом.