毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 论文 >> 正文

arm嵌入式系统设计论文 第11页

更新时间:2009-4-12:  来源:毕业论文

arm嵌入式系统设计论文 第11页|免费论文
编制 OS_CPU_A.S 文件  
为了方便移植,大部分的μC/OS-II代码是用C语言写的,但仍需要用C和汇编语言写一些与处理器相关的代码,这是因为μC/OS-II在读写处理器寄存器时只能通过汇编语言来实现,这部分代码都放在了OS_CPU_A.S文件中。如果要实现μC/OS-II移植,一定要编写OS_CPU_A.S文件中四个汇编语言函数OSStartHighRdy()、OSCtxSw()、OSIntCxSw()、OSTickISR()以及ARMEnableInt()和ARMDisableInt()。
1.OSStartHighRdy()函数被多任务系统启动函数OSStart()调用,使就绪态的最高优先级的任务开始运行(就绪的最高优先级任务就如同从中断里返回到运行态一样,使得整个系统得以运转。该函数仅仅在多任务启动时被执行一次,用来启动第一个,也就是最高优先级的任务执行,之后多任务的调度和切换就是由下面的函数OSCtrSw()和OSIntCtxSw()来实现)。假设OSTCBHighRdy指向的是优先级最高任务的任务控制块,要想运行最高优先级的任务,用户所要做的是将所有处理器寄存器按顺序从任务堆栈中恢复出来,并执行中断的返回。为了方便起见,堆栈指针总是存储在它的OS_TCB的开头,也就是说要恢复的任务堆栈指针总是存储在OS_TCB的0偏址的内存单元中。OSStartHighRdy必须调用OSTaskSwHook,因为用户正在进行任务切换的部分工作即恢复最高优先级任务的寄存器的内容。而OSTask SwHook可以通过检查OSRunning获知是OSStartHighRdy()在调用它(OSRunning为FALSE)还是正常的任务切换在调用它(OSRunning为TRUE)。函数OSStartHighRdy伪代码如下:
void OSStartHighRdy(void)
{
调用OSTaskSwHook();
得到最高就绪任务的栈指针并赋给SP;
OSRunning=TRUE;通过模拟一次中断返回,用SP从堆栈中恢复任务的寄存器;任务代码地址赋给程序计数器PC,转动任务中执行指令
}
OSStartHighRdy的主要代码如下:
{
BL OSTaskSwHook;//调用OSTaskSwHook函数
LDR r4,addr_OSTCBCur;//得到当前任务TCB地址
LDR r5,addr_OSTCBHighRdy;//得到最高优先级任务TCB地址
LDR r5,[r5] ;//获得堆栈指针
LDR sp,[r5] ;//转移到新的堆栈中
STR r5,[r4] ;//设置新的当前任务TCB地址
LDMFD sp!,{r4};
MSR SPSR,r4;
LDMFD sp!,{r4};//从栈顶获得新的状态
MSR CPSR,r4;//CPSR处于SVC32Mode模式
LDMFD sp!,{r0-r12,lr,pc};//运行新的任务
}
2.OSCtxSw()函数是任务级的上下文切换函数,在任务因为被阻塞而主动请求CPU调度时执行,由于此时任务切换是在非异常模式下进行的,因此需要区别与中断级别的任务切换。OSCtxSw()完成的工作为:保存任务的环境变量 (主要是寄存器的值,通过入栈实现),将当前SP存入任务TCB中,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回,这样就完成了任务级切换。OSCtxSw()函数的伪代码如下:
 void OSCtxSw(void)
{
保存处理器寄存器;
将当前任务的堆栈指针保存到当前任务的OS_TCB中;
调用OSTaskSwHook();
需要恢复的任务的控制块赋给当前任务控制块指针OSTCBCur;
需要恢复的任务的优先级赋给当前任务优先级指针OSPrioCur;
得到需要恢复的任务的堆栈指针SP;
将所有处理器寄存器从新任务的堆栈中恢复出来;
模拟中断返回;
}
3.OSIntCtxSw()函数是中断级的任务切换函数,在时钟中断ISR(中断服务例程)中发现有高优先级任务等待的时钟信号到来,需要在中断退出后不返回被中断的任务,而是直接调度就绪的高优先级任务,其目的在于能够尽快让高优先级的任务得到响应,保证系统的实时性能。尽管原理与任务级切换基本上相同,但是由于进入中断时已经保存过了被中断任务的CPU现场,因此不再进行类似的操作,只需要根据函数的嵌套情况做相应的调整。OSIntCtxSw()具体完成的工作包括:调用OSTaskSwHook(),保存当前任务SP,载入就绪最高优先级任务的SP,恢复就绪最高优先级任务的环境变量,中断返回。OSIntCtxSw的伪代码如下:
void OSCtxSw(void)
{
调用OSTaskSwHook();
需要恢复的任务的控制块赋给当前任务控制块指针OSTCBCur;
需要恢复的任务的优先级赋给当前任务优先级指针OSPrioCur;
得到需要恢复的任务的堆栈指针SP;
将所有处理器寄存器从新任务的堆栈中恢复出来;
模拟中断返回;
}
4.OSTickISR()是系统时钟节拍中断服务函数。它是一个周期性中断,为内核提供时钟节拍,频率越高系统负荷越重。其周期的大小决定了内核所能给应用系统提供的最小时间间隔服务,一般只限于毫秒级(跟处理器有关),对于要求更加苛刻的任务需要用户自己建立中断来解决。为OSTickISR()的主要任务是负责处理时钟中断,调用系统实现OSTimeTick函数,如果有等待时钟信号的高优先级任务,则需要在中断级别上调度其执行。该函数具体内容:保存寄存器,调用OSIntEnter(),调用OSTimeTick(),调用OSIntExit(),恢复寄存器,中断返回。OSTickISR函数的伪代码如下:
void OSTickISR()
{
保存处理器寄存器的值;
调用OSIntEnter();
OSTimeTick();
调用OSIntExit();
恢复处理器寄存器的值;
中断返回;
}
5.ARMEnableInt()和ARMDisableInt()分别是退出临界区和进入临界区的宏指令实现。主要用于在进入临界区之前关闭中断,在退出临界区的时候恢复原来的中断状态。它的实现比较简单,可以采用方法1直接开关中断来实现,也可以采用方法2通过保存关闭/恢复中断屏蔽位来实现。
5.2.3 编制OS_CPU_C.C文件                 
μC/OS-II的移植要求用户编写OS_CPU_C.C文件中辣个C语言函数,分别为函数OSTaskSwHook()、OSTaskstkInit()、OSTaskCreateHook()、OSTaskDelHook()、OSTaskstHooK()和OSTimeTickHook()。其中,唯一必要的函数是OSTaskstkInit(),其它五个函数必须声明但可以不包含代码。
1. OSTaskstkInit():OSTaskstkInit()被OSTaskCreate()、OSTaskCreate Ext()调用来初始化任务的堆栈结构,图5-3显示了OSTaskstkInit()放到正被建立的任务堆栈中的内容,这里假定堆栈是从上往下长的。当用户建立任务时,用户要将任务的地址、Pdata指针、任务的堆栈栈顶指针和任务的优先级传递给OSTaskCreate()和OSTaskCreateExt()。为了正确初始化堆栈结构,OSTaskStkInit()要求刚才得到的前三个参数和一个附加选项,这个选项只能在OSTaskCreateExt()中得到。如果想从其它的函数中调用一个任务,C编译器就会先将调用该任务的函数的返回地址保存到堆栈中,再将pdata参数保存到堆栈或寄存器中。堆栈指针存储的处理器寄存器值Pdata(pdata通过寄存器传递)
 
图5.3堆栈初始化
当处理器发现并开始执行中断时会自动完成此过程。一些处理器会将所有的寄存器存入堆栈,而其他一些处理器只将部分寄存器存入堆栈。一般而言,处理器至少要将程序计数器的值和处理器的状态字存入堆栈。处理器按一定顺序将寄存器存入堆栈,而用户在将寄存器存入堆栈的时候也就必须遵从这一顺序,之后用户需要将剩下的处理器寄存器保存到堆栈中。如果pdata被用户的C编译器保存到寄存器中,用户需要从编译器的文档中找到pdata存储在哪个寄存器中,pdata的内容就会随着这个寄存器的存储被放在堆栈中。一旦用户初始化了堆栈,OSTaskStkInit()就要返回堆栈指针所指的地址,OSTaskCreate()和OSTaskCreateExt()会获得该地址并将它保存到任务控制块中。处理器文档会告诉用户堆栈指针指向下一个堆栈空闲位置,还是指向最后存入数据的堆栈单元位置。
2.OSTaskCreateHook:当用OSTaskCreate()和OSTaskCreateExt()建立任务时调用OSTaskCreateHook(),μC/OS-II设置完了自己的内部结构后,会在调用任务调度程序之前调用该函数。
3.OSTaskDelHook():任务被删除时调用OSTaskDelHook(),该函数在把任务从μC/OS-II的内部任务链表中解开之前被调用,当OSTaskDelHook()被调用时,它会

 << 上一页  [11] [12] [13] 下一页

arm嵌入式系统设计论文 第11页下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©751com.cn 辣文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。