您现在的位置:首页 > 科技成果科技成果

分析M16C62在uC/OS-II嵌入式系统中的应用

发布时间:2018-08-13 06:42:52  来源:大电流电感厂家   查看:

随着微电子技术和网络的发展,人们对网络的认识日益深入。网络终端产品也越来越受到人们的关注,嵌入式操作系统的应用也得到了前所未有的发展,人们对嵌入式的研究也有了长足的进步。基于某个操作系统的实时、多任务系统的设计合应用成为单片机应用的新的发展趋势。

μC/OS-Ⅱ是一个源码公开的实时嵌入式操作系统,它的特点在于公开的源代码,很强的移植性,占先式多任务,每个任务有单独的栈,中断管理及很强的稳定性与可靠性等,目前越来越受到实时嵌入式系统设计者的关注,本文详细讲述了如何把uC/OS-II 操作系统移植到M16C62 单片机中,并给出了以M16C62 单片机为核心处理器构成的一个实时多任务系统的设计方案。

1、uC/OS-II的移植

uC/OS-II采用完全占先式的实时内核,最多可以管理56个任务,每个任务对应一个不同的优先级,因而,uC/OS-II操作系统并不支持时间片轮转调度法。但是全部UC/OS-II的函数调用与服务的执行时间是可知的,也就是,uC/OS-II系统服务的执行时间不依赖于应用程序任务的多少。另外,uC/OS-II中每个任务都有自己单独的栈,每个栈的大小可以根据应用程序的需要进行分配,这样压低了系统对RAM的需求;在中断管理方面,uC/OS-II中的中断可以使正在执行的任务挂起,如果优先级更高的任务被中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,uC/OS-II的中断嵌套可达255层。

uC/OS-II的源码大部分是用可移植性很强的ANSI C 写的。只是和微处理器有关的很小一部分代码是用汇编写的,这样把uC/OS-II移植到MC16C62中就变得相对容易很多,主要是要修改和处理器有关的代码,如:OS-CPU.H、OS-CPU-A.ASM、OS-CPU-C.C。

(1)、OS-CUP.H头文件

OS_CUP.H头文件主要是定义和处理器有关的数据类型,在M16C62中的数据类型包括无符号整型、有符号整型、无符号字符型、有符号字符型等。因此,OS_CPU.H头文件对这些类型进行全新的定义。除了和处理器有关的数据类型定义外,在OS-CUP.H中还作了有关中断禁止、中断允许、堆栈的增长方向等一些简单宏的定义。

(2)、OS-CPU-A.ASM文件

在OS-CPU-A.ASM文件中包含四个汇编语言的函数:OSSTartHighRdy()、OSCtxsw()、OSIntCtxsw()、OSTickISR()。在uC/OS-II中处于就绪态的任务的堆栈结构,看起来和刚中断的情形是一样的。要想运行最高优先级任务,移植要做的是就是将所有处理器的寄存器按顺序从任务堆栈中恢复出来,并且通过一条中断返回语句来实现任务的切换。因而,OSStartHighRdy()就是使要恢复的任务堆栈指针指到任务控制块的0偏址的内存单元中。也就是要把保存在任务堆栈中的数据以及CPU寄存器,如R0、R1、R2、R3、A0、A1、SB和FB返回到系统当前的寄存器中,并把当前堆栈指针指到PC指针的位置。

在uC/OS-II中任务的切换问题是通过发软件中断命令或依靠处理器执行陷阱指令来完成的。但是中断服务例程、陷阱或异常处理例程的向量地址必须指向OSCtxSw()。在M16C62单片机中可以通过定义软件中断0来完成任务的切换。因而,在M16C62中的中断向量表中的0号软件中断地址指向OSCtxSW()。对应的中断号为0。

OSInCtxSw()用来在ISR中执行切换功能。由于这个函数本身就是在中断中被调用,因而,在中断处理时寄存器的状态已经都被正确保存了。在OSInCtxSw()函数中要进行堆栈清理工作,只有这样被中断的任务的堆栈内容才能正确返回。

OSTickISR()这个函数时UC/OS-II所要求的时钟基准,即时钟节拍,uC/OS-II的时钟节拍频率在10到100之间,通常为了计算方便而设为整数。在M16C62中有多个定时计数器可以选择用来作为系统的时钟基准。在该系统中利用时钟定时器A0来产生频率为100的一个时钟节拍。OSTickISR()是一个中断响应函数,因而必须在M16C62的中断向量表中,A0的中断向量应分配给OSTickISR(),对应的中断向量号是21。

(3)、OS_CPU_C.C文件

在这个C文件中包含6个简单的C函数,而这6个函数中和移植关系最密切的OSTaskInit()函数,这个函数是用来创建一个任务堆栈。OSTaskCreat()和OSTaskExt()就是通过调用这个函数来初始化任务的堆栈结构的,由此看来,OSTaskInit()是移植的关键。在前面的OS_CPU_A.ASM文件中,任务的切换是通过调用一个软中断0来实现任务切换,通过中断的返回指令使堆栈中的数据返回到CPU寄存器,使最高优先级的任务占有CPU,因而,OSTaskInit()函数要做的就是模拟中断发生时处理器压栈的过程,把CPU的寄存器内容压到任务堆栈中。在M16C62单片机中,系统分为两个堆栈,即:用户堆栈和中断堆栈,而在uC/OS-II进行任务切换是通过软中断0来实现的,因此,uC/OS-II的任务堆栈是M16C62中的中断堆栈。在M16C62中,响应中断后堆栈的状态如图1所示:平面变压器厂家 | 平面电感厂家

程序框图中的 队列引用句柄 怎么创建?求教:下图中的“队列引用句柄”是怎么创建的呢?   前面板可以创建,关键这是后面板,我找了好久没找出来;    这是NI官方应用技术帖“基于生产者和消费者、队列的状态机”中的

ADSL集成电路关键参数的测试策略目前全球ADSL用户数量在迅速增长,为了刺激ADSL的持续增长,市场需要低成本的ADSL集成电路,本文介绍如何利用先进的测试平台来对ADSL芯片的某些关键参数进行测试,从而使半导体制造商能够降低ADS

[变压器]气隙和电感量问题请教一个问题:反激开关电源设计,变压器原边电感一般是根据伏秒积公式来计算(《Switching_Power_Supplies_A_to_Z》):Lp*△I/Ton = Vin,而且Lp=N*N*AL(无气隙)到最后变压器一般要加气隙,加了气隙之后,磁芯的AL值会下降很多,对于固定的匝数,电感量Lp岂不是又变了?谁能解释下,有点晕。 谢谢!满意回复+10yytda 查看完整内容是的,磁导率,AL值,这些都

CopyRight2014
大电流电感 | 大功率电感 | 扁平线圈电感 注塑加工厂