μC/OS-II在80196KC单片机上的移植
发布时间:2008/5/27 0:00:00 访问次数:431
摘要:主要讨论了将μc/os-ii实时操作系统在8019kc单片机上进行移植的原理和方法,给出了一个以tasking c为编译器、以8019kc为处理器,对μc/os-ii实时操作系统进行移植的具体实例。
关键词:80196kc; uc/os-ii;tasking c;移植
intel的80196kc系列单片机在中国国内有很大一批用户。支持80196kc的c编译器生产厂商主要有tasking和iar。但国内使用tasking公司c编译器的用户较多。由于μc/os-ⅱ系统为源码公开的实时操作系统,因此是当前嵌入式系统开发的主要方法。但是,在μc/os-ⅱ网站上没有现成的移植实例。因此,有必要进行一次移植以使操作系统成为μc/os-ⅱ,这种移植采用的处理器为80196kc,而其编译器为tasking c 196。
1 μc/os-ⅱ的工作原理
μc/os-ⅱ是一个源码公开的实时多任务操作系统,其工作流程如图1所示。图中,任务切换的核心是利用出栈指令将各个任务的工作现场再现,并利用子程序返回指令改变pc指针以完成任务的切换。移植的关键是如何构造任务堆栈及任务切换时的出栈顺序。任务区堆栈初始化主要是模拟任务被中断后的堆栈内容。
2 80196kc的工作状态
80196kc是intel公司的16位单片机,和程序运行密切相关的寄存器有指令计数器pc、堆栈指针sp、程序状态寄存器psw、中断屏蔽寄存器intmask和intmask1以及窗口寄存器wsr(以下将程序状态寄存器psw、中断屏蔽寄存器intmask和intmask1、窗口寄存器wsr统称为程序状态字)。它们可在执行子程序调用call指令时自动将pc进栈,并在子程序返回调用ret指令时自动将pc出栈。由于80196kc有16位的寻址能力,故这一动作有2个字节进(出)栈,其中push a指令将程序状态字进栈,pop a指令将程序状态字出栈。这一动作共有4个字节进(出)栈。另外push a动作会将psw中的中断允许位清零,故通常用push a关闭中断,而用pop a恢复中断允许。由于80196kc的时钟节拍是特定的周期性中断,当每个时钟节拍到来时,系统将对任务延时做一次裁决。因此,在这个时钟节拍可采用80196kc中的软件定时器中断。
3 tasking c编译器的工作细节
带参数的函数调用编译后的主要操作是先将参数进栈,然后执行call指令。在函数入口处将堆栈中的参数倒入寄存器tmp0、tmp2、tmp4和tmp6以进行操作(以下称临时寄存器)的原因主要是,堆栈一般位于ram区,而对ram区操作不如对寄存器操作快。如果该函数有局部变量,局部变量也是分配在堆栈中。tasking c编译器一般用一寄存器frame01(以下称框架寄存器)对局部变量进行访问,在函数返回时执行ret操作,并对sp指针进行调整,以跳过函数参数在堆栈中的位置。中断调用和函数调用类似,中断本身虽没有参数,但进中断后要对临时寄存器进行保护。因此,应在进中断后执行push a操作,并在中断返回时使临时寄存器出栈(注意出栈顺序),然后再次执行pop a和ret操作。图2所示为堆栈区的一般结构。
4 移植的细节
在ostaskstkinit()中,任务堆栈区的构造特点是80196kc的堆栈区由高向低增长,最高处是任务的入口参数,接着是pc指针和程序状态字。如前所述,任务切换时要对临时寄存器和框架寄存器进行保护。明确了任务堆栈的构造后,编写任务启动函数(指osstaart函数)和任务切换函数(指os_taask_sw和osintctxsw函数)的关键是,在得到了最高优先级的任务堆栈指针后,如何按正确的顺序出栈,直到pc指针。其中os_task_sw,函数在切换任务之前还要编写对当前任务的现场进行保护的程序,而osintctxsw,不用,因为中断函数用c写成,而osintctxsw,是在中断中调用的,因此,tasking c编译器在进中断时已自动对其保护。同时还应注意,由于在中断服务程序中没有定义局部变量,这使得tasking c编
摘要:主要讨论了将μc/os-ii实时操作系统在8019kc单片机上进行移植的原理和方法,给出了一个以tasking c为编译器、以8019kc为处理器,对μc/os-ii实时操作系统进行移植的具体实例。
关键词:80196kc; uc/os-ii;tasking c;移植
intel的80196kc系列单片机在中国国内有很大一批用户。支持80196kc的c编译器生产厂商主要有tasking和iar。但国内使用tasking公司c编译器的用户较多。由于μc/os-ⅱ系统为源码公开的实时操作系统,因此是当前嵌入式系统开发的主要方法。但是,在μc/os-ⅱ网站上没有现成的移植实例。因此,有必要进行一次移植以使操作系统成为μc/os-ⅱ,这种移植采用的处理器为80196kc,而其编译器为tasking c 196。
1 μc/os-ⅱ的工作原理
μc/os-ⅱ是一个源码公开的实时多任务操作系统,其工作流程如图1所示。图中,任务切换的核心是利用出栈指令将各个任务的工作现场再现,并利用子程序返回指令改变pc指针以完成任务的切换。移植的关键是如何构造任务堆栈及任务切换时的出栈顺序。任务区堆栈初始化主要是模拟任务被中断后的堆栈内容。
2 80196kc的工作状态
80196kc是intel公司的16位单片机,和程序运行密切相关的寄存器有指令计数器pc、堆栈指针sp、程序状态寄存器psw、中断屏蔽寄存器intmask和intmask1以及窗口寄存器wsr(以下将程序状态寄存器psw、中断屏蔽寄存器intmask和intmask1、窗口寄存器wsr统称为程序状态字)。它们可在执行子程序调用call指令时自动将pc进栈,并在子程序返回调用ret指令时自动将pc出栈。由于80196kc有16位的寻址能力,故这一动作有2个字节进(出)栈,其中push a指令将程序状态字进栈,pop a指令将程序状态字出栈。这一动作共有4个字节进(出)栈。另外push a动作会将psw中的中断允许位清零,故通常用push a关闭中断,而用pop a恢复中断允许。由于80196kc的时钟节拍是特定的周期性中断,当每个时钟节拍到来时,系统将对任务延时做一次裁决。因此,在这个时钟节拍可采用80196kc中的软件定时器中断。
3 tasking c编译器的工作细节
带参数的函数调用编译后的主要操作是先将参数进栈,然后执行call指令。在函数入口处将堆栈中的参数倒入寄存器tmp0、tmp2、tmp4和tmp6以进行操作(以下称临时寄存器)的原因主要是,堆栈一般位于ram区,而对ram区操作不如对寄存器操作快。如果该函数有局部变量,局部变量也是分配在堆栈中。tasking c编译器一般用一寄存器frame01(以下称框架寄存器)对局部变量进行访问,在函数返回时执行ret操作,并对sp指针进行调整,以跳过函数参数在堆栈中的位置。中断调用和函数调用类似,中断本身虽没有参数,但进中断后要对临时寄存器进行保护。因此,应在进中断后执行push a操作,并在中断返回时使临时寄存器出栈(注意出栈顺序),然后再次执行pop a和ret操作。图2所示为堆栈区的一般结构。
4 移植的细节
在ostaskstkinit()中,任务堆栈区的构造特点是80196kc的堆栈区由高向低增长,最高处是任务的入口参数,接着是pc指针和程序状态字。如前所述,任务切换时要对临时寄存器和框架寄存器进行保护。明确了任务堆栈的构造后,编写任务启动函数(指osstaart函数)和任务切换函数(指os_taask_sw和osintctxsw函数)的关键是,在得到了最高优先级的任务堆栈指针后,如何按正确的顺序出栈,直到pc指针。其中os_task_sw,函数在切换任务之前还要编写对当前任务的现场进行保护的程序,而osintctxsw,不用,因为中断函数用c写成,而osintctxsw,是在中断中调用的,因此,tasking c编译器在进中断时已自动对其保护。同时还应注意,由于在中断服务程序中没有定义局部变量,这使得tasking c编