ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
1 июля
67800
3m-soft (04.09.2006 12:16, просмотров: 2821)
Проблема с массивами на 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 прерывания.