ucos中任务切换函数都是汇编写的,属于“需移植”文件,
这个汇编文件名一般叫做:OS_CPU_A.ASM
要想看懂任务切换的原理,首先遇到的第一个难点,就是OS_CPU_A.ASM这个汇编文件里的一大堆不常见的汇编伪指令,搞懂这些指令是搞懂程序原理的第一步。
这篇文章先只分析这些汇编指令。
这个文件为ucos操作系统提供了4个API函数,分别是:
PUBLIC OSStartHighRdy;函数功能:切换到已就绪的任务横纵优先级最高的那个任务中去
PUBLIC OSCtxSw ;函数功能:一般的上下文切换,ContextSwitch,上下文切换又叫任务切换
PUBLIC OSIntCtxSw ;函数功能:在中断中进行上下文切换
PUBLIC OSTickISR ;函数功能:系统滴答
PULIC是汇编伪代码,表明所声明的函数可以被其他文件调用
首先来学习一个知识点,如何在汇编代码中写一个函数,才能使得这个函数能够被其他文件调用?不仅是加PUBLIC关键字这么简单,另外,我们还必须遵守一定的规范,可参考这篇文章,链接:点击打开链接
如果链接挂了,自行搜索关键字即可:《汇编函数与C函数的相互调用》
这个文件OS_CPU_A.ASM除了供外部文件引用自己的函数外,也需要引用别的文件的函数和变量,例如:
EXTRN IDATA (OSRunning) ;声明引用IDATA 区的变量OSRunning
MOV R0,#LOW (OSRunning) ;在汇编中使用外部变量
EXTRN CODE (_?OSTaskSwHook) ;声明引用外部函数(代码),OSTaskSwHook()
LCALL _?OSTaskSwHook ;在汇编中调用C语言函数OSTaskSwHook()
解释:函数OSTaskSwHook是用C语言写的,名字为OSTaskSwHook,但是在汇编中引用它的话,必须在前面加前缀才行,由前面链接里的文章我们知道,如果我们在汇编中引用的是可重入函数,那么必须在函数名前面加_?前缀才能被汇编文件识别到。为什么要加前缀?因为C51的C语言函数转换为汇编的时候,keil编译器会自动把C语言的函数名给改掉,当然keil所做的改动是有规律的,例如,我们声明的可重入的C函数,keil转成汇编后,会自动在原先的函数名前加前缀“_?” 。
keil会自动添加什么前缀,添加的前缀有什么规范?这些问题可以参考keil的帮助文件,依次点击菜单栏->help->uVision help,在打开的帮助文件中搜索“Segment Naming Conve