20436|47

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

OS_ENTER_CRITICAL()在中断子函数里的调用!!! [复制链接]

用的keil在调试时出现一个问题,
我在Keil的中断里调用了一个函数,
void UART0_Exception(void)//串口中断
{
   
   
    OS_ENTER_CRITICAL();

                        if (QueueRead(&temp, UART0SendBuf) == QUEUE_OK)

//部分代码省略
    VICVectAddr = 0;            // 通知中断控制器中断结束
    OS_EXIT_CRITICAL();
}
然后在中断子函数里又调用了
  uint8 QueueRead(QUEUE_DATA_TYPE *Ret, void *Buf)
{
    if (Buf != NULL)                                            /* 队列是否有效 */
    {                                                           /* 有效 */
  
        OS_ENTER_CRITICAL();
    //部分代码省略   

        }
        OS_EXIT_CRITICAL();
    }
    return err;
}
其中,QueueRead()函数居然与OS_ENTER_CRITICAL();在管理模式下的sp有重复,导致我程序老是undefin,想问一下怎么解决这个问题

最新回复

看不太懂=,=~  详情 回复 发表于 2010-6-23 16:57
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
堆栈空间设置的太小了?
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
或者是你的OS移植不正确.....OS_ENTER_CRITICAL();OS_EXIT_CRITICAL()......可能改变了处理器状态,并且处理的不正确.....猜测....
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
在中断里使用的是中断模式的SP,除非你的代码里强行修改了模式

另外,OS_ENTER_CRITICAL();OS_EXIT_CRITICAL()不要随便用,用它会严重影响系统的实时性;

LPC2000系列偶记得是进中断后,cpu自动禁止中断的,除非你的代码里又打开了(也就是说,你的汇编代码对中断响应进行了特别的设置,支持中断嵌套);
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
如果要允许嵌套中断,ARM建议切换到SYS模式再开放中断....猜测LZ的也是此情况

这个时候对堆栈空间的要求大大提高....如果某个中断很频繁的话,可能导致堆栈溢出而崩溃.....
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

6
 
不是中断堆栈大小的问题,IRQ_Stack_Size  EQU     0x00000200
USR_Stack_Size  EQU     0x00000400
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 3 楼 arnold9009 的回复:
在中断里使用的是中断模式的SP,除非你的代码里强行修改了模式

另外,OS_ENTER_CRITICAL();OS_EXIT_CRITICAL()不要随便用,用它会严重影响系统的实时性;

LPC2000系列偶记得是进中断后,cpu自动禁止中断的,除非你的代码里又打开了(也就是说,你的汇编代码对中断响应进行了特别的设置,支持中断嵌套);


正解~
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
找出问题了,是这样的
Mode_USR        EQU     0x10

MSR     CPSR_c, #Mode_USR
MOV     SP, R0
SUB     SL, SP, #USR_Stack_Size

这样初始化后,user 模式有了SP,但TIMER0中断时,处于system模式下,他的SP跟OS_ENTER_CRITICAL();SP有重复,想问一下是什么原因
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
为什么我的程序进入中断后CPSR = 0x6000009f;为什么处于系统模式下,为什么没有使用中断模式下的堆栈。
还有,如果中断一定要在系统模式下的话,系统模式的堆栈又是怎么初始化的???
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
好像二楼讲对了。。。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
SYS模式其实就是有特权的USR模式....它的寄存器和USR模式是完全一样的,所以它用的是USR模式的堆栈.

当某个应用要允许嵌套中断,就要在进入IRQ模式后,切换到SYS模式,再允许嵌套中断.

至于"QueueRead()函数居然与OS_ENTER_CRITICAL();在管理模式下的sp有重复", 你说的不够清楚.....最好把相关代码贴出来看看......
 
 
 

回复

1

帖子

0

TA的资源

禁止访问

12
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 
学习下
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

14
 
.........学习学习
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 
不明白
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
有点不懂
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

17
 
怎么没有分
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 
学习...
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

19
 
nhxdljhf
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

20
 
学习了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表