ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
7 ноября
851926 Топик полностью
sladkoejka (30.06.2018 02:47 - 14:42, просмотров: 483) ответил a55ku на 1.
пробовал даже так:  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)); результат:
sizeof(int) = 2
Установил последнюю версию IAR 8051 10.20. Те-же грабли. Попытался скомпилировать пример мигания светодиодом по таймеру - на IAR не работает. А SDCC мигает. После долгого анализа и сравнения кода, удалось запустить пример и на IAR. Как оказалось, SDCC вставляет код с адреса 6A. А IAR прямо в таблицу прерываний. После добавления пустого обработчика последнего прерывания в таблице (вектор 0x0063), IAR стал размещать код после таблицы векторов прерываний и код заработал. Любопытно, что в IAR код работает, как и предполагалось - мигает с частотой 1 сек. А вот код SDCC почему-то мигает часто, раза в 4-8 быстрей... Может ктото подскажет как заставить IAR не размещать код в таблице прерываний без определения пустого обработчика? Вот собственно пример blink.c: #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(;;); }