Ничего себе сколько тут уже понаписали... Вообщем-то вопрос насколько я помню, ставился так: умеет ли RealView работать с FIQ или нет. Оказалось что нет. И вполне понятно, что чтобы полностью использовать все прелести FIQ в данном компиляторе надо писать на ASM.
Тут кто-то просил исходники...
Это что касается обработчика
Код
void i2c_init()
{
PINSEL0 = 0x50; //Switch GPIO to I2C pins
I2C0ADR = SLAVE_ADR;
I2C0CONSET = 0x44;
VICIntSelect = 0x00000200;
//VICVectCntl1 = 0x00000029;
//VICVectAddr1 = (unsigned)I2CISR;
I2C_ENABLE;
}
void I2CISR (void) __irq //I2C interrupt routine
{
...
}
А это в стартапе
Код
FIQ_Addr DCD FIQ_Handler
...
FIQ_Handler B I2CISR
...
IMPORT I2CISR
Так вот, у такого подхода, кроме того что такой обработчик будет вызываться немного быстрее чем просто IRQ, неожиданно появился новый плюс.
В проекте используется операционка RTX от Keil, в которой соответственно используются прерывания от таймера. Мне необходимо записывать во внутреннюю флеш. В IAP в момент записи нужно запрещать прерывания или убирать их в RAM. Однако нужно чтобы I2C все равно работал в момент записи.
В итоге, в теории, чтобы не ковыряться с прерыванием от таймера в RTX, можно запретить все IRQ на время записи/стирания флеша, а обработчик FIQ для I2c поместить в RAM. Кроме того для работы FIQ достаточно в RAM поместить только сам обработчик, так как его адрес лежит в регистре.
Щас попробую све это забацать. Посмотрим как будет работать.