Здравствуйте.
Разбираюсь тут почему у меня не работает FatFs с некоторыми флешками... в общем проблему локализовал до неправильной работы макроса LD_DWORD(ptr), который объявлен в ff.h последней версии FatFs (в предыдущих версиях тоже есть этот макрос и флешка у меня тоже не работала).
Версия ИАР
4.21.2 (4.21.2.50066) для MSP430.
Итак проблема:
Есть вот такой вот макрос
Код
#define    LD_DWORD(ptr)        (DWORD)(((DWORD)*(BYTE*)((ptr)+3)<<24)|((DWORD)*(BYTE*)((ptr)+2)<<16)|((WORD)*(BYTE*)((ptr)+1)<<8)|*(BYTE*)(ptr))

Нелюбитель я макросов, особенно таких забубенистых, но писал не я. Смысл макроса прост, побайтно считать 4 байта начиная с указанного адреса и положить в 32 битовую переменную. Нужные типы данных для 16 битового МСП4301611 я определил как:
Код
typedef signed char INT8;
typedef signed short INT16;
typedef signed long INT32;
typedef signed long long INT64;

typedef unsigned char UINT8;
typedef unsigned short UINT16;
typedef unsigned long UINT32;
typedef unsigned long long UINT64;


/* These types must be 8-bit integer */
typedef UINT8    UCHAR;
typedef UINT8    BYTE;

/* These types must be 16-bit integer */
typedef INT16    SHORT;
typedef UINT16    USHORT;
typedef INT16    WORD;

/* These types must be 32-bit integer */
typedef INT32    LONG;
typedef UINT32    ULONG;
typedef UINT32    DWORD;

И вот имею следующий простецкий код:
Код
void main()
{
UINT8 arr[4] = {0, 0xCA, 3, 0};
UINT32 test = LD_DWORD(arr);
}

Ожидаю увидеть в переменной test число 0x0003CA00. И действительно, запустив такой код на VC++, вижу правильное число. А вот ИАР на точно такой же код выдает 0xFFFFCA00! Оптимизация роли не играет, никак не работает.
При этом код ассемблерные генерируется как (оптимизация минимальная):
Код
004016    8221               sub.w   #0x4,SP
UINT8 arr[4] = {0, 0xCA, 3, 0};
004018    403F 4000          mov.w   #0x4000,R15
00401C    4FF1 0000          mov.b   @R15+,0x0(SP)
004020    4FF1 0001          mov.b   @R15+,0x1(SP)
004024    4FF1 0002          mov.b   @R15+,0x2(SP)
004028    4FF1 0003          mov.b   @R15+,0x3(SP)
UINT32 test = LD_DWORD(arr);
00402C    4168               mov.b   @SP,R8
00402E    4848               mov.b   R8,R8
004030    415A 0001          mov.b   0x1(SP),R10
004034    4A4A               mov.b   R10,R10
004036    F03A 00FF          and.w   #0xFF,R10
00403A    108A               swpb    R10
00403C    4A0B               mov.w   R10,R11
00403E    E33B               inv.w   R11
004040    5B0B               rla.w   R11
004042    7B0B               subc.w  R11,R11
004044    415C 0002          mov.b   0x2(SP),R12
004048    4C4C               mov.b   R12,R12
00404A    430D               clr.w   R13
00404C    4C0D               mov.w   R12,R13
00404E    430C               clr.w   R12
004050    415E 0003          mov.b   0x3(SP),R14
004054    4E4E               mov.b   R14,R14
004056    430F               clr.w   R15
004058    F03E 00FF          and.w   #0xFF,R14
00405C    108E               swpb    R14
00405E    4E0F               mov.w   R14,R15
004060    430E               clr.w   R14
004062    DC0E               bis.w   R12,R14
004064    DD0F               bis.w   R13,R15
004066    DA0E               bis.w   R10,R14
004068    DB0F               bis.w   R11,R15
00406A    D80E               bis.w   R8,R14
while(1);
00406C    3FFF               jmp     0x406C


Неправ я, ИАР или Чан? В аттаче проекты для студии и иара.
Спасибо.
Нажмите для просмотра прикрепленного файла

blush.gif
Разобрался. WORD должен быть unsigned , а не signed .
Когда BYTE определял почему-то сразу в мозг засело, что бесзнаковый, а тут...
В общем сорри за беспокойство.