uC/OS—II在TS101上的移植

时间:2022-08-30 11:32:25

摘要:近年来,DSP处理器的处理能力得到很大的提高,这使得在这些处理器上移植操作系统成为变的合理、合算。研究如何在ADI公司的TS101芯片上进行uC/OS-II操作系统的移植。

关键词:嵌入式操作系统;uC/OS-II;TS101;移植

中图分类号:TP311 文献标识码:A 文章编号:1671—7597(2012)0510012-02

0 引言

传统上认为,DSP处理器适合进行运算密集型任务处理,不适合使用操作系统。然而,当前最新型的DSP处理器的片上资源和处理能力都得到了很大的提升,这使得在上面移植一个轻量级的操作系统变得合理又合算。因为这些操作系统占用的资源极少,但是使得系统具有了多任务并行处理和调度的能力。TS101是ADI公司的高端数字信号处理芯片,它具有极强的并行处理能力。uC/OS—II是mi crium公司推出的一个性能优异、可裁剪、支持抢占式任务调度的嵌入式系统实时内核。如果将该操作系统移植到TS101上,将在消耗系统资源极少的情况下,使应用系统具有并行任务实时调度的能力。本文将主要介绍在移植的过程中需要注意的问题。

uC/OS—II是一个原代码开放的嵌入式实时操作系统。TS101是ADI公司的双核DSP芯片,该芯片具有3*2Mbits的内存,寄存器单元较多,因此,在移植的时候应当考虑到这些因素的影响。

1 移植过程中的关键技术

1.1 对uC/OS-II原版本的修改

我们采用通过美国航空航天管理局安全认证的2,52版本作为移植的母本文件。根据TS101芯片结构、开发环境以及应用环境的特点对原始文件进行了修改。主要方面如下:

1)改变了任务控制块(OS_TCB)数据类型的定义。对该数据类型中所包含的元素数量以及类型没有做修改,只修改了这些元素的在该结构体中的顺序。这样做是为了在汇编语言中索引方便,因为编译器根据各个元素的类型以及位置来安排该元素相对于该结构体首地址的位置。

2)通过函数调用实现任务之间的切换。原始版本的操作系统在进行任务切换的时候,首先引发一个中断(通常是一个软中断),在中断中实现上下文切换,并返回到新任务执行。我们采用函数调用的方式实现这个过程,即:由需要被切换的任务调用一个函数,由该函数实现上面中断的功能。采用这种技术可以解放一个中断资源。

3)保护临界区的时候,取消了原始版本所定义的前两种保护方式,仅保留第三种方式。即:用局部变量保存全局中断允许标志并在脱离临界区的时候恢复。

4)修改初始版本的任务堆栈初始化函数为双任务栈,这样做是为了与TS101的双核双栈结构兼容。

1.2 堆栈结构及其管理

TS101是双核结构,每个内核都有自己的堆栈,这决定了在进行任务切换的时候同时管理两个中断。相应的,任务栈的初始化也对j,k两栈分别进行。

TS101用J26、J27以及K26、K27分别管理J/K两个堆栈,堆栈由高地址向低地址增长。下表为任务栈的结构:

关于上表的一些解释:

1)上表的左半页为J栈的存储情况,右半夜为K栈的存储情况。2)表中单元由上到下表示栈的增长方向,栈的增长相应于物理地址的减小。3)每个大的单元表示四个内存字,但是有的大单元被分为更小的单元,这些小单元按从左到右表示栈的增长方向,即右边的小单元的地址比左边的小。4)CJMP1保存返回地址,而CJMP2为程序返回后重新付给CJMP寄存器的值,即CJMP寄存器的原值。比如,一个任务被中断并发生切换,那么,在保存该任务的上下文的时候,将RETIB的值作为保存在CJMP1中,作为下次重新切换回该任务是的返回地址,而CJMP将保存到CJMP2中,这样的话,在任务下次切换回来的时候,可以将CJMP恢复到中断前的状态。5)IMASKH并不表示该处保存的是IMASKH寄存器的全部内容,它仅保存其中的全局中断允许位。6)严格按照FILO原则操作堆栈。7)在保存x/ySTAT之前,不能进行任何X/Y核运算、传送指令,因为这些指令可能影响到STAT的状态。同样的,在保存J31和K31之前,不能进行任何的IALU元算指令,因为这些指令可能影响到j/kSTAT的状态(注:TS101用j31和k31维护j/kSTAT)。

1.3 任务切换

在下列条件下,将发生任务切换:

1)高优先级的任务等待某事件发生的时候,将自己挂起并切换到低优先级的就绪任务。2)低优先级的任务某事件发生的信号将使自己挂起并切换到等待该事件的高优先级任务。3)高优先级改变自身优先级并调用任务切换函数切换到新的就绪任务。4)在中断中某事件的发生将使得任务切换并返回到等待该事件的任务。

总的来说,任务的切换条件有任务中切换和中断中切换两种情况。任务中的切换由调用任务切换函数OSCtxSw()完成,由于在调用该函数之前,所有触发切换的条件已经具备(原始版本这样设计),所以,该函数仅完成旧任务栈的保存和新任务栈的恢复工作,而不判断是否真正的构成触发的条件。从中断中切换的时候,需要ISR自己判断是否构成任务切换的条件。

1.4 中断管理

系统初始化的时候,操作系统对中断做了一些基本的设定,其状态为:除TIMER1高优先级中断(用作系统时钟)以外的所有中断都是关闭的,由用户决定开启全局中断的时机以及使用的中断类型。

使用ViaualDSP++提供的ISR加载方式(如interrupt和interrupts)函数的时候,编译器会自动在用户编写的中断服务程序代码前、后加一段代码。其中,前面的代码根据所使用加载函数的不同保存相应的寄存器,然后,用户的ISR代码被这段代码调用执行。当用户ISR执行完毕的时候,将返回到编译器所加的后一段代码,将前面保存的寄存器恢复并返回到中断发生之前的代码。

操作系统需要直接与最底层硬件打交道,开发环境的这种处理方式无疑降低了用户配置的自主性,所以,我们摒弃了这种加载方式(即,不使用开发环境所提供的加载函数),并自己编写了自己的函数。这些函数仅完成最少量的配置工作,提供给用户更加灵活的操作方式。具体的说,这些函数仅仅在IMASK寄存器中使能相应的中断位,以允许该中断发生,并将用户的ISR代码定位到正确的位置。

TS101的中断数量众多,为每个中断配置中断服务过程将非常繁琐并且重复消耗代码空间。因此,我们对中断采取统一管理的方式。具体的说,操作系统提供一个统一的中断服务函数,并将每个中断的中断向量表初始化为该函数的起始地址,这样的话,当中断发生的时候,程序将跳转到统一的中断服务代码,并由这段代码判断是哪个中断触发了该函数,进而选择并执行正确的用户ISR。当然,用户ISR由用户编写并调用系统服务函数装载(操作系统使用Timerl高优先级中断作为系统时钟,并且,操作系统自动装载默认的ISR,用户可以不对此中断做装载操作)。这样做简化了中断处理的复杂性,并且使得中断服务的过程不再仅仅决定于硬件所定义的中断优先级,因为在操作系统所提供的ISR中,我们仍然可以决定中断服务的顺序。在初始化中断的时候,将用户ISR注册到一个由操作系统ISR管理的表中,这样的话,操作系统就可以管理这些中断服务代码了。用户ISR可以用C语言编写,我们不能假定这些ISR所使用的寄存器的情况,所以,必须在调用用户ISR之前保存所有的寄存器。另外,为了防止中断嵌套层数过多引起的堆栈溢出问题,仅仅在进入最外层中断的时候,系统才会保存全部的寄存器。这样做,将会引发这样的问题,在嵌套的ISR中,由于没有完全的保存寄存器,因此,该层的ISR可能会修改被它嵌套的中断的寄存器状态,防止这种情况发生的解决方案是:在执行用户ISR之前关闭全局中断,当执行完毕以后再重新开启。

1.5 关于TS101编程

1)ISR的头三条指令不能包含任何的IALU操作,为了一劳永逸的解决这个问题,规定在ISR的开头添加固定的三个NOP;指令。2)虽然TS101的内部总线宽度达128位,但是,一定注意不要频繁集中的使用四字传输指令,这样的话可能与DMA传输冲突。3)对VIRPT寄存器的写操作将直接触发该中断。4)编写ASM文件的时候,一定注意将j27和k27指向空闲的四字对齐的地址,这样做是为了防止地址后修改指令(如:[j27+=4]=xrO;;)对该处内容的覆盖。

1.6 关于为系统提供的互斥型信号量

任何的目标系统都会有一些公共资源,对这些公共资源的管理默认采用互斥型信号量。系统定义了5个固定的互斥型信号量以完成这个功能。这5个互斥型信号量分别为Mutex0,Mutex1,Mutex2,Mutex3,Mutex4。同时,互斥型信号量为了降解优先级反转的问题,需要占用一些高的任务优先级,目前,系统默认占用的优先级为4~8(即,Mutex0对应于优先级4,以此类推),用户任务的优先级应当避免使用这5个优先级。但是,用户仍然可以在os_cfg.h文件修改OS_MUTEX_PRIO_0,OS_MUTEX_PRIO_1,OS_MUTEX_PRIO_2,OS_MUTEX_PRIO_3,OS MUTEX_PRIO_4等5个宏的定义从而自定义这些互斥型信号量所占用的任务优先级。需要注意的是:

1)由于这些互斥型信号量的存在,在os_cfg.h文件中,这些宏定义有如下约束:如果开启这些功能,需定义OS_MUTEX_EN为1。OS_MAX_EVENTS应该至少为5。OS_LOWEST_PRIO的值应至少为8,当允许空闲任务的时候,这个值应至少为9。

2)所有的用户任务不应当使用这些互斥型信号量所占用的优先级。为此,在创建用户任务的时候,应当及时检测所返回的出错代码,确认没有出现类似的错误。

3)所有使用互斥型信号量的任务的优先级应当低于该信号量所占用的任务优先级。

4)具体使用哪个信号量,用户可以根据实际情况酌情处理。

2 结语

本文具体的描述了在TS101芯片上移植uC/OS-II操作系统的方法和关键的问题。移植后的实际运行状况表明,这种方法在占用极少的资源的情况下,使系统具有了实时任务调度能力。同时,该移植版本运行稳定,已经应用于我们最新的信号处理系统中。

上一篇:“80后”家庭对幼儿自理能力的影响 下一篇:计算机网络安全防ARP攻击