error: #20: identifier "LR" is undefined

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

error: #20: identifier "LR" is undefined

Сообщение iv_mic » 16 сен 2009, 00:52

Привет всем.
Я начинаю только программировать на микроконтроллерах. Сейчас пишу на "С" в мVision 3 (Keil) RealView Compiler для LPC2148 на MCD2140. "UART0, UART1 управляемые прерыванием".
Как образец, дали чужой проект для LPC2129.
Чужой проект при компиляции без ошибок.
Мой же выдает ошибку , где Macros for Interrupt Nesting
Код: Выделить всё
// Macros for Interrupt Nesting
#define IENABLE                                    /* Nested Interrupts Entry */ \
__asm                                                                           \
{                                                                               \
  MRS LR, SPSR                                                                   \
}                               /* Copy SPSR_irq to LR     */                   \
__asm                                                                           \
{                                                                               \
  STMFD SP!,                                                                     \
  {                                                                              \
   LR                                                                            \
  }                                                                              \
}                               /* Save SPSR_irq           */                   \
__asm                                                                           \
{                                                                               \
  MSR CPSR_c, #0x1F                                                              \
}                               /* Enable IRQ (Sys Mode)   */                   \
__asm                                                                           \
{                                                                               \
  STMFD SP!,                                                                     \
  {                                                                              \
   LR                                                                            \
  }                                                                              \
}                               /* Save LR                 */


#define IDISABLE                 /* Nested Interrupts Exit */  \
__asm                                                         \
{                                                             \
  LDMFD SP!,                                                   \
  {                                                            \
   LR                                                          \
  }                                                            \
}                               /* Restore LR              */ \
__asm                                                         \
{                                                             \
  MSR CPSR_c, #0x92                                            \
}                               /* Disable IRQ (IRQ Mode)  */ \
__asm                                                         \
{                                                             \
  LDMFD SP!,                                                   \
  {                                                            \
   LR                                                          \
  }                                                            \
}                               /* Restore SPSR_irq to LR  */ \
__asm                                                         \
{                                                             \
  MSR SPSR_cxsf, LR                                            \
}                               /* Copy LR to SPSR_irq     */ \
                                                               \



Ошибка:

Код: Выделить всё
uart0.c(132): error:  #20: identifier "LR" is undefined
uart0.c(132): error:  #20: identifier "SP" is undefined
uart0.c(132): error:  #20: identifier "LR" is undefined
uart0.c(132): warning:  #1287-D: LDM/STM instruction may be expanded
uart0.c(132): error:  #20: identifier "SP" is undefined
...........


Чужой работает, тк в "Project->Manage->Components Environment und Books" во вкладке "Folders/Extensions" стоит галочка на "Use Setting For TOLLS.INI". (в моем же галочка где "_Use RealView Compiler")
Галку переставить невозможно. Только если открыть чужой проект и тут же создать новый, то галочка будет у "Use Setting For TOLLS.INI". При компиляции уже прежней ошибки нет, но ошибки на Startup.s.

Помогите.....
Как управлять UART прерыванием, используя IENABLE и IDISABLE с asm Macros for Interrupt Nesting.

Спасибо.
iv_mic
 
Сообщения: 3
Зарегистрирован: 15 сен 2009, 22:40
Откуда: pensa

Re: error: #20: identifier "LR" is undefined

Сообщение galex1981 » 16 сен 2009, 01:34

Определения макросов LR и SP не находит. Посмотри откуда они в примерах берутся. По уарту пока пользовался обычной отправкой/приемом данных...
if(!Operate) Read(pDatasheet);
Аватара пользователя
galex1981
 
Сообщения: 4363
Зарегистрирован: 04 дек 2008, 22:44
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович

Re: error: #20: identifier "LR" is undefined

Сообщение iv_mic » 16 сен 2009, 23:11

Вот сделал так. Покритикуйте....

Код: Выделить всё
.....
void ienable1() /* Nested Interrupts Entry */
{
    unsigned int spReg, lrReg, pcReg;
    __asm
    {
   MOV spReg, __current_sp()
        MOV pcReg, __current_pc()
        MOV lrReg, __return_address()

            
   MRS lrReg, SPSR     
   STMFD spReg!, {lrReg}                                               
   MSR CPSR_c, #0x1F                                 
   STMFD spReg!, {lrReg}         
     
    }
   
}


void idisable1()
{
    unsigned int spReg, lrReg, pcReg;
    __asm
    {
   MOV spReg, __current_sp()
        MOV pcReg, __current_pc()
        MOV lrReg, __return_address()

   LDMFD spReg!, {lrReg}   
        MSR CPSR_c, #0x92       
        LDMFD spReg!,{lrReg}                     
        MSR SPSR_cxsf, lrReg    
   
    }
   
}
.....
iv_mic
 
Сообщения: 3
Зарегистрирован: 15 сен 2009, 22:40
Откуда: pensa

Re: error: #20: identifier "LR" is undefined

Сообщение galex1981 » 16 сен 2009, 23:19

А что критиковать? Главное работало бы ;)
if(!Operate) Read(pDatasheet);
Аватара пользователя
galex1981
 
Сообщения: 4363
Зарегистрирован: 04 дек 2008, 22:44
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9