基于Si mu I ink的OSEK嵌入式软件开发方法

上传人:gg****m 文档编号:233973803 上传时间:2022-01-03 格式:DOCX 页数:10 大小:192.84KB
返回 下载 相关 举报
基于Si mu I ink的OSEK嵌入式软件开发方法_第1页
第1页 / 共10页
基于Si mu I ink的OSEK嵌入式软件开发方法_第2页
第2页 / 共10页
基于Si mu I ink的OSEK嵌入式软件开发方法_第3页
第3页 / 共10页
基于Si mu I ink的OSEK嵌入式软件开发方法_第4页
第4页 / 共10页
基于Si mu I ink的OSEK嵌入式软件开发方法_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《基于Si mu I ink的OSEK嵌入式软件开发方法》由会员分享,可在线阅读,更多相关《基于Si mu I ink的OSEK嵌入式软件开发方法(10页珍藏版)》请在金锄头文库上搜索。

1、基于Si mu I ink的OSEK嵌入式软件开发方法摘要 近年来,Y犁开发模式在汽车电子开发领域得以广泛应用,同时Matlab/Simulink及OSEK实时操作系统 规范已成为标准的开发平台,文章通过引入新的理念和方法将两者相结合。首先从分析软件的架构入乎,介绍了 Simulink模型中的任务识别、定时机制、基于UC/OSII的OSEK顺应性开发,以及在Mat lab环境下如何创建自 定义的驱动库等,最后通过应用实例验证了该开发方法的可行性。引言现在V型开发模式己成为使用最广的汽车软件开发流程标准。这一标准流程得到许多工具的支撑,有來自 Mathworks的工具,如用于功能开发和仿真的Ma

2、t lab / Simulink / Stateflow,用于自动代码生成的RealTimo Work shop,以及來自dSpace的工具。硬件有用于快速控制原型开发的AutoBox和用于硬件在环测试的模 块,软件有产品级代码生成器TargetLinko它们在加快开发周期的同时,也提高了代码的可靠性。平台软件方面,OSEK OS是广泛应用于汽车电子领域的嵌入式操作系统(RTOS)规范。它定义了一些基本的系统 服务,比如任务处理、中断服务程序(ISR)处理、资源管理、事件处理以及报警服务等。山上可知,将Matlab / Simulink的建模和仿贞环境在代码生成阶段与OSEK OS规范相结合,

3、将极大地方便开发。 这方面Mat lab已有针对OSEK / VDX的恢入式对象模块,TargetLink也实现了部分结合,但两者都局限于特定的硬 件,不能应用于不同的控制器和实时操作系统。1嵌入式软件开发理念符合基于模黑的开发和OSEK规范的软件架构如图1所示。以英飞凌XC164系列单片机为例,碘件层的核心部件 山RTOS提供的系统服务进行管理,外设部件山相应的驱动程序驱动。中间层(软件运行环境)包括两部分,操作系统和帔件驱动。操作系统采用顺应OSEK规范的y C / 0S-IK见3.1), 硕件外设驱动开发在后面作介绍。应用程序指的是与换件无关的软件,含控制算法和中断服务程序(ISR) o

4、控制算法完成控制任务,形式一般为 Simulink模型。该模型可以和被控对象模烈一起在闭环状态下完成功能仿真,同时也可以在代码生成阶段与破件驱 动以及操作系统API -起生成可在冃标破件上运行的程序。这里1SR可以有两种类型,可以是手写的C代码,也可 以是Simulink模型中的触发子系统。在该子系统中的触发源是图1中所示的皱件层外设。j怎甬层一 、I控制算法J iT中断廉务程序11软舛运行环境1 1OSEK K1XJS硬件驱动1I更件层L1CPU存储器;CANT/O111111定时器中断IADCJ图i 除入式软件架构2 MATLAB环境下代码生成流程实时工作空间(Real-Time Work

5、shop, RTW)代码生成流程包含下面几部分。 仿真和模型文件(model, mdl)。通过手动添加C语言S函数可以扩展Simulink模型库。 中间描述文件(model, rtw) o该文件描述了模塑中系统和各模块以及它们之间的联系,可以看作是模型文件 的分层式的描述库文件。 H标语言编译器(TLC)文件。曰标语言编译器读取model, rtw文件中的信息,将模型最终转化成源代码。TLC文件有两种形式,系统TLC文件和模块TLC文件。前者控制整个模型的代码生成,比如町以指定模型生成C 语言源代码,而后者仅针对对应的模块。对毎个于动添加的C语言S函数对象,必须有对应的模块TLC文件,才可 用

6、于代码生成。 生成的源代码。图2中列举了生成的主要源代码,其中model, c是model, mdl对应生成的算法源代码。| MatlabSimulinkC语占 S函数 * model.mdl 实时工作空间 |编译RT切TLC程序系统曰标文件 模块口标文件函数库f modcLrtw TLCmodel.c model.hm mode1_private.h图2 RTW代码生成流程旳畋;对于生成的源代码可对其芋动添加需要的ISR,或者整合一些成熟的C算法代码,然后在Keil环境下进行编译, 生成嵌入式可执行文件。下面将model, mdl看作应用程序來讨论。嵌入式应用程序主要完成两类任务,周期性任务

7、 和申件驱动型任务。后者通常以1SR处理。为了使Simulink模型能在RTOS中执行,必须将其划分成不同的任务 Targetlink中的任务划分如图3所示。 TargetLink 两种划分方式,默认方式和自定义方式。默认方式下,TargetLink将模型中所有周期性的具有相同采 样时间的子系统划归为独立任务,具有相同触发源的触发子系统结合在一起,要么和触发源一起归为同一任务,要 么独立成为新的任务。自定义方式下,用户通过在子系统中添加特殊的“任务模块”(见图3中的“TdskA”、Task B”、Task C”)來任意地划分任务。图3 Targetlink中的任务划分TriggerISR鉴于木

8、开发是基于Mat lab中针对OSEK / VDX的嵌入式对象模块TargetLink中的任务划分方式不能被直接移 植,因此采用函数调用子系统(function-cal 1 subsystem)作为独立任务的标识,如图4中的Task A和Task B模块。 同Simulink中其他离散模块一样,函数调用发生器育自C的采样时间,用以表明该了系统被执行的频度。模型中也 会有一些其他模块不在函数调用子系统内,如图4中的定时模块,以便与任务模块相区分。图4中ISR的部分采用 触发子系统,当触发条件满足时该子系统被执行。任务识别方法CD| Task A T Others 卜 YDml 1Call OST

9、aslQ)In2STrcatc ()11定时模块UutlTask BK2)Out2gTH-iCall OSTaskCreate 时3软件运行环境的开发3. 1 OSEK顺应性开发近来已有很多商业嵌入式操作系统符合OSEK规范,像Wind River的OSEKWorks、Elektrobit的Pro-OSEK,还 有ETAS的RTA-0SEK。鉴于成本方面的考虑,采用内核源代码开放的uC/OS-IHuC/OS-II和OSEK规范有许多共同点,比如都支持基于任务优先级的占先式调度,都有很好的吋移植性和可 裁剪性。但也存在不同之处,比如OSEK规范中的BCC2和ECC2顺应等级都支持同一优先级下的多

10、个任务,而LiC/ 0S-11仅支持同一优先级下一个任务;OSEK规范对互斥资源的访问采用最高优先级限度协议,而PC/0S-11采用互 斥信号議机制。参考文献【6在基于u C / OS-l I的OSEK顺应性移植方面进行了实际的开发。木文采用修改过的UC / OS-II作为OSEK的一个操作系统实例,來讨论模型的定时机制。3. 2定时机制Matlab/Simulink环境下RTw Embedded Coder默认采用多速率、多任务求解器来处理多采样时间的模型。在 生成的model, c文件中,有函数rate monotonic_sehed-uler()o该函数用于维护调度计数器,处理模型中不同

11、采 样时间模块的运行顺序。它实际上就是操作系统中经常提到的单调执行率调度法(RMS) oUC/0S-II中函数OSTicklSRO提供时间基准服务,用于判断任务等待以及超时。这个中断服务程序通常山破 件计时器驱动,中断频率在10100 Hz。在函数OS-TickISR()中调用了 OSTimeTick0用于处理任务等待。函数OSTicklSRO的代码见代码段1:OSTicklSR PROC INTERRUPT UCOS 0STicklSR=0x22BCLR IEN;关中断%SaveContext();上卜文进栈CALL OSIntEnterCALL OSTimeTick;计时器2中断请求位清零

12、#9E58H;巫载定时器至10 ms;上下文出栈;重开中断WeeQwitt 库BCLR GPT12E T2IC IRMOV GPT12E_T2CAI 丄 OSlntExit% RestoreContext()BSET IENRETIOSTicklSR ENDP为了将两者的定时策略相结合,可进行两处修改。第一,在u C / os-lI中保留函数OSTicklSRO,但是中断频 率不是如代码段1中所示的10 ms那样的固定值,而对不同的应用程序采用浮动的中断频率。这里取model, mdl 中所有采样时间的垠大公约数作为模型的时间基准。这样可以垠大限度地减小系统因周期性的时钟中断 OSTicklS

13、R()而造成的资源开销。第二,创建一个新任务IlighstPrioTask()o该任务具有最高的优先级,即任务 控制块TCB中0STCBPrio=0,这样在毎次产生任务调度时都能确保该任务获得CPU使用权。该任务可理解为在图1 中的任务子系统和定时模块之上的高一级的调度任务。其伪代码见代码段2(Pseudocode of added task lligh-stPrioTask):void HighstPrioTask( void * pdata) rate_monotonic_scheduler();if(rtmIsSampleHit () /model, c 中的接 口函数Run the T

14、iming blocks in Fig. 4 ;/运行定时模块If()STCBDly ! = 0) 检査其他任务延时,仍需延时OSTaskSuspend(OSTCBPrio);If(OSTCBDly = = 0)检査其他任务延时延时结束OSTaskResunie(OSTCBPrio);3. 3创建自定义驱动模块图1中软件运行环境的自定义开发可以分为两部分,一部分是实时操作系统的API驱动库的自定义开发,另一 部分是XC164系列单片机的设备驱动模块开发。两者都町利用参考文献4中提及的“自定义设备驷动”來描述。在 “白定义设备驱动”的开发中,开发者通过Matlub提供的S函数机制,为毎个模块需要

15、于动编写两个源文件,即 block, c和block, tlco其中block, c负责在仿真阶段进行模块初始化及模块输出的计算,同时在代码生成阶段 通过函数mdlRTW为model, rtw传递所需的参数。文件block. C中出现的主要函数有:mdl Initial izeSizes,用于细化SimStruct结构中不同参数的维数(SimStruct是指Simul ink数据结构, Sim-Struct及其相关的宋定义参见Mat lab目录卜文件sim-strue. h)。md llni tiali zeSamp 1 eT i me s,丿IJ于细化该模块的采样时间。mdlOutputs::对输入设备來讲,从硬件中读取值加以计算并传递到模块输出端:对输出设备而言,从上流 模块读取数据,加以处理并写冋碾件。文件block, tic用來控制代码生成过程.通过相应函数将语句写入生成的源文件中,代码段3是一个例了。文 件中使

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号