基于LPC1343的UCOS-II移植

时间:2022-09-09 02:29:48

【摘要】本文首先介绍了LPC1343的硬件架构和UCOS-II实时操作系统的特点,最后介绍了UCOS-II在LPC1343上移植的方法和注意事项。

【关键词】LPC1343UCOS-II实时操作系统

[Abstract]The document introduced the hardware structure of LPC1343 and character of real-time Operating system、UCOS-II,then discussed the measures and matters needing attention to transplanting ucos-II.

[Key word]LPC1343, UCOS-II, real-time OS

本文以实时多任务操作系统UCOS-II为例,介绍了UCOS-II在LPC1343上的移植和应用,本文首先介绍了LPC1343的体系机构,然后对UCOS-II的架构进行了简单的描述,最后介绍了UCOS-II在LPC1343上的移植和使用方法。

一、系统的硬件架构

LPC1343是飞利浦公司生产的基于第二代ARM Cortex-M3内核的微控制器。最高运行频率达到72M. LPC1343配置有32KB的Flash存储器、8KB的数据存储器、集成了USB设备、1个快速模式I2 C接口、1个UART、4个通用定时器。

内嵌NVIC控制器,该中断控制器可对低优先级中断进行延时,对外部中断进行有效控制。中断向量表可重定位,具有软中断向量,适合于在使用操作系统时进行模式切换。

System Tick定时器,可产生固定的10ms中断,适合于作为操作系统的时钟信号。

二、UCOS-II简介

UCOS-II是一个可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器。UCOS-II绝大多数代码使用ANSI C语言进行开发。仅与CPU硬件相关部分是用汇编语言编写的,总量约200行,目的是便于移植到任何一种CPU上。UCOS-II仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。不提供输入输出管理,文件系统,网络等额外的服务。用可户根据需要自行实现。

UCOS-II的架构可以分为三层,底层为物理层,主要是嵌入式系统硬件的驱动包括系统的时钟信号。中间层为系统层,用于对任务的管理,它提供了邮箱,信号量,消息队列同步信号。可以根据需要通过配置os_cfg_r.h里定义的宏对UCOS-II进行裁剪。最高层为应用层,使用者可根据系统提供的API函数创建任务完成应用工作。

三、移植的主要工作

移植UCOS-II时主要解决以下几个问题:第一.系统时钟信号怎么产生;第二.初始的任务堆栈是什么结构,任务堆栈是递增堆栈还是递减堆栈;第三.哪些变量需要保存到堆栈;第四.怎么处理临界段代码;第五.任务之间如何切换。

我们使用System Tick定时器作为系统的时钟,时钟频率为100Hz,当系统的任务已知时,可以对该值进行调节使系统的负荷和响应速度达到一个平衡。发生中断时,系统对当前的任务状态进行裁决,以决定是否要进行任务切换。时钟的初始化代码可用C语言编写。

任务堆栈有两种结构,递减堆栈和递增堆栈,递减堆栈就是堆栈从高地址向低地址方向增长,递增堆栈就是堆栈从低地址向高地址方向增长。LPC1343的堆栈为递减堆栈。

LPC1343在发生中断时,需要保存的寄存器依次有堆栈指针,xPSR状态寄存器,链接寄存器R14,R12,R3-R0, R11-R4。当然这些寄存器是否保存到堆栈里在实际中与中断程序的内容有关,但我们在移植UCOS时。必须假设新的任务将会使用到这些寄存器,因为操作系统要处理的任务对于我们来说是未知的。这个将在OSTaskStkInit函数中用到。

UCOS-II的任务有5种状态,分别为睡眠态,挂起态,就绪态,运行态,中断态。任务一旦创建即进入就绪态,如果处于就绪态的任务优先级比正在运行的任务优先级高,则发生中断,优先级高的任务得以运行,而被中断的任务则处于中断态,当该高优先级的任务执行完毕且就绪任务的优先级没有中断态任务的优先级高时,中断态的任务重新进入运行态。当运行态的任务等待某事件发生时则进入挂起态。处于挂起态的任务当某事件发生时进入就绪态。当任务被删除时,进入休眠态。处于中断态的任务不能被删除,否则将引起系统崩溃。

任务的切换有两种情况,第一种是高优先级的任务因等待某事件的发生而请求挂起,使低优先级的任务得以运行,这种情况下通过调用OSCtxSw函数进行任务切换。这种任务称为任务级任务;第二种情况是高优先级的任务出现,在System Tick中断服务程序中直接切换到高优先级的任务,这种任务称为中断级任务。中断级任务的切换通过OSIntCtxSw函数实现。OSCtxSw的示例代码如下:

OSCtxSw

PUSH {R4, R5}

LDR R4, =NVIC_INT_CTRL

LDR R5, =NVIC_PENDSVSET;触发软件中断

STR R5, [R4]

POP {R4, R5}

BX LR

OSIntCtxSw函数也由汇编语言实现,由于代码同OSCtxSw类似,这里不再列出。

临界段代码指的是系统执行的不可分割的代码,这些代码一旦执行就不允许从中打断,所以在执行临界段代码前必须关中断,在临界段代码执行结束后必须立即开中断,所以临界段代码必须精简,以确保系统的运行效率。进入和退出临界段代码的例程如下:

OS_ENTER_CRITICAL;进入临界段的示例代码

CPSID I;禁止所有中断

PUSH {R1,R2}

LDR R1, =OsEnterSum;OsEnterSum++

LDRB R2, [R1]

ADD R2, R2, #1

STRB R2, [R1]

POP {R1,R2}

BXLR

OS_EXIT_CRITICAL;退出临界段的示例代码

PUSH {R1, R2}

LDR R1, =OsEnterSum;OsEnterSum--

LDRB R2, [R1]

SUB R2, R2, #1

STRB R2, [R1]

MOV R1, #0

CMP R2, #0;如果OsEnterSum=0,使能中断

MSREQ PRIMASK, R1;恢复PRIMASK寄存器的值

POP {R1, R2}

BX LR

任务切换时首先将当前正在执行的任务的状态保存到当前任务的任务堆栈中,从待运行的新任务的任务堆栈中获取该任务的运行状态,执行新任务。CPU的内部寄存器越多,需要保存和获取任务状态时消耗的时间也越多,因此System Tick的最短时间不得小于这个切换所要消耗的时间。

本文定义了3个任务,分别为USB接收帧处理任务,应用处理任务,USB发送帧任务处理。当USB接收到应用层的命令时,进行接收帧处理;提取有效命令,进行应用命令处理;回送响应数据。任务之间通过邮箱进行同步。

OSTaskCreate (TaskUSBRecvFrameProcess, (void *)0,&UsbRecvBuf[TASK_STK_SIZE-1], TASK_PRIO+5);

OSTaskCreate (TaskFrameProcess,(void *)0,&CmdProcessBuf[TASK_STK_SIZE×2],TASK_PRIO+7);

OSTaskCreate(TaskUsbSendFrameProcess, (void *)0,&UsbSendBuf[TASK_STK_SIZE-1], TASK_PRIO+4);

经过整体测试和压力测试,系统运行稳定,达到预期功能。

上一篇:新组建软交换固话虚拟网(CENTREX)制作流程的分... 下一篇:GSM室分系统干扰分析处理