Keil MDK ARM 7 新版本 产生错误

haochinh 2013-01-02 03:39:21

Keil MDK ARM 7 新版本 产生错误

最近帮忙维护一个六年前的专案,ARM COMPILER V2.53, 配合 ARM7

当时的开发平台已经不在了,我从 Keil 下载最新的 MDK 4.6

旧的专案完全无法 COMPILER

看的懂的、能改的我已经改了,只剩下 NESTED_INTERRUPT, IENABLE, IDISABLE 这三个难题未解

请有经验的帮帮忙

一开始是 embedded asm 的指令不一样了
#if NESTED_INTERRUPT
#define IENABLE __asm { MRS LR, SPSR } \
__asm { STMFD SP!, {LR} } \
__asm { MSR CPSR_c, #SYS32Mode } \
__asm { STMFD SP!, {LR} }
#else
#define IENABLE ; /* do nothing */
#endif

#if NESTED_INTERRUPT
#define IDISABLE __asm { LDMFD SP!, {LR} } \
__asm { MSR CPSR_c, #(IRQ32Mode|I_Bit) } \
__asm { LDMFD SP!, {LR} } \
__asm { MSR SPSR_cxsf, LR }
#else
#define IDISABLE ; /* do nothing */
#endif

我修改成
#if NESTED_INTERRUPT
#define IENABLE \
__asm { MRS LR, SPSR \
STMFD SP!, {LR} \
MSR CPSR_c, #SYS32Mode \
STMFD SP!, {LR} }

#else
#define IENABLE ; /* do nothing */
#endif

#if NESTED_INTERRUPT
#define IDISABLE \
__asm { LDMFD SP!, {LR} \
// MSR CPSR_c, #(IRQ32Mode|I_Bit) \
MSR CPSR_c, #0x92 \
LDMFD SP!, {LR} \
MSR SPSR_cxsf, LR }

#else
#define IDISABLE ; /* do nothing */
#endif

irq.h 就没有产生错误,但是在每个中断程序中

void Timer0Handler(void) __irq
{
T0IR = 1; // clear interrupt flag
IENABLE; // handles nested interrupt

jiffy++; // update the jiffy timer

IDISABLE;
VICVectAddr = 0; // Acknowledge Interrupt
}

都有使用到 IENABLE IDISABLE 都产生类似的错误
src\Timer.c(30): error: #20: identifier "LR" is undefined
src\Timer.c(30): error: #268: declaration may not appear after executable statement in block
src\Timer.c(30): error: #20: identifier "MSR" is undefined
src\Timer.c(30): error: #10: "#" not expected here
src\Timer.c(30): error: #40: expected an identifier
src\Timer.c(30): error: #40: expected an identifier
src\Timer.c(30): error: #65: expected a ";"

不认识 LR / MSR # 等等指令

※ 中断内的 IENABLE IDISABLE 有什么用处?能不能拿掉?



...全文
421 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ymm198606 2013-01-30
  • 打赏
  • 举报
回复
找个版本低点的,或换成IAR开发环境
LiuMangLuJun 2013-01-23
  • 打赏
  • 举报
回复
老版本更新到新版本确实是个问题
lr2131 2013-01-03
  • 打赏
  • 举报
回复
在汇编文件中写,在C中调用是个可靠稳定的方法。 C嵌汇编似乎有一些限制,没有直接用汇编来的好。 开关中断其实就是用到了软中断。

NoInt	EQU	0x80
NoFIQ	EQU	0x40

IRQDisable
        MRS     R0, SPSR
        ORR     R0, R0, #NoInt
        MSR     SPSR_c, R0
        MOVS    PC, LR

IRQEnable
        MRS   R0, SPSR
        BIC   R0, R0, #NoInt
        MSR   SPSR_c, R0
        MOVS    PC, LR

FIQDisable
        MRS     R0, SPSR
        ORR     R0, R0, #NoFIQ
        MSR     SPSR_c, R0
        MOVS    PC, LR

FIQEnable
        MRS   R0, SPSR
        BIC   R0, R0, #NoFIQ
        MSR   SPSR_c, R0
        MOVS    PC, LR
youzi722 2013-01-02
  • 打赏
  • 举报
回复
禁止全局中断和使能全局中断而已,对jiffy变量进行原子保护,不过你貌似用反了,先使能中断再禁止中断?????? KEIL2中的某些定义在keil4中没有了,你可以在网上找个KEIL3试试 或者这个可以将这两个函数直接写再汇编语言文件中,然后在C语言中调用就可以了

27,520

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧