OS_ENTER_CRITICAL()在中断子函数里的调用!!!

lyj2009 2009-12-14 04:58:44
加精
用的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,想问一下怎么解决这个问题
...全文
4699 48 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengtao612 2011-06-08
  • 打赏
  • 举报
回复
不是太明白
buhuizheyangba 2010-06-23
  • 打赏
  • 举报
回复
看不太懂=,=~
gzh020 2010-02-04
  • 打赏
  • 举报
回复
学习学习!
jcrsjcrs 2010-01-30
  • 打赏
  • 举报
回复
学习中
jellyabcd 2009-12-30
  • 打赏
  • 举报
回复
KEIL v4可能有问题。
StackUsr是system模式下的堆栈。
R{1} 2009-12-23
  • 打赏
  • 举报
回复
不太懂,帮顶了!
lyj2009 2009-12-22
  • 打赏
  • 举报
回复
好像系统模式的堆栈与用户模式的堆栈不同,用户模式是由 初始化得到的
但系统模式是由下面代码产生的。
AREA Stacks, DATA, NOINIT
StackUsr
正好StackUsr为进入中断的堆栈地址。
xiao_rq 2009-12-22
  • 打赏
  • 举报
回复
好贴!
n915617214m 2009-12-22
  • 打赏
  • 举报
回复
学习
lyj2009 2009-12-22
  • 打赏
  • 举报
回复
我用的是KEIL v4,不是用的ADS,
我解决问题了,给这个StackUsr 一段空间就可以了,但是我在keil所有的.c.s.inc.h里找不到StackUsr。
想知道为什么。。。 我发现中断的堆栈与StackUsr地址一样。为什么。听人家说system与user堆栈共用的。
lyj2009 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 arnold9009 的回复:]
从帖出来的代码看不出问题在哪

usr和sys模式是任务模式,不需要实际的堆栈空间,因为它们使用的都是ucos任务自己的堆栈(创建任务的时候指定的全局数组)
[/Quote]
但是MAIN()没有堆栈呀。他要用USER 模式的堆栈吧。
agel0ver 2009-12-21
  • 打赏
  • 举报
回复
中断向量
Arnold9009 2009-12-21
  • 打赏
  • 举报
回复
从帖出来的代码看不出问题在哪

usr和sys模式是任务模式,不需要实际的堆栈空间,因为它们使用的都是ucos任务自己的堆栈(创建任务的时候指定的全局数组)
lyj2009 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 great_bug 的回复:]
感觉是USR或SYS模式下堆栈操作不对称,导致堆栈破坏,程序崩溃
[/Quote]
为什么会这样。。。我感觉问题就在这里。
lyj2009 2009-12-21
  • 打赏
  • 举报
回复
中断向量表
INCLUDE irq.inc ; Inport the head file 引入头文件

CODE32
PRESERVE8

AREA IRQ,CODE,READONLY


;/* 以下添加中断句柄,用户根据实际情况改变 */
;/* Add interrupt handler here,user could change it as needed */

;/*中断*/
;/*Interrupt*/
IRQ_Handler HANDLER IRQ_Exception


;/*定时器0中断*/
;/*Time0 Interrupt*/
Timer0_Handler HANDLER Timer0_Exception

UART0_Handler HANDLER UART0_Exception

;/*I2C中断*/
I2c_Handler HANDLER I2c_Exception

EINT3_Handler HANDLER EINT3_Exception
END
我觉得可能是
Mode_USR EQU 0x10
; Enter User Mode and set its Stack Pointer
MSR CPSR_c, #Mode_USR
MOV SP, R0
SUB SL, SP, #USR_Stack_Size
是不这里应该不用 0x10哦。
Arnold9009 2009-12-21
  • 打赏
  • 举报
回复
中断向量表贴出来看一下
yongy1978 2009-12-21
  • 打赏
  • 举报
回复
学习了 啊
Great_Bug 2009-12-21
  • 打赏
  • 举报
回复
感觉是USR或SYS模式下堆栈操作不对称,导致堆栈破坏,程序崩溃
xiaosannb 2009-12-20
  • 打赏
  • 举报
回复
.........学习学习
anhei111xl 2009-12-20
  • 打赏
  • 举报
回复
学习下
加载更多回复(26)

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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