23

帖子

0

TA的资源

一粒金砂(初级)

21
 
dfdfdfdfd

回复

1

帖子

0

TA的资源

一粒金砂(初级)

22
 
up
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

23
 
学习了
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

24
 
dddddddddddddddddddddddddddddddddd
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

25
 
帮顶~~~~~~~~~~~~~~
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

26
 
首先这是 startup.s  下的文件。
UND_Stack_Size  EQU     0x00000000
SVC_Stack_Size  EQU     0x00000080
ABT_Stack_Size  EQU     0x00000000
FIQ_Stack_Size  EQU     0x00000000
IRQ_Stack_Size  EQU     0x00000200
USR_Stack_Size  EQU     0x00000500

               LDR     R0, =Stack_Top              

;  Enter Undefined Instruction Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #UND_Stack_Size

;  Enter Abort Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #ABT_Stack_Size

;  Enter FIQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #FIQ_Stack_Size

;  Enter IRQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #IRQ_Stack_Size

;  Enter Supervisor Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #SVC_Stack_Size

运行时Stack_Top =IRQ stack top =0x40002178;
Supervisor Mode stack top = 0x40001f78;
user mode stack top = 0x40001ef8;
串口中断程序如下
void UART0_Exception(void)
{
    uint8 IIR, temp;
   
    OS_ENTER_CRITICAL();

    while(((IIR = U0IIR) & 0x01) == 0)
    {                                                   /* 有中断未处理完 */
        switch (IIR & 0x0e)
        {
            case 0x02:                                  /* THRE中断    */
                //for (i = 0; i < UART0_FIFO_LENGTH; i++) /* 向发送FIFO填充数据 */
               // {
                    if (QueueRead(&temp, UART0SendBuf) == QUEUE_OK)
                    {
                        U0THR = temp;
                    }
                    else
                    {
                        U0IER = U0IER & (~0x02);        /* 队列空,则禁止发送中断 */
                    }
               // }
                break;
            case 0x04:                                  /* 接收数据可用 */
            case 0x0c:                                  /* 字符超时指示 */
                do                                      /* 读取FIFO全部数据 */
                {
                        QueueWrite((void *)UART0_ReceiveBuf,U0RBR);
                }while((U0LSR & 0x00000001) != 0);
                                OSSemPost(Uart0Sem);
                break;
            case 0x06:
                    temp = U0LSR;
                    break;
            default :
                break;
        }
    }
    VICVectAddr = 0;            // 通知中断控制器中断结束
    OS_EXIT_CRITICAL();
}
在进入串口中断时SP = 0x400021e8;mode为 system;
子函数
  uint8 QueueRead(QUEUE_DATA_TYPE *Ret, void *Buf)
{
    uint8 err;
    DataQueue *Queue;

    err = NOT_OK;
    if (Buf != NULL)                                            /* 队列是否有效 */
    {                                                           /* 有效 */
        Queue = (DataQueue *)Buf;
        
        OS_ENTER_CRITICAL();
        
        if (Queue->NData > 0)                                   /* 队列是否为空 */
        {                                                       /* 不空         */
            *Ret = Queue->Out[0];                               /* 数据出队     */
            Queue->Out++;                                       /* 调整出队指针 */
            if (Queue->Out >= Queue->End)
            {
                Queue->Out = Queue->Buf;
            }
            Queue->NData--;                                     /* 数据减少      */
            err = QUEUE_OK;
        }
        else
        {                                                       /* 空              */
            err = QUEUE_EMPTY;
            if (Queue->ReadEmpty != NULL)                       /* 调用用户处理函数 */
            {
                err = Queue->ReadEmpty(Ret, Queue);
            }
        }
        OS_EXIT_CRITICAL();
    }
    return err;
}
在进入上面函数的OS_ENTER_CRITICAL();时
首先经过软中断
;软件中断
SoftwareInterrupt
        LDR     SP, StackSvc            ; 重新设置堆栈指针
        STMFD   SP!, {R0-R3, R12, LR}
        MOV     R1, SP                  ; R1指向参数存储位置
stackSvc = 0x400021f4;
而中断堆栈也是0x400021e8;这两个堆栈在运行过程中重叠。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

27
 
中断堆栈是0x400021e8既不属于中断模式的堆栈,也不属于用户模式的。为什么?
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

28
 
SoftwareInterrupt
        LDR    SP, StackSvc            ; 重新设置堆栈指针
------------------
这里的"StackSvc"是怎样的一个东西?.....有可能问题就了出在它身上.......
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

29
 
引用 26 楼 lyj2009 的回复:
中断堆栈是0x400021e8既不属于中断模式的堆栈,也不属于用户模式的。为什么?
模式已经切换到SYS了,其实这时是USR的堆栈
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

30
 
是用户模式的.....如果地址有问题可能是堆栈操作有问题....
 
 
 

回复

1

帖子

0

TA的资源

禁止访问

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

回复

4

帖子

0

TA的资源

禁止访问

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

回复

1

帖子

0

TA的资源

一粒金砂(初级)

33
 
感觉是USR或SYS模式下堆栈操作不对称,导致堆栈破坏,程序崩溃
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

34
 
LV  GUCCI  香奈儿一比一包包 批发零售!
广州市天龙皮具厂成立于2002年。是一家有多年专业设计、生产、经营高档皮具系列产品的企业。主营LV,GUCCI,CHANEL,世界一线畅销品牌皮具产品。款式多,更新快,出货准时。质量保证,价格实惠,免费代发货至世界各地,欢迎世界各地客商及爱包包人士前来选购。 三个起批可以混批!
网址:http://www.aimosi.com
联系电话:15920907201
MSN:aimosi@live.cn
客服QQ:775035679      957840212
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

35
 
中断向量表
                    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哦。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

36
 
引用 32 楼 great_bug 的回复:
感觉是USR或SYS模式下堆栈操作不对称,导致堆栈破坏,程序崩溃

为什么会这样。。。我感觉问题就在这里。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

37
 
从帖出来的代码看不出问题在哪

usr和sys模式是任务模式,不需要实际的堆栈空间,因为它们使用的都是ucos任务自己的堆栈(创建任务的时候指定的全局数组)
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

38
 
中断向量
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

39
 
引用 36 楼 arnold9009 的回复:
从帖出来的代码看不出问题在哪

usr和sys模式是任务模式,不需要实际的堆栈空间,因为它们使用的都是ucos任务自己的堆栈(创建任务的时候指定的全局数组)

但是MAIN()没有堆栈呀。他要用USER 模式的堆栈吧。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

40
 
好像系统模式的堆栈与用户模式的堆栈不同,用户模式是由  初始化得到的
但系统模式是由下面代码产生的。      
   AREA    Stacks, DATA, NOINIT
StackUsr
正好StackUsr为进入中断的堆栈地址。
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
立即报名 | 2025 瑞萨电子工业以太网技术日即将开启!
3月-4月 深圳、广州、北京、苏州、西安、上海 走进全国6城
2025瑞萨电子工业以太网技术巡回沙龙聚焦工业4.0核心需求,为工程师与企业决策者提供实时通信技术最佳解决方案。
预报从速,好礼等您拿~

查看 »

 
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
快速回复 返回顶部 返回列表