Разбираюсь тут почему у меня не работает 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;
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);
}
{
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
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
Неправ я, ИАР или Чан? В аттаче проекты для студии и иара.
Спасибо.
Нажмите для просмотра прикрепленного файла

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