- 10
- 0
- 约 4页
- 2017-08-03 发布于河南
- 举报
单片机系统的开发大多数的情况不是在嵌入式操作系统平台上进行的,而是直接基于处理器编写的。在需要执行多任务的要求下,可以借鉴操作系统中的任务和线程机制,合理调度资源和处理器。
? 嵌入式设备需要操作系统,如掌上电脑、PDA、网络控制器等高性能的手持或移动设备。它们与无线通信、互联网访问和多媒体处理等复杂而强大的功能联系在一起;对CPU要求也很高,往往以通用的CPU为原型各种高端嵌入式处理器。作为一个完整的操作系统,RTOS有一个可靠性很高的实时内核,将CPU时间、中断、I/O、定时器等资源都包括起来,留给用户一个标准的应用程序接口;根据各个任务的先后,合理分配任务的CPU时间,保证程序执行的实时性、可靠性。内核一般都能提供任务调度和中断服务的功能,部分高档商业化产品,如Windows XP Embedded,甚至支持32位地址空间、虚拟存储管理、多进程以及嵌入式操作系统中不为多见的动态链接库(DLL)。对于这些RTOS来说,多任务实时处理不是一件困难的事。
? 但是在更多的情况下,用户使用的是另一类CPU——即单片机,往往是按照某一流程执行单一任务。出于成本和技术上的原因,这类软件开发多数还是在处理器是直接编程,没有选配实时多任务操作系统作为开发平台,也不需要将系统软件和应用软件分开处理。但是在实际应用中,有时也会面临同时处理多个并行任务的要求,这就需要安排一种运行机制,来模拟RTOS中的处理方法。? 整个实现机制概括如下:前台通过合理安排中断的响应和服务方式来对多个任务的实时线程进行处理;后台操作主要以循环方式扫描各个任务的线程标识,满足条件的线程被激活给予处理。
? 限于篇幅,不能详细介绍整个设计方案,在此给出各测试通道工作任务的前台和后台线程划分及流程,供参考。然后,给出一个中断退出后返回到任意地址的函数,它比C51自己的setjmp和longjmp全程跳转函数的使用要方便很多。实时任务中,中断服务结束后不是返回到断点地址执行原有程序,而是强制返回到某一地址执行新程序的情况非常普遍。我们采用设置环境变量的方法,使中断退出后可以任意返回到多个设置入口中的某一个去执行,有效地解决了前台和后台任务线程的灵活切换这一问题。我们使用的CPU是97C52,编程语言为Keil C51 6.0版。
? 初始化完成后进入多任务所属线程的循环处理阶段,其间可以随时由通道按键引起的中断来加入新的任务,每个线程的调度标识可以由相关的前台线程给出,也可来自相关的后台线程。配合Getadd和Putadd 从中断强制返回某地此后,使用跳转语句到真正的目标地址。
给出返回程序代码:/*保存当前地址信息到环境变量JMPEnv[env1][]中,每个变量由三项组成,env1是二维下标参数*/void getadd(unsigned char env1){unsigned char temp;temp=SP;JMPEnv[env1][0]=(*((unsigned char idata*)SP));temp--;JMPEnv[env1][1]=(*((unsigned char idata*)temp));JMPEnv[env1][2]=SP-2;}/*置中断返回的任意跳转地址*/void putadd(unsigned char env1)reentrant{ unsigned char temp[15];char i;/*下面保存进入中断程序时的压栈值*/for(i=0,i15;i++){temp[i]=(*((unsigned char idata*)SP));SP--;}/*放置新地址*/SP=JMPEnv[env1][2];SP++;(*((unsigned char idata*)SP)=JMPEnv[env1][1];SP++;(*((unsigned char idata*)SP))=JMPEnv[env1][0];/*恢复中断开始时的那些压栈值*/for(i=14;i=0;i--){SP++;(*((unsigned char idata*)SP))=temp[i];}}
原创力文档

文档评论(0)