SAFERTOS中文用户手册簿FreeRTOS.docx
- 文档编号:9790047
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:62
- 大小:222.58KB
SAFERTOS中文用户手册簿FreeRTOS.docx
《SAFERTOS中文用户手册簿FreeRTOS.docx》由会员分享,可在线阅读,更多相关《SAFERTOS中文用户手册簿FreeRTOS.docx(62页珍藏版)》请在冰豆网上搜索。
SAFERTOS中文用户手册簿FreeRTOS
Safertos用户手册
一、关于这个用户手册
1.说明
这是关于Safertos的文档说明,safertos是一个低开销、小型化、抢占式任务调度的实时操作系统。
SAFERTOS预先编译在ROM中,提供了一种独特的方式去快速开发可靠的高度集成的嵌入式系统。
嵌入式应用程序包含了SAFERTOS,这样应用程序就可以被结构化为一系列独立自主的任务。
在任何时间中任务调度器将会通过任务的优先级和当前状态来选择执行任务。
第一章,系统概述将会详细说明任务的执行。
这个文档将详细说明如何在ROM中来调用SAFERTOS。
SAFERTOS基于FREERTOS和OPENRTOS代码编写,SAFERTOS可以应用于通用实时操作系统和关键环境的任务。
2•应用在安全相关的系统
SAFERTOS在正式的和严格的流程中被开发。
这个流程被TuVSuD组织认定符合
SIL3级标准。
SAFERTOS开发中使用了这样的流程。
在没有相关组织的认证下使用SAFERTOS开发程序不代表你的程序符合SIL3级标准。
在没有相关认证下,你的程序
是不可靠和不安全的。
3.文档概述
涉及围
工程师在安全和商用关键领域应用团队中工作必须要有足够的训练或者足够的经验去
满足职责的胜任。
本文档假定在读者已经了解概念和多任务操作系统,所以这些基本概念将被忽略。
详细信息在FREERTOS中可以查询到。
叹号表明在一些需要注意的地方提醒读者。
4.目录容
第一章,“系统概述”提供了SAFERTOS的概述和描述了SAFERTOS的任务、队列、信号量、调度器。
第二章,“安装”描述了安装和在你的应用中安装SAFERTOS所需要的。
第三章,“API相关”提供了SAFERTOS的API函数。
第四章,“Stellaris?
ARM?
Cortex?
-M3处理器核特殊接口信息”提供了使用处理器核变量的信息。
注意:
用户不能够在SAFERTOS引用没有在第三章中API中包含的函数。
第一章系统概述
这章提供了SAFERTOS系统的概述
1.SAFERT0S的调度器总述
SAFERTOS抢占式实时调度器具有如下特点:
1.只要不超过存容量,可以建立任意多的任务数量。
2.每个任务被分配优先级从0到10,0为最低优先级。
SAFERTOS的源代码(相对于ROM中的版本)不限制优先级的数量。
3.任务调度器将执行最高优先级的任务。
4.相同优先级的每个任务将分享处理器的处理时间。
时间分片将被使用。
5.任务可以被锁定一个固定的时间。
6.任务可以锁定去等待一个绝对精确的时间。
7.任务可以锁定在一个精确的时间区间去等待队列事件。
8.队列可以在任务之间、任务和中断函数之间传递数据。
9.消息可以用于一个任务和其他任务的同步,同步任务和中断服务周期。
10.信号可以用来确保相互排斥的对共享资源的访问。
2.SAFERTOS和OPENRTOS的不同
虽然SAFERTOS和OPENRTOS有着许多相同点,但是开发过程必须要指出值得注意的不同
点。
通常下SAFERTOS不执行动态存分配,SAFERTOS执行参数数量和数据有效性检查。
SAFERTOS是OPENRTOS的静态子集,OPENRTOS向SAFERTOS转换在其他的技术文档中。
3.设计目标
SAFERTOS的设计目标是实现既定功能使用一种小型的,简单的,(和最重要的是)鲁棒
实施。
4.编码
这个部分将定义使用SAFERTOSAPI的编码。
1.工程定义
每个C文件使用API必须包含SAFERTOS.h头文件。
这个头文件包含了ProjDefs.h头文件,
这个头文件包含了如下定义:
Table1^1.ProjectDefinitions
Definition
Value
pdTRUEa
1
pdFALSE
0
pdPASS
1
pdFAIL
0
a.TheJpdprefixdenotesthattheconstantisdefinedwithintheProjDefs.hheaderfieTheProjDefs.hheaderfilealsocontainserrorcodedefinitionsthatbeginwiththeerrprefix
Table1-2.Port-DependentDefinitions
Definition
Value
partCHAR
char(type)
portLONG
long(type)
portSHORT
short(type)
pdrtBASE_nrPE
Port-dependenta-definedtobethemostelTicienttypeforthe
architecture
portMAX_DELAY
Port-de[>en(lent
portDckType
Port-uependent
a.Port-dependentvaluesaredescribedinChapter4,'Stellaris*®ARM®Cortex™-M3ProcessorCorePort-Specificlnforrnation:
onpage73,
2.命名转换
Table1-3.NamingConventions
ParameterName
Prefix
Vanables
portCHAR
c
portSHORT
s
portLONG
1
portBASE_TYPE
X
structures,andsoon
X
void
v3
Pointers
——
Pb
Unsignedvariables
—
a.Forexample,pointerstovoidandvoidfunctions.
b.Forexample,apointertoashortwillhavetheprefixpsrapointertovoidwillhavetheprefixpv,andsoon.
c.Forexample,anunsignedshortwillhavetheprefixus
•历史上的函数名通常以他们返回值类型作为前缀。
新增的有效性检查导致了几乎所有的API
函数将会有返回值,这个值将会是portBASE_TYPE(前缀为‘x')。
这就可以想象函数前面有x表示它的返回值为portBASE_TYPE,如果为v表示,返回为空。
API函数也将包含与它相关的特性为前缀,例如Task或者Queue,举例说明:
xTaskGetTickCount(),xQueueSend()
•宏定义将会用大写字母表示。
例外是,错误代码将以err为前缀但是它包含在ProjDefs.h中。
系统组成
1.任务
你的应用使用了SAFERTOS,那么你的应用程序可被构建为多个独立自主的任务组成。
每个
任务在自己的环境执行和其他系统和调度器任务没有偶然的依赖关系。
2.任务函数
函数如果声明一个任务就必须以pdTASK_CODE类型
pdTASK_CODE声明如下:
typedefvoid(*pdTASK_CODE)(void*pvParameters);
voidvATaskFunction(void*pvParameters)
{
/*Thefunctionexecutesindefinitelysoenteraninfiniteloop.*/
for(;;)
{
/*--Taskapplicationcodegoeshere.--*/
}
}
任务函数不能够被终结通过返回调用(或使用exit())如果这样做了会导致未定义的行为。
如果需要函数使用如下例子:
voidvATaskFunction(void*pvParameters)
{
for(;;)
{
/*--Taskapplicationcodehere.--*/
}
/*Thetaskdeletesitself(indicatedbytheNULLparameter)
beforereachingtheendofthetaskfunction.*/xTaskDelete(NULL);
3.任务状态
在一个时间只有一个任务可以被执行,任务调度器将会执行任务根据优先级和当前的状
态。
任务会位于以下的状态之一中。
Table1-4.TaskStates
Taskst^te
Dascription
Ruining
Whenataskisactuallyexecutingitissaidtobeintl>eRunningstatelitisthetaskselectedbytheschedulertoexecuteandiscurrentlyutilizingtheprocessor.
Onlyonetaskcanbeintn已RunningsTateatanygiventime
Blocked
AtaskisintheBlocked$怕怕ifitiswaitingfaraneventThetaskcannotcontinueuntiltheeventoccursanduntilthattime,itcannotbeselectedbytheschedulerasthetasktoenteruieRunningstate.
TasksintheBloclkedstatealwayshaveatime-outperiod,afterwtiichthetaskbecomesunblocked.
Suspended
AtaskertierstneSuspend亡dstatewhenitisinesubjectofacantothexTaskSuspend()APIfunction,andremainsinineSuspendedstateuntilunsuspendedbyacalltothexTaskResume()APIftjnctionAtime-outperiodcannotbespecified.
ASuspendedstatetaskcannotbeselectedbyttieschedulerasthetasktoentertheRunningstate.
Ready
AtaskisintheReadystateifrtisabletoentertheRunningstate(itisnotintheBlockedorsuspendedstale),butisnotcurrentlyiretaskthatisselectedtoexecute.
TheonlytasksthatareavailabletotheschedulerforselecUonasthetaskhoentertheRunningstalearethosethatareinth亡Readystate.
Readyistheinitialstatewhenataskiscreated.
任务之间的转换
Figure仁1.ValidTaskStateTransitions
Suspended
xTaskResume()
called
每个任务在其自己环境中执行。
使一个任务从运行状态跳出,另一个任务进行运行状态叫做环境变换。
xTaskSuspend()API函数可以使任务从运行状态、阻塞状态、准备状态进入暂停状态。
xTaskDelay()和xTaskDelayUntil()API函数可以使任务从运行状态到阻塞状态去等待短
暂的事件,这个时间必须在等待的时间段。
xQueueSend(),xQueueReceive()API函数可以使任务从运行状态转换到阻塞状态去等
待消息队列中的事件。
这个事件可以使数据进入队列或者是数据从队列中移除。
4.任务优先级
系统将为每个任务设定优先级xTaskPriorityGet()函数去获得优先级,使用xTaskPrioritySet()去设定优先级。
0为最低优先级,10为最高优先级
5.任务调度器
其具有如下功能:
决定哪个任务将进入运行状态。
执行运行状态转换。
测试流失的时间。
将任务从阻塞状
态转换为准备状态。
6.时间测量
一个滴答时钟定时器将被用于时间的测量。
在连续的两个时钟中断下的时间段定义为一个节
拍。
所有的时间将以时钟节拍为测量单元。
vTasklnitializeScheduler()API中的
ulTickRateHz将定义有多少个ms在一个时钟节拍中。
7.调度策略
调度器将选择优先级最高的任务进入运行状态。
在阻塞状态和暂停状态下的任务将不能
够进入运行状态。
不同的任务可以赋值相同的优先级。
在这种情况下,具有相同优先级的任
务将轮流进入运行状态。
每个任务将最长运行在1个时钟节拍下,在其他相同的优先级的任
务进入运行状态之前。
注意:
这不表明,每个相同优先级的任务将获取相同系统处理时间。
8.启动调度器
使用xTaskStartScheduler()函数去启动任务调度器,在启动调度器之前必须要有一个任
务。
调用xTaskStartScheduler()函数将会启动一个idle任务。
Idle任务将不会进入阻
塞和暂停状态。
Idle任务的建立确保了系统在任何时刻都至少有一个任务进入运行状态。
Hook函数将会启动idle函数。
9.Yielding
10.调度器状态
Table1-5.SchedulerStates
SchedulerState
Description|
Inliialization
ThisIstheinitialstate,priortotneschedulerbeingstarted.
WhileintheInitializationstatetheschedulerhasnocontrolovertheapplicationexecution
TasksandqueuescanbecreatedwhiletheschedulerisintheInitializationstate
Active
WhileintheActivestatetheschedulercontrolstheapplicationexecutionbyselectingthetaskthatisintheRunningstateat且nygiventime
Suspend罚
TheSchedulerdoesnotperformanycontextswitcliingwlileintheSuspendedstateThetaskthatv/asintheRunningstatewhentheschedulerenteredtheSuspendedstate;villremainintrieRunningstateuntilthesctiedulerreturnstotheActivestate.
Figure1-2.ValidSchedulerStateTransitions
段代码必须以原子化运行(即没有其他任务和中断)才能保证代码的完整性,这样的代码
段叫做关键区域。
传统处理的方法是在进入关键区域之前关闭中断,在执行关键区域之后打
开中断。
taskENTER_CRITICAL(),taskEXIT_CRITICAL()宏定义就是为此设定的。
关键区域
将会使大于5包含5的中断优先级屏蔽掉。
执行关键代码段通过使用task_CRITICAL(),taskEXIT_CRITICAL(),的不利之处是无法对
大于5的优先级号作出反应。
任务暂停机制提供了另外一个方式去保证在关键区域不去关闭中断。
xTaskSuspendScheduler()函数将调度器从运行状态转换为暂停状态。
从而任务的转换
将不会发生。
在进入关键区域是始终保持只有一个任务持续的运行,直到使用xTaskResumeScheduler()调度器进入运行状态。
•在调度器进入暂停状态后,中断还是使能的。
使用调度器暂停在运行到关键区域时只
是防止调度器跳转到其他任务,而不是中断。
在调度器进入暂停状态中时,对于中断来存取
队列和信号量的操作是安全的。
•不使用调度器暂停也是可取的,在有更高优先级运行的任务中,使用调度器暂停将会
降低高优先级任务的反应速度。
11.任务间的通信
SAFERTOS提供了队列的形式去进行任务间的相互通信。
使用队列的机制将不会使用全
局变量这一形势去进行任务间的通信,或者是应用程序使用互斥源语去获取数据。
队列是可以灵活使用的,可以用于简单的数据交换,同步,信号行为。
队列的特点:
•在任何时刻队列可以拥有0或多个条目。
•当队列确定后,它所拥有的条目是可控的。
•发送条目到队列使用xQueueSend(),xQueueSendFromlSR().
•队列读取一个条目使用xQueueReceive(),xQueueReceiveFromlSR()
•队列是个FIFO结构。
•队列是以字节复制的形式获取数据。
队列事件
发送或读取队列数据称为队列事件。
•当使用xQueueSend()函数时,任务可以在阻塞状态被指定等待一段时间直到一个满的队列变为空。
任务将跳出阻塞状态当其他的任务或者中断取出一个条目从队列中。
•当使用xQueueReceive()函数是,任务可指定等待一个空的队列收到一个条目时间,
任务就会跳出阻塞状态。
•如果有多个任务等待事件,那第一个跳出阻塞状态的是优先级最高的任务。
如果优先级
相同那么为等待时间最长的任务。
12.数据格式
队列的数据事先定义一致,例如,结构体等。
如果条目过大,这最好是使用指针操作。
如果数据是通过复制的方式进行获取,必须确保获取数据是一致的,多个任务要获取数据必须协商一致,并且相互排斥。
13.使用队列去建立信-号量
队列建立信号量,可以保证在获取共有资源时,独自取用,不发生冲突。
被允许获得资源许可的任务将获取信号量,在完成获取资源后交回信号量。
另外的任务等待信号量。
队列可以设置为有一个条目,当任务取得这个条目时,队列为空,其他任务将不能够获取信号量从而等待。
当任务取得资源后,向队列发送条目,队列为满,其他的任务将可以获取条目,取得资源。
看例子:
portBASE_TYPExSemaphoreCreateBinary(xSemaphoreHandle
*xCreatedHandle)
{
/*Thefirsttwoparametersdefinethememorybuffertobeusedtoholdthecreatedsemaphore.1isthelengthofthequeuebeingcreated(1asthisisabinarysemaphore),0isthequeueitemsize.
pdPASSwillbereturnedifthesemaphoreiscreatedsuccessfully.*/
returnxQueueCreate(pcBuffer,uxBufferLengthBytes,1,0,xCreatedHandle);}
portBASE_TYPExSemaphoreTake(xSemaphoreHandlexSemaphore,portTickTYpexBlockTime)
{
/*Thequeueitemsizeiszerosowedonotneedtospecifythebufferintowhichthereceiveddatawillbeplaced,thereforeNULLispassed.pdPASSwillbereturnedifthesemaphoreissuccessfully'taken'.*/returnxQueueReceive(xSemaphore,NULL,xBlockTime);
}
portBASE_TYPExSemaphoreGive(xSemaphoreHandlexSemaphore)
{
/*Thequeueitemsizeiszerosowedonotneedtospecifythebufferfromwhichthesentdatawillberetrieved,thereforeNULLispassed.*/returnxQueueSend(xSemaphore,NULL,0);
}
Gatekeeper函数是一个用来管理共有资源的函数,举例说明:
有多个任务同时想向stdout
输出显示,stdout由gatekeeper来管理,任务想显示的信息被送入队列之中,gatekeeper
大多数时间在阻塞状态,当队列中有数据时,将其唤醒进入运行状态,进而显示队列中的信息。
xQueueHandlexPrintQueue-
intmain(void)
{
/*Greatsthe.Italengthiff5anditwnfiistequaltosiseof(char
*).*/
x^JueueCreaterpcQueueMemory(ldcBi_i£ferLengthBytestStsizeof(portCHAR*)(&xPiint-QUeue);
/*Willnotr#Achh*r*&tjthuscheduler1^nowtunningthetacks.*/return1;
}
/*Thegatekeepertaskimplementation.--/
voidvGateKeipei'Tiok(void*pvPariiti*terfl){
portCHAR
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SAFERTOS 中文 用户手册 FreeRTOS
![提示](https://static.bdocx.com/images/bang_tan.gif)