0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于μC/OS-II和Simulink开发环境实现OSEK顺应性软件的设计

电子设计 来源:单片机与嵌入式系统应用 作者:张永博,沈勇 2020-09-08 18:32 次阅读

引言

现在V型开发模式已成为使用最广的汽车软件开发流程标准。这一标准流程得到许多工具的支撑,有来自Mathworks的工具,如用于功能开发和仿真MatlabSimulink/Stateflow,用于自动代码生成的Real—TimeWorkshop,以及来自dSpace的工具。硬件有用于快速控制原型开发的AutoBox和用于硬件在环测试的模块,软件有产品级代码生成器TargetLink。它们在加快开发周期的同时,也提高了代码的可靠性。

平台软件方面,OSEK OS是广泛应用于汽车电子领域的嵌入式操作系统RTOS)规范。它定义了一些基本的系统服务,比如任务处理、中断服务程序(ISR)处理、资源管理、事件处理以及报警服务等。

由上可知,将Matlab/Simulink的建模和仿真环境在代码生成阶段与OSEK OS规范相结合,将极大地方便开发。这方面Matlab已有针对OSEK/VDX的嵌入式对象模块,TargetLink也实现了部分结合,但两者都局限于特定的硬件,不能应用于不同的控制器和实时操作系统。

1 嵌入式软件开发理念

符合基于模型的开发和OSEK规范的软件架构如图1所示。以英飞凌XC164系列单片机为例,硬件层的核心部件由RTOS提供的系统服务进行管理,外设部件由相应的驱动程序驱动。

中间层(软件运行环境)包括两部分,操作系统和硬件驱动。操作系统采用顺应OSEK规范的μC/OS-II(见3.1),硬件外设驱动开发在后面作介绍。

应用程序指的是与硬件无关的软件,含控制算法和中断服务程序(ISR)。控制算法完成控制任务,形式一般为Simulink模型。该模型可以和被控对象模型一起在闭环状态下完成功能仿真,同时也可以在代码生成阶段与硬件驱动以及操作系统API一起生成可在目标硬件上运行的程序。这里ISR可以有两种类型,可以是手写的C代码,也可以是Simulink模型中的触发子系统。在该子系统中的触发源是图1中所示的硬件层外设。

基于μC/OS-II和Simulink开发环境实现OSEK顺应性软件的设计

2 MATLAB环境下代码生成流程

实时工作空间(Real-Time Workshop,RTW)代码生成流程包含下面几部分。

①仿真和模型文件(model.mdl)。通过手动添加C语言S函数可以扩展Simulink模型库。

②中间描述文件(model.rtw)。该文件描述了模型中系统和各模块以及它们之间的联系,可以看作是模型文件的分层式的描述库文件。

③目标语言编译器(TLC)文件。目标语言编译器读取model.rtw文件中的信息,将模型最终转化成源代码。

TLC文件有两种形式,系统TLC文件和模块TLC文件。前者控制整个模型的代码生成,比如可以指定模型生成C语言源代码,而后者仅针对对应的模块。对每个手动添加的C语言S函数对象,必须有对应的模块TLC文件,才可用于代码生成。

④生成的源代码。图2中列举了生成的主要源代码,其中model.c是model.mdl对应生成的算法源代码。

对于生成的源代码可对其手动添加需要的ISR,或者整合一些成熟的C算法代码,然后在Keil环境下进行编译,生成嵌入式可执行文件。下面将 model.mdl看作应用程序来讨论。嵌入式应用程序主要完成两类任务,周期性任务和事件驱动型任务。后者通常以ISR处理。

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

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

3 软件运行环境的开发

3.1 OSEK顺应性开发

近来已有很多商业嵌入式操作系统符合OSEK规范,像Wind River的OSEKWorks、Elektrobit的Pro-OSEK,还有ETAS的RTA-OSEK。鉴于成本方面的考虑,采用内核源代码开放的 μC/OS-II。

μC/0S-II和OSEK规范有许多共同点,比如都支持基于任务优先级的占先式调度,都有很好的可移植性和可裁剪性。但也存在不同之处,比如OSEK规范中的BCC2和ECC2顺应等级都支持同一优先级下的多个任务,而μC/OS-II仅支持同一优先级下一个任务;OSEK规范对互斥资源的访问采用最高优先级限度协议,而μC/0S-II采用互斥信号量机制。参考文献[6]在基于μC/OS-II的OSEK顺应性移植方面进行了实际的开发。本文采用修改过的μC/OS-II作为OSEK的一个操作系统实例,来讨论模型的定时机制。

3.2 定时机制

Matlab/Simulink环境下RTw Embedded Coder默认采用多速率、多任务求解器来处理多采样时间的模型。在生成的model.c文件中,有函数rate_monotonic_sehed- uler()。该函数用于维护调度计数器,处理模型中不同采样时间模块的运行顺序。它实际上就是操作系统中经常提到的单调执行率调度法(RMS)。

μC/OS-II中函数OSTickISR()提供时间基准服务,用于判断任务等待以及超时。这个中断服务程序通常由硬件计时器驱动,中断频率在 10~100 Hz。在函数0S-TickISR()中调用了OSTimeTick()用于处理任务等待。

函数OSTicklSR()的代码见代码段1:

OSTicklSR PROC INTERRUPT UCOS_OSTicklSR=Ox22

为了将两者的定时策略相结合,可进行两处修改。第一,在μc/OS-II中保留函数OSTickISR(),但是中断频率不是如代码段1中所示的10 ms那样的固定值,而对不同的应用程序采用浮动的中断频率。这里取model.mdl中所有采样时间的最大公约数作为模型的时间基准。这样可以最大限度地减小系统因周期性的时钟中断OS—TickISR()而造成的资源开销。第二,创建一个新任务HighstPrioTask()。该任务具有最高的优先级,即任务控制块TCB中OSTCBPrio=0,这样在每次产生任务调度时都能确保该任务获得CPU使用权。该任务可理解为在图4中的任务子系统和定时模块之上的高一级的调度任务。其伪代码见代码段2(Pseudocode of added task High-

3.3 创建自定义驱动模块

图1中软件运行环境的自定义开发可以分为两部分,一部分是实时操作系统的API驱动库的自定义开发,另一部分是XCl64系列单片机的设备驱动模块开发。两者都可利用参考文献[4]中提及的“自定义设备驱动”来描述。在“自定义设备驱动”的开发中,开发者通过Matlab提供的S一函数机制,为每个模块需要手动编写两个源文件,即block.c和block.tlc。其中block.c负责在仿真阶段进行模块初始化及模块输出的计算,同时在代码生成阶段通过函数mdlRTW为model.rtw传递所需的参数。文件block.C中出现的主要函数有:

①mdlInitializeSizes,用于细化SimStruct结构中不同参数的维数(SimStruct是指Simulink数据结构,Sim- Struct及其相关的宏定义参见Matlab目录下文件sim-strue.h)。

②mdlInitializeSampleTimes,用于细化该模块的采样时间。

③mdlOutputs::对输入设备来讲,从硬件中读取值加以计算并传递到模块输出端;对输出设备而言,从上流模块读取数据,加以处理并写回硬件。

文件block.tlc用来控制代码生成过程,通过相应函数将语句写入生成的源文件中,代码段3是一个例子。文件中使用的函数主要包括:%function BlockTypeSetup(block,system)void、%function Start(block,system)Output、%function Outputs

4 应用实例

图5是一个简单的应用。其中建立了两个任务,任务ADC_SUM每0.1 S执行1次,任务ADC_GPIO每0.5 S执行1次。第一个任务包含一个ADC S函数模块。该S函数属输入设备,并被封装成具有图5所示的参数输入界面;第二个任务包含另外一个S函数模块,GPIO,在这个应用中为输出模块。

像第二部分描述的一样,算法可以进行仿真。仿真完成后可通过RTW生成代码(本文选择osekworks.tlc为系统TLC文件,并对该文件进行了适当修改)。生成的源代码(包括*.c源文件和*.h头文件)可以在Keil C166环境下联合编译并进行软件调试运行,如图6所示,这样也便于集成传统手动开发流程中成熟的算法代码。最终图6 Keil C166环境下编译带μo/os—ll的生成源代码代码可在目标硬件上运行。

5 结论

目前越来越多的汽车电子系统的开发借助Matlab/Simulink,并且其已变成标准的开发工具。本文提出的软件开发方法基于Sireulink环境和OSEK OS规范。在Simulink环境下开发的算法可以结合OSEK RTOS(本文为修改过的μC/OS-II)直接应用到目标硬件上。该方法已通过实例进行了验证,与传统方法比较极大地缩短了开发时间。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • matlab
    +关注

    关注

    175

    文章

    2922

    浏览量

    228433
  • 仿真
    +关注

    关注

    50

    文章

    3872

    浏览量

    132148
  • 操作系统
    +关注

    关注

    37

    文章

    6280

    浏览量

    121870
收藏 人收藏

    评论

    相关推荐

    μC/OS-II的特点

    的需要对它进行修改。缺点在于它缺乏必要的支持,没有功能强大的软件包,用户通常需要自己编写驱动程序,特别是如果用户使用的是不太常用的单片机,还必须自己编写移植程序。2.μC/OS-II是一个占先式的内核
    发表于 07-15 14:51

    uC/OS-II简介

    的接口部分是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用的操作系统,所以对于关键问题上的
    发表于 10-08 09:11

    uC/OS-II简介

    的接口部分是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用的操作系统,所以对于关键问题上的
    发表于 10-11 09:26

    uC/OS-II简介

    的接口部分是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用的操作系统,所以对于关键问题上的
    发表于 10-15 11:03

    uC/OS-II简介

    的接口部分是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用的操作系统,所以对于关键问题上的
    发表于 10-20 09:35

    uC/OS-II简介

    的接口部分是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用的操作系统,所以对于关键问题上的
    发表于 10-25 09:59

    uC/OS-II简介

    的接口部分是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用的操作系统,所以对于关键问题上的
    发表于 10-27 09:29

    μC/OS-II的移植方法

    概述嵌入式操作系统μC/OS-II是一个公开源代码的占先式多任务的微内核RTOS,其特点可以概括为以下几个方面:公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植好,可裁剪,可固化。内核
    发表于 07-25 08:14

    μC/OS-II的中断按键怎么处理?

    μC/OS-II是一个完整的、可移植、可裁减的占先式实时多任务内核。本文主要讨论了μC/OS-II环境下中断按键消抖处理及LCD多级菜单显示
    发表于 03-23 08:13

    【干货分享】μC/OS-II 软件定时器的分析与测试

    的应用。在 μC/OS-II 2.83 及其以后的版本中,一个较大的变化就是增加了对软件定时器的支持。这使得 μC/OS 实时操作系统的功能
    发表于 02-21 11:58

    μC/OS-II是什么?μC/OS-II有哪些应用?

    μC/OS-II的原理是什么?如何去改进μC/OS-II的调度算法?μC/OS-II有哪些应用?
    发表于 04-26 07:17

    如何实现μC/OS-II系统的移植?

    如何实现μC/OS-II系统的移植?
    发表于 04-28 06:01

    怎么实现基于μC/OS-II的CAN总线驱动程序的设计?

    怎么实现基于μC/OS-II的CAN总线驱动程序的设计?
    发表于 06-08 06:51

    μC/OS-II在PC机上移植的设计与实现

    本文介绍了μC/OS-II移植到PC机上的过程,使μC/OS-II应用系统程序在PC机上脱离DOS或Windows环境运行。着重介绍了Bootloader引导程序和EXE程序启动代码的设计与
    发表于 09-02 08:51 14次下载

    μC/OS-II在EP7312上的移植

    μC/OS-II在EP7312上的移植首先介绍μC/OS-II操作系统的特点,重点分析μC/OS-II在EP7312上的移植方法,介绍μC/OS-II在EP7312中的
    发表于 06-16 11:24 1037次阅读
    μC/<b class='flag-5'>OS-II</b>在EP7312上的移植