Ucosii移植到LPC2138、2148
此文章已于 20:06:52 2011/4/18 发 发发布到
Ucos ii 移植到LPC2148
类类[类类一类类或类入一新类类个个]
所移植,就是使一个内核能在其它的微理器或微控制器上运行。尽管大部分发“”发发发发发发发发发发发发发发发发发发发发发发发发发发发μC/OS-II的代是用发发发C发发发发发发发发发发发发发发发发发发言写的,但是在写与理器硬件相的代是不得不使用言。移植的主要工作就是写发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发 些与理器硬件相的代。
Ucos发发发发发发发发件体系构如下所示:
根据μC/OS-II的要求,移植μC/OS-II到一个新的体系构上需要提供发发发发发发发2个或3个文件:
OS_CPU.H,C发发发发发言文件,
OS_CPU_C.C,C程序源文件,
OS_CPU_A.ASM,程序源文件,发发发发发发发发
其中OS_CPU_A.ASM在某些情况下不需要,但极其罕。不需要发发发发发OS_CPU_A.ASM的必足以下苛刻条件,而同足些条件的微控制器几乎没有:发发发发发发发发发发发发发发发发发发发发发发发发发发发发发
1.可以直接使用C发发发发发发言中断,
2.可以直接使用C发发发发发发发发发发言写中断服程序,
3.可以直接使用C发发发发发言操作堆指,
4.可以直接使用C发言保存CPU的所有寄存器。
Include.h和config.h
μC/OS-II要求所有.C文件的都要包含文件发发发includes.h,使得用目中的发发发发发发发发发个每.C文件不用分去考它上需要哪些文件。使用发发发发发发发发发发发发发发发发发发INCLUDES.H的缺点是它可能会包含一些不相的文件,意味着发发发发发发发发发发发发发发发发发发发发发发发发发个文件的可能会增每
加,但却增了代的可移植性。强发发发发发发发
发发发在本移植中另外增加了一个文件config.h,我要求所有用程序必包含发发发发发发发发发发发发发config.h,在config.h中包含includes.h和特定的文件和配置。而发发发发发发发发发μC/OS-II的系文件依然发发发发发只是包含includes.h,即μC/OS-II的系文件完全不必改。所有的配发发发发发发发发发发发发发发
置改包括文件的增减均在发发发发发发发发发发发config.h中行,而发发发发includes.h定下来后不必改,发发μC/OS-II的系文件需要包含的西是固定的,。,发发发发发发发发发发发发发发发发发发发μC/OS-II的系文件需要的发发发发发发发发次数大大减少,随之减少。发发发发发发发发发
OS_CPU.H
(1)可移植性型定类类类类
μCOS-II不使用C发言中的short、int、long等数据型的定,因它与理器发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发型有,含着不可移植性。代之以移植性的整数数强
据型,,既直又可移植,不就成了必移植的代。发发发发发发发发发发发发发发发发发发发发发发发发发发发发
typedefunsigned char BOOLEAN;
typedefunsigned char INT8U;typedefsigned char INT8S;
typedefunsigned short INT16U;typedefsigned short INT16S;
typedefunsigned int INT32U;typedefsigned int INT32S;
typedeffloat FP32;
typedefdouble FP64;
typedefINT32U OS_STK;
(2)类类类类中断底接口
发发发发发发发发发发发发发发发发发发发发发发发发发了使底接口函数与理器状无,同在任用相的
函数不需要知道函数位置,本移植使用中断指令发发发发发SWI作底接口,使用不发发发发发发发发发同的功能号区分不同的函数。中断功能号分配如下
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
所示,未发发发发发发发发发发发发发发发列出的保留功能。发发发发发发
用中断作操作系的底接口就需要在发发发发发发发发发发发发发发发发发发C发言中使用SWI指令。在IAR中,有一个发发字__swi,用它声明一个不存在的函数,用个函数就在用个函发发发发发发发发发发发发发发数的地方插入一条SWI指令,并且可以指定功能号。同,个函数也可以发发发发发发发发发有参数和返回,其与一般函数一。发发发发发发发发发发发发发发发
(3)堆生方式类类类类类
μCOS-II使用构常量发发发发OS_STK_GROWTH中指定堆的生方式:发发发发发发发置OS_STK_GROWTH发0表示堆从下往上。发发发发发发发
置OS_STK_GROWTH发1表示堆从上往下。发发发发发发发
发然ARM发发发发发发发发发发发发理器核于两方式均支持,但IAR的C发发发发发发发发发发言器支持一方式,即从上往下,并且必是减堆,所以发发发发发发发发发发发发发发发OS_STK_GROWTH的发发1。#define OS_STK_GROWTH 1
Os_cpu_c.c
(1)OSTaskStkInit( ) 接口
发发发发发发发发发发发发发发发发发发发发发函数用于初始化任堆,使任的堆看起来就像生中断
一。即任被行,就像从中断返回一。在写此函发发发发发发发发发发发发发发发发发发发发发发发发发
数之前,必先确定任的堆构。而任的堆构是与发发发发发发发发发发发发发发发发发发发发发发CPU的体系构、发发发发发器有密切的。本移植的堆构如下所示。发发发发发发发发发发发发发发发发发
(2)类类类类 件中断异常服程序
操作系与硬件相的底函数使用件中断作接口,如发发发发发发发发发发发发发发发发发发发发发发发下表所示。移植代中一个重要的工作就是些件中断写服程序。发发发发发发发发发发发发发发发发发发发发发发发发发(3)Hook( )函数
在Os_cpu_c.c文件中有多子函数,它在某个特定的系发发发发发发发发发发发发发发发发发发发
发发发发发发发发发发发发发发发发发发发发发发发发发发作被用,允行函数中的用代。些函数默是
空函数,用根据情况添加相代。它分如下表所示。发发发发发发发发发发发发发发发发发发发发发发发发
OS_CPU_A.ASM
(1)类中断
在Os_cpu_a.s文件中有件中断的接口程序、任切程序、发发发发发发发发发发发发发发发发发发发OS启运行发发发发就最高先任的程序。发发发发发发发发发发发发
当生件中断,程序通异常向量表跳到中断的与发发发发发发发发发发发发发发发发发发发发发发发发发发发C接口程序SoftwareInterrupt发发发,下SoftwareInterrupt的
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
。发发
发发发发发发发发因行任切(发发行新任)堆指会指向用的堆,下一次入管理模式,在发发发发发发发发发发发发发发发发发发发发发发发发发osintctxsw中就会用到管理模式,就会破坏用堆,从而致程序行不正发发发发发发发发发发发发发发确。所以程序在一始置堆指。中断指令使理器入管理发发发发发发发发发发发发发发发发发发发发发发
模式,而用程序于系,用模式,其它异常也有自己的发发发发发发发发发发发发发发发发发发发发发发发
理器模式,都有各自的堆指,不会因堆指而破坏其它理发发发发发发发发发发发发发发发发发发发发发发器模式的堆而影响其它程序的行。返回的地址已存在接寄存器发发发发发发发发发发发发发发发发发发发发发发发发发发发LR中而不是存发在堆中。由于人管理模式自中断,所以段程序不会发发发发发发发发发发发发发发发发发发发发发发发发发
被其它程序同用,置的堆指指向的位置肯定是空位置,发发发发发发发发发发发发发发发发发发发发发发发
后一次用不会影响前一次用。就可以保发发发发发发发发发发发发发发发发发发发“LDR SP, StackSvc”
发发发发发发发行正确的堆指置。
发因ARM发发发理器核具有两个指令集,在行Thumb指令的状不是所有寄存发发发发发发发发器都可,参考发发发发ARM的相料,,而且任又可能不在特模式,不能改发发发发发发发发发发发发发发发发发发发发发发发CPSR,。了发发兼容任意一模式,本移植使用中断指令发发发发发发发发发发发发发发SWI使理器入管理模式和发发发发发发发发发发ARM指令状,发发并使用功能0发发OS_TASK_SW,,的功能,
Ø附:, 1,LR没有入:发发
从SWI和Undef异常返回使用:发发发发
movs pc, LR,从FIQ、IRQ和取止返回使用:发发发发发发发发发发
SUBS PC, LR,#4, 发发发发从数据异常返回使用:
SUBS PC, LR,#8
,2,LR有入:发发
在使用上述指令异常返回,如果发发发发LR之前被的使用发发发发发发LDM “?”,达到同效果。发 例如:LDMFD SP!, {PC}?
(2) OSIntCtxSw的写类类
在μC/OS-?中,任切只是的发发发发发发发发发发发发发发发发发发发发将理器寄存器保存到将被
挂起的任的堆中,并且发发发发发发发发发发发发发发发发发发发发发发发发发将更高先的任从堆中恢出来。
发发发发发发发发发发发发发发发发发发发发发发发发发发发于就状的任的堆构看起来就像生中断并将所有
的寄存器保存到堆中的情发发发发发发发发发发发发发形一。句,μC/OS-?要运行于就状的任发发发发发发发发发必要发发发发发发发发发发发发发发发发发发发发发发发发发做的事就是将所有理器寄存器从任堆中恢出
来,并且行中断的返回。其行流程如下所示:发发发发发发发发发发发发发发发发发发发
在μC/OS-?中,用任发发发发发发发发发发发发发发发发发度会用宏,或者函数,OS_TASK_SW,,,它是在μC/OS-?从低发发发发发发发发发发发发发发发发发发发发发先任切到最高先任被用的,μC/OS-?建发OS_TASK_SW,,通某发发发发发发发发发发发途径最用函数OSCtxSw,,。函数OSCtxSw,,是与系相发发发的,μC/OS-?提供的OSCtxSw,,函数原型如下:
OSCtxSw()原型的程序清发
void OSCtxSw(void)
{
保存理器寄存器发发发发发发;
将当前任的堆指保存到当前任的发发发发发发发发发发发发发发OS_TCB中,
OSTCBCur->OSTCBStkPtr = Stack pointer,
发发发发发用用定的OSTaskSwHook(),
OSTCBCur = OSTCBHighRdy,
OSPrioCur = OSPrioHighRdy,
发发发发发发发发发发得到需要恢的任的堆指,
Stack pointer = OSTCBHighRdy->OSTCBStkPtr,
发发发发发发发发发发发发发发发发发发发将所有理器寄存器从新任的堆中恢出来,
发行中断返回指令,
}
(2)OSStartHighRdy类 写
μC/OS-II的多任发发发发发发境由函数OSStart( ) 启。用在用函数之前,发发发发发发发发发发发发发必已发发发发发发发发发发发发发发建立了一个或更多任。OSStart()最用函数发发发发发OSStartHighRdy( )运行多任启发发发前先最高的任,而它最是用发发发发发发发发发发发发发发发发__OSStartHighRdy发发发发发发发发的,其代如下所示:__OSStartHighRdy
MSR CPSR_c, #(NoInt | SYS32Mode)
;告发uC/OS-II自身已运行发发发
LDR R4, =OSRunning
MOV R5, #1
STRB R5, [R4]
;发发发发发 用子函数
BL OSTaskSwHook
LDR R6, =OSTCBHighRdy
;取得新任的发发TCB指发
LDR R6, [R6]
B OSIntCtxSw_1
关关关关关于拍
IRQ是受μC/OS-II管理的中断,而于发发FIQ不做发发发发发发发发发理,是了提高FIQ的响发发发速度。由于各发ARM芯片的中断系不一,各个用的目发发发发发发发发发发发发发发发发发发发发板也不一,于
中断和发发发发发发发发发发发发发发发发发发发发发发发发发移植的代。此写了一个拍是需要一步宏,它是μC/OS-II for ARM7通用的中断服程序的与发发发发发发发C函数接口代。发发
中断服程序关关关
发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发发因中断生肯定是允中断的,所以如果用在清除中断源之前用μC/OS-II的系发发发发发发发发发发发发发发发发发发发发发发发服函数就很可能会造成芯片的中断系工作异常而
使程序工作异常。因此在函数始中断,或发发发发发发发发发发发发发发发者直接量OSEnterSum发1。如果用发发发发发发发发发发发发发发发发发发程序没有情况,不需要个操作。在行OS_EXIT_CRITICAL( )后,中断重新打
发发发发发发发发发发发发发发发发发发发发,如果在接下来的用理程序中生中断,就可以中断嵌套。中断服程序程如下所示:发发发发发发发发发发发发发
void ISR(void)
{
OS_ENTER_CRITICAL()或直接量发发发OsEnterSum发1;
清除中断源;
发发发通知中断控制器中断束:
发 中断:
OS_EXIT_CRITICAL();
发发发发发用理程序;
}
关关关关写用任
发发发以上,步ucos液晶可以在发发发发发发发发发发发发发发发发发发发发发发板上运行了,移植是一个辛而又漫的程,
不可能在几天之内就完成。到了一的,就可以用程序了。发发发发发发发发发发发发发发发步