Это фирменные примеры кода "от производителя" NXP-Keil.
Такое ощущение, что один индус портировал под кейл-арм код другого индуса,
который писал на перле для DSP
Файл размером под 50 килобайт вдохновляет изобилием и изощренностью глюков.
Задача под кодовым названием "найди двести ошибок".
Типично:
- Код: Выделить всё • Развернуть
DWORD MCI_Send_ACMD_Bus_Width( DWORD buswidth )
{
DWORD i, retryCount;
DWORD respStatus;
DWORD respValue[4];
retryCount = 0x20; /* reset retry counter */
while ( retryCount > 0 )
{
if ( MCI_Send_ACMD() == FALSE )
{
continue;
}
/* Send ACMD6 command to set the bus width */
MCI_SendCmd( SET_ACMD_BUS_WIDTH, buswidth, EXPECT_SHORT_RESP, 0 );
respStatus = MCI_GetCmdResp( SET_ACMD_BUS_WIDTH, EXPECT_SHORT_RESP, (DWORD *)&respValue[0] );
if ( !respStatus && ((respValue[0] & (0x0F << 8)) == 0x0900) )
{
return ( TRUE ); /* response is back and correct. */
}
for ( i = 0; i < 0x20; i++ );
retryCount--;
}
return( FALSE );
}
Переменная i используется для организации задержки... но компилятор ее оптимизирует, т.к. модификатор volatile тупо забыли. Если функция уходит в continue по первому условию, то RetryCount не работает и все висит.
- Код: Выделить всё • Развернуть
/* Due to reversed H/W logic in the MCB2300 board, the MCI power pin
needs to be configured as GPIO pin that I need to set it active low manually,
once it's set as MCI power pin, it will be active high. */
/*connect MCI signals to P0.19-P0.22, and P2.11-P2.13*/
PINSEL1 = 0x2A80;
PINSEL4 = 0x0A800000;
#if MCB2300_VERSION_0
SCS |= 0x08;
#if 0
PINSEL1 = 0x2280;
PINSEL4 = 0x0A800000;
IODIR0 = 1 << 21; /* MCI_PWR as GPIO output */
IOCLR0 = 1 << 21;
#endif
#else
SCS &= ~0x08;
#if 0
PINSEL1 = 0x2A80;
PINSEL4 = 0x0A800000;
#endif
#endif
Еще один вдохновляющий кусочек из того же файла. PINSEL - это регистр, где выбирается назначение ног порта. В данном случае используется простое присваивание, а не побитные операции, что автоматически отменяет все предыдущие настроки. Очень доставляет условная компиляция (типа тут компилируем, тут не компилируем, тут рыбу заворачивали), и блочные комментарии в каждой второй строке - это практически делает невозможным закомментить кусок кода для отладки.
Вообще, как собственно и следовало ожидать, любой инструмент в руках дикаря - грозное оружие. Так например, встречаются экземпляры кода написанные явно разбирающимися людьми... К сожалению, они настолько сосредоточены на _ЯКОБЫ_ хорошем _СТИЛЕ_ написания программы, что практически убивают прямой смысл программы.
Офигенно, например, вдохновляет практика перечислить директории инклюдов в мэйк-файле. В результате, если тебе нужно найти хеадер, ты будешь его искать по всем каталогам. Ничем, кроме "хорошего стиля программирования" невозможно объяснить славную традицию использовать разные типы в разных файлах - то есть в проекте тупо обьявляются BOOL, DWORD, UINT32, I32U, и даже my_unsigned_int, совершенно невзирая на то что это все одно и то же и портировать под принципиально другую систему это говно никто и никогда не будет (хотя бы просто потому, что файл относится к работе с конкретной периферией конкретного проца). Видимо из "хорошего стиля" растет и практика использования булевских значений:
- Код: Выделить всё • Развернуть
#define TRUE (1)
#define FALSE (0)
При этом охрененно занимательно отлавливать глюки. Почему-то (

) вдруг оказывается, что
- Код: Выделить всё • Развернуть
if (Flag == TRUE) {do_something();}
if (Flag != FALSE) {do_something();}
это два совершенно разных действия.
А вот эта фишка - эта просто классика "хорошего стиля". Человек видимо очень старался, чтобы его код мог работать и так, и сяк, и об косяк... К сожалению, проверить разные комбинации условных дефайнов он не удосужился (хотя, честно говоря, на это не хватило бы и жизни - столько он их там наплодил).
- Код: Выделить всё • Развернуть
#if MCI_DMA_ENABLED
do {
// TODO: avoid copy
memcpy((void *)DMA_SRC, buff, 512);
buff += 512;
GPDMA_INT_TCCLR = 0x01;
GPDMA_INT_ERR_CLR = 0x01;
GPDMA_CH0_SRC = DMA_SRC;
GPDMA_CH0_DEST = DMA_MCIFIFO;
GPDMA_CONFIG = 0x01;
/* Enable DMA channels, little endian */
while ( !(GPDMA_CONFIG & 0x01))
;
/* The burst size is set to 8, the size is 8 bit too. */
/* Terminal Count Int enable */
GPDMA_CH0_CTRL = (DMA_SIZE & 0x0FFF) | (0x04 << 12) | (0x02 << 15)
| (0x02 << 18) | (0x02 << 21) | (1 << 26) | 0x80000000;
//DMA_Move( 0, M2P );
GPDMA_CH0_CFG |= 0x10001 | (0x00 << 1) | (0x04 << 6) | (0x05 << 11);
/* Write, block transfer, DMA, and data length */
DataCtrl |= ((1 << 0) | (1 << 3) | (DATA_BLOCK_LEN << 4));
#else
/* Write, block transfer, and data length */
DataCtrl |= ((1 << 0) | (DATA_BLOCK_LEN << 4));
#endif
MCI_DATA_CTRL = DataCtrl;
for (i = 0; i < 0x10; i++) {
;
}
} while (count--);
Невооруженным глазом видно, что если MCI_DMA_ENABLED не определено, то цикл не открывается, но закрывается...
Честное слово, иногда хочется руки оторвать этим "стилистам".