打印

请教UCOSII ICCAVR mega8 移植的疑惑。

[复制链接]
2722|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elife|  楼主 | 2010-1-31 23:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从网上下了几个文件,都是别人移植成功的。但我却跑的不正常。看网上的程序,有一点疑惑。就是在OSTickISR处理中(时钟中断),一上来就直接用Y指针保存各个寄存器到堆栈中,这个Y指针难道在任务运行时能保持不变?或ICCAVR编译器根本不使用Y指针?希望成功的高手指点一下。

相关帖子

沙发
elife|  楼主 | 2010-2-1 14:46 | 只看该作者
自己顶一下,请各位指点一下,现在很是郁闷啊!

使用特权

评论回复
板凳
ShakaLeo| | 2010-2-2 08:27 | 只看该作者
Y指针是数据堆栈指针,每个任务的Y指针在任务切换时是保存在自己的TCB中的。

使用特权

评论回复
地板
电子三极管| | 2010-2-2 08:45 | 只看该作者
定时器内采样,如果我做时钟的话,在定时器里面写程序 这样会不会有误差?

使用特权

评论回复
5
elife|  楼主 | 2010-2-2 22:15 | 只看该作者
谢楼上各位,Y确实是保存在任务的TCB中的,但我不明白的是如果发生了时钟中断,中断中一上来就使用Y指针(没有从TCB中恢复),如何保证Y 在C编译的任务中保持不变呢? 个人感觉网上下的文件是有问题的,也可能是我水平有限,没有理解到。请各位再指导一下。

使用特权

评论回复
6
原野之狼| | 2010-2-2 22:59 | 只看该作者
在中断的时候并没有做任务切换哦

使用特权

评论回复
7
elife|  楼主 | 2010-2-2 23:03 | 只看该作者
谢原野之狼,中断时候确实没有任务切换,但进入中断后要保护寄存器,是用的Y指针,不是PUSH,我疑惑的是这个Y指针,怎么能一进中断就使用呢?

使用特权

评论回复
8
elife|  楼主 | 2010-2-2 23:08 | 只看该作者
网上的是这样定义的 在OS_CPU_C.C 中:
#pragma interrupt_handler OSTickISR:5
在OS_CPU_A.S中:
                        ; Push registers
                                .macro PUSHRS
                ST      -Y,R0       
                ST      -Y,R1
                ST      -Y,R2
                ST      -Y,R3
                ST      -Y,R4
                ST      -Y,R5
                ST      -Y,R6
                ST      -Y,R7
                ......

_OSTickISR::   
                PUSHRS                                ; save all registers
                IN        R16, SREG
                SBR        R16, 0x80                ; bei Aufruf dieser ISR geloeschtes I-Flag setzen
                ST        -Y, R16

使用特权

评论回复
9
ShakaLeo| | 2010-2-3 23:00 | 只看该作者
谢原野之狼,中断时候确实没有任务切换,但进入中断后要保护寄存器,是用的Y指针,不是PUSH,我疑惑的是这个Y指针,怎么能一进中断就使用呢?
elife 发表于 2010-2-2 23:03

Y是堆栈指针,进入中断当然可以直接使用,进入中断前运行的那个任务的Y指向什么位置,进入中断后就从那个位置继续存储数据。

使用特权

评论回复
10
elife|  楼主 | 2010-2-4 08:32 | 只看该作者
谢楼上,又看了下资料,是我没有熟悉ICCAVR的原因,Y指针说是做软堆栈指针用的。再次感谢楼上各位。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

398

帖子

4

粉丝