пробовал даже так:
int sizeofInt = sizeof(int);
printf("sizeof(int) = %i\r\n", sizeofInt);
и так:
printf("sizeof(int) = %i\r\n", 1234);
результат одинаковый, значение не выводится, портится текст.
2. stdint.h в IAR 8051 10.10 почему-то нету, есть только stdbool.h
Добавлено:
Любопытно, что такой вариант работает нормально:
printf("sizeof(int) = %d\r\n", sizeof(int));
результат:
#include <stdbool.h>
//------------------------------------------------------------------------------
#ifdef __IAR_SYSTEMS_ICC__
__sfr __no_init volatile unsigned char IOA @0x80;
__sfr __no_init volatile unsigned char OEA @0xb2;
__sfr __no_init volatile unsigned char TCON @0x88;
__sfr __no_init volatile unsigned char TMOD @0x89;
__sfr __no_init volatile unsigned char TL0 @0x8a;
__sfr __no_init volatile unsigned char TH0 @0x8c;
__sfr __no_init volatile unsigned char CKCON @0x8e;
__sfr __no_init volatile unsigned char IE @0xa8;
#else // SDCC
__sfr __at(0x80) IOA;
__sfr __at(0xb2) OEA;
__sfr __at(0x88) TCON;
__sfr __at(0x89) TMOD;
__sfr __at(0x8a) TL0;
__sfr __at(0x8c) TH0;
__sfr __at(0x8e) CKCON;
__sfr __at(0xa8) IE;
#endif
#define TF0_int 0x0B
#define TCON_TR0 0x10
//------------------------------------------------------------------------------
#ifdef __IAR_SYSTEMS_ICC__
// Без этого обработчика IAR размещает код в таблице векторов прерываний и код почему-то не работает
#pragma vector=0x0063
__interrupt __root void IntHandler_INT6pin(void)
{
}
#endif
volatile unsigned int _tickCounter;
#ifdef __IAR_SYSTEMS_ICC__
#pragma vector=TF0_int
__interrupt __root void IntHandler_Timer0(void)
#else
void IntHandler_Timer0(void) __interrupt(1)
#endif
{
TH0 = (65536 - 1000) / 256;
TL0 = (65536 - 1000) % 256;
_tickCounter++;
if (_tickCounter >= 1000)
{
_tickCounter = 0;
IOA ^= 0x03;
}
}
void main(void)
{
_tickCounter = 0;
// Configure timer 1000 ticks per second
TMOD = 0x01;
CKCON = 0x00;
TH0 = (65536 - 1000) / 256;
TL0 = (65536 - 1000) % 256;
IE |= 0x82;
TCON |= TCON_TR0; // Start timer
OEA=0x03; // port A as output
IOA=0x01;
for(;;);
}
sizeof(int) = 2Установил последнюю версию IAR 8051 10.20. Те-же грабли. Попытался скомпилировать пример мигания светодиодом по таймеру - на IAR не работает. А SDCC мигает. После долгого анализа и сравнения кода, удалось запустить пример и на IAR. Как оказалось, SDCC вставляет код с адреса 6A. А IAR прямо в таблицу прерываний. После добавления пустого обработчика последнего прерывания в таблице (вектор 0x0063), IAR стал размещать код после таблицы векторов прерываний и код заработал. Любопытно, что в IAR код работает, как и предполагалось - мигает с частотой 1 сек. А вот код SDCC почему-то мигает часто, раза в 4-8 быстрей... Может ктото подскажет как заставить IAR не размещать код в таблице прерываний без определения пустого обработчика? Вот собственно пример blink.c: