Проблема с массивами на ARM ADS + LPC2194 Проблема такая. У меня есть прога на Си. Она нормально работает на LPC2194, когда я её компилирую при помощи CARM (Keil). Но когда я её же компилирую на ARM-ADS, начинаются проблемы с UART. Привожу ключевые моменты кода:
typedef struct _RECEIVE_FIFO
{
volatile unsigned char *read_ptr;
volatile unsigned char *write_ptr;
volatile unsigned int count;
unsigned char buffer[REC_BUF_SIZE];
}
RECEIVE_FIFO;
RECEIVE_FIFO receive1;
void init(...)
{
...
receive1.read_ptr=receive1.buffer;
receive1.write_ptr=receive1.buffer;
receive1.count=0;
...
}
__irq void uart1_irq(void)
{
...
unsigned char ch=U1RBR;
if (receive1.count<REC_BUF_SIZE)
{
LED1_ON;
*receive1.write_ptr++=ch;
LED1_OFF;
if (receive1.write_ptr==(receive1.buffer+REC_BUF_SIZE))
receive1.write_ptr=receive1.buffer;
receive1.count++;
}
...
}
unsigned char receive()
{
unsigned char res;
while (receive1.count==0) {}
DIS_UART1_INT;
LED2_ON;
res=*receive1.read_ptr++;
LED2_OFF;
if (receive1.read_ptr==(receive1.buffer+REC_BUF_SIZE))
receive1.read_ptr=receive1.buffer;
receive1.count--;
ENA_UART1_INT;
return res;
}
Сначала проблема была в том, что LED2 никогда не гас, теперь не гаснет LED1, но результат тот же - всё зависает. Останавливается обработка всех прерываний и LPC уходит в астрал. Если бы он проресетился было бы и то не плохо, но он непонятно чем занимается после того как подходит к строчке *receive1.write_ptr++=ch;
Я пробовал другие варианты для организации этого решения, но этот FIFO не получается. Из кучи выделять место под буфер я тоже пробовал. Я разбивал эту строку и не нравится ему именно вот это *receive1.write_ptr=ch; В обработчике uart1_irq никаких Enable Interrupts нет. В программе FIQ не используется, только IRQ прерывания.