Во первых ваш пример ничего не делает, поэтому понять работает он или нет на железе нет возможности. Во вторых (читать внутри)... Во вторых USB прерывание обрабатывается не так. По вектору прерывания USB нужно поставить LJMP на адрес новой таблицы прерываний. В новой таблице прерываний будут вектора обработки прерываний от USB. IAR это по сути из си не поддерживает.
В третьих вот простейший код мигания светодиодом на на си (два светодиода на младших битах IOA):
#include <ioCY7C68013A.h>
#include <intrinsics.h>
void delay(unsigned long n)
{
while( n-- > 0 )
__no_operation();
}
void main( void )
{
SOEA = 0x03; // Enable Port A Pins: 0, 1 (LED0 & LED1)
IOA = 0x03; // LED0 & LED1 off
for (;;)
{
IOA = 0x02; // LED0 on
delay(10000);
IOA = 0x03; // LED0 off
delay(10000);
}
}
На реальном железе этот код включает LED0 и навсегда уходит в анабиоз.
Если добавить в проект ассемблерный файл следующего содержания fix.s51:
COMMON INTVEC:CODE:ROOT(0)
ORG 0x006A
SJMP $
END
то код на реальном железе начинает работать и мигает светодиодом примерно с частотой 2 Гц.
Обращаю внимание что в асм модуле стоит SJMP на себя, т.е. вечный цикл.
В случае необработанного прерывания код навсегда зависнет.
Интересно узнать Ваше мнение в чём причина такого поведения? :)