打印

uC/OS-II怎么定义这三个函数

[复制链接]
1246|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
PZHengwf|  楼主 | 2012-11-13 23:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
*********************************************************************************************************
*                                          FUNCTION PROTOTYPES
*
* IMPORTANT: These prototypes MUST be placed in OS_CPU.H
*********************************************************************************************************
*/

#if 0
void          OSStartHighRdy          (void);
void          OSIntCtxSw              (void);
void          OSCtxSw                 (void);
#endif
这三个函数怎么回事?
在OS_CPU_A.ASM中汇编实现,到底在哪里定义?

相关帖子

沙发
Tinnal| | 2012-11-14 08:04 | 只看该作者
你不也说了,是在OS_CPU_A.ASM中了吗。
我对OSCtxSW()任务级任务切换函数的理解(以图例的方式)
www.amobbs.com/thread-3289675-1-1.html
ucos教学2-7-1任务调度OSCtxSw-卢有亮.wmv—在线播放—优酷网
http://v.youku.com/v_show/id_XMzc3MjgxNjg4.html

看来你对C语言和汇编混合编程不了解,建议你先放下ucOS, 先补习一下这块。研究操作系统缺了这块知识不行。
说白了,函数编译成汇编了,也是只是一个标号,而汇编的一个标号,在C语言中又可以看成是一个函数。所以C语言时就可以直接调用OSIntCtxSw等函数,其实就是汇编当中的OSIntCtxSw处执行。
调用是成了,运行权也给那断汇编了,但这要注意几点;
1. 在汇编里头我们是直接用寄存器操作的,而C不是,因此,对C已经使用的寄存器也就需要先保护起来了
2.C语言传下去的参数(当然,你的那三个函数都有没这么做),怎么在汇编里取出来。
这两个问题的答案就是:函数调用约定

使用特权

评论回复
板凳
ayb_ice| | 2012-11-14 08:11 | 只看该作者
这个需要移植的

使用特权

评论回复
地板
Tinnal| | 2012-11-14 08:16 | 只看该作者
因为OSCtxSw的实现原理主要是,
在正常的中断来临时,会先保存现场,执行中断处理程序,恢复现场。如果只是这么做,那KEIL C已经给我们做好前期和后期工作了,我们只要用C写中断处理程序程序就行。

当UCOS判断到需要进行切换时,可以在此时的”中断处理程序"当中,首先把现场改成另外一个人的现场,然后再恢复现场,那样,中断返回后,就是另外一任务在运行了。达到切换的目的。此过程中因为要做“改现场”,操作的对像是寄存器,而这又一个KEIL C的非标准过程,KEIL没有帮助我们做,因此就要我们自己用汇编来写了。
而又因为汇编本来就是体系结构相关的,而不同体系结构寄存器等又不一样,因此OSCtxSw是体系相关的。51的和ARM的完全不一样。

使用特权

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

本版积分规则

6

主题

81

帖子

0

粉丝