您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 创业/孵化 > FreeRTOS编程指南
FreeRTOS使用指南繁星电子开发团队制作作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。FreeRTOS的内核可根据用户需要设置为可剥夺型内核或不可剥夺型内核。当FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行效率FreeRTOS对系统任务的数量没有限制。一变量类型定义#defineportCHARchar#defineportFLOATfloat#defineportDOUBLEdouble#defineportLONGlong#defineportSHORTshort#defineportSTACK_TYPEunsignedportLONG#defineportBASE_TYPElongGeneratedbyFoxitPDFCreator©FoxitSoftware二任务函数任务创建头文件:task.hportBASE_TYPExTaskCreate(pdTASK_CODEpvTaskCode,指向任务的实现函数的指针。效果上仅仅是函数名constportCHAR*constpcNane,具有描述性的任务名。FreeRTOS不会使用它。unsignedportSHORTusStackDepth,指定任务堆栈的大小void*pvParameters,指针用于作为一个参数传向创建的任务unsignedportBASE_TYPEuxPriority,任务运行时的优先级xTaskHandle*pvCreatedTask用于传递任务的句柄,可以引用从而对任务进行其他操作。)说明:1.这里的任务是指一个永远不会退出的C函数,通常是一个死循环。2.pcNane其只是单纯地用于辅助调试。应用程序可以通过定义常量config_MAX_TASK_NAME_LEN来定义任务名的最大长度——包括’\0’结束符。如果传入的字符串长度超过了这个最大值,字符串将会自动被截断3.usStackDepth这个值指定的是栈空间可以保存多少个字(word),而不是多少个字节(byte)。栈空间大小为usStackDepth*4(bytes)。4.uxPriority优先级的取值范围可以从最低优先级0到最高优先级(configMAX_PRIORITIES–1)。返回:1.pdPASS表明任务创建成功,准备运行。2.errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY由于内存堆空间不足,FreeRTOS无法分配足够的空间来保存任务结构数据和任务栈,因此无法创建任务。任务删除头文件:task.hvoidvTaskDelete(xTaskHandlepxTask处理要删除的任务。传递NULL将删除自己)说明:1.FreeRTOSConfig.h中的INCLUDE_vTaskDelete=1,这个函数才能用。从RTOS实时内核管理中移除任务。要删除的任务将从就绪,封锁,挂起,事件列表中移除。2.任务被删除后就不复存在,也不会再进入运行态3.空闲任务负责释放内核分配给已删除任务的内存。使用提示:只有内核为任务分配的内存空间才会在任务被删除后由空闲任务自动回收。任务自己占用的内存或资源需要由应用程序自己显式地释放GeneratedbyFoxitPDFCreator©FoxitSoftware任务延时头文件:task.hvoidvTaskDelay(portTickTypexTicksToDelay时间数量,调用任务应该锁住的时间片周期)说明:1.FreeRTOSConfig.h中的INCLUDE_vTaskDelay=1,这个函数才能用。2.延时任务为已知时间片,任务被锁住剩余的实际时间由时间片速率决定。portTICK_RATE_MS常量以时间片速率来计算实际时间3.vTaskDelay()指定一个任务希望的时间段,这个时间之后任务解锁。4.vTaskDelay()不提供一个控制周期性任务频率的好方法,和其他任务和中断一样,在调用vTaskDelay()后将影响频率提示:vTaskDelayUntil(),这个交替的API函数设计了执行固定的频率。它是指定的一个绝对时间(而不是一个相对时间)后,调用任务解锁。--------可以实现周期性任务执行。任务延迟到指定时间头文件:task.hvoidvTaskDelayUntil(portTickType*pxPreviousWakeTime,指定一个变量来掌握任务最后开启的时间,第一次使用时必须使用当前时间来初始化,在vTaskDelayUntil中,这个变量是自动修改的portTickTypexTimeIncrement循环周期时间)说明:1.FreeRTOSConfig.h中的INCLUDE_vTaskDelayUntil=1,这个函数才能用。2.延时一个任务到指定时间,这个和vTaskDelay()不同,vTaskDelay是延时一个相对时间,而vTaskDelayUntil是延时一个绝对时间3.常量portTICK_RATE_MS用来计算时间片频率的实时时间-按照一个时间片周期4.任务将在一定时间开启(*pxPreviousWakeTime+xTimeIncrement)。使用相同的xTimeIncrement参数值来调用vTaskDelayUntil()将使任务按固定的周期执行。注意:vTaskDelayUntil()如果指定的苏醒时间使用完,将立即返回。因此,一个使用vTaskDelayUntil()来周期性的执行的任务,如果执行周期因为任何原因(例如任务是临时为悬挂状态)暂停而导致任务错过一个或多个执行周期,那么需要重新计算苏醒时间。通过检查像pxPreviousWakeTime可变的参数来组织当前时间片计数。然而在大多数使用中并不是必须的。使用提示:如果一个任务想按固定的频率运行,如让一个LED灯,按1KHz频率运行,如果只有一个任务那么调用vTaskDelay或vTaskDelayUntil都能完成,但是如果有多个任务,vTaskDelay就不行了,因为优先级或其它问题,它不知道什么时候再能运行,因此其不是周期执行,也就谈不上固定频率了,这时就要用vTaskDelayUntil这个函数了GeneratedbyFoxitPDFCreator©FoxitSoftware获得任务优先级头文件:task.hunsignedportBASE_TYPEuxTaskPriorityGet(xTaskHandlepxTask需要处理的任务.当传递NULL时,将返回调用该任务的优先级)说明:FreeRTOSConfig.h中的INCLUDE_vTaskPriorityGet=1,这个函数才能用返回:pxTask的优先级设置任务优先级头文件:task.hvoidvTaskPrioritySet(xTaskHandlepxTask,需要设置优先级的任务。当传递NULL,将设置调用任务的优先级unsignedportBASE_TYPEuxNewPriority任务需要设置的优先级)说明:FreeRTOSConfig.h中的INCLUDE_vTaskPrioritySet为1,才能使用此函数.如果设置的优先级高于当前执行任务的优先级,则上下文切换将在此函数返回前发生挂起任务头文件:task.hvoidvTaskSuspend(xTaskHandlepxTaskToSuspend处理需要挂起的任务。传递NULL将挂起调用此函数的任务)说明:FreeRTOSConfig.h中的INCLUDE_vTaskSuspend为1,才能使用此函数。当挂起一个任务时,不管优先级是多少,不需要占用任何微控制器处理器时间。调用vTaskSuspend不会累积——即:在同一任务中调用vTaskSuspend两次,但只需要调用一次vTaskResume()就能使挂起的任务就绪唤醒挂起的任务头文件:task.hvoidvTaskResume(xTaskHandlepxTaskToResume就绪任务的句柄)说明:FreeRTOSConfig.h中的INCLUDE_vTaskSuspend为1,才能使用此函数。必须是调用vTaskSuspend()后挂起的任务,才有可能通过调用vTaskResume()从新运行从中断唤醒挂起的任务头文件:task.hportBase_TYPEvTaskResumeFromISR(xTaskHandlepxTaskToResum就绪任务的句柄)说明:FreeRTOSConfig.h中的INCLUDE_vTaskSuspendhe和INCLUDE_xTaskResumeFromISR都为1,才能使用此函数。vTaskResumeFromISR()不应该用于任务和中断同步,因为可能会在中断发生期间,任务已经挂起——这样导致错过中断。使用信号量最为同步机制将避免这种偶然性。返回:pdTRUE:如果唤醒了任务将引起上下文切换。pdFALSE:用于ISR确定是否上下文切换GeneratedbyFoxitPDFCreator©FoxitSoftware为任务分配标签值头文件:task.hvoidvTaskSetApplicationTaskTag(xTaskHandlexTask,将分配给标签值的任务。传递NULL将分配标签给调用的任务。pdTASK_HOOK_CODEpxTagValue分配给任务的标签值类型为pdTASK_HOOK_CODE允许一个函数指针赋值给标签,因此实际上任何值都可以分配)说明:FreeRTOSConfig.h中的onfigUSE_APPLICATION_TASK_TAG为1,这个函数才能可用。这个值仅在应用程序中使用,内核本身不使用它。xTaskCallApplicationTaskHookGeneratedbyFoxitPDFCreator©FoxitSoftware三:内核函数启动实时内核处理头文件:task.hvoidvTaskStartScheduler(void);说明:当vTaskStartScheduler()被调用时,空闲任务自动创建。如果vTaskStartScheduler()成功调用,这个函数不返回,直到执行任务调用vTaskEndScheduler()。如果可供给空闲任务的RAM不足,那么函数调用失败,并立即返回。停止实时内核运行头文件:task.hvoidvTaskEndScheduler(void);说明:所有创建的任务将自动删除,并且多任务(优先级或合作式)将停止。当vTaskStartScheduler()调用时,执行将再次开始,像vTaskStartScheduler()仅仅返回。注意:vPortEndScheduler()导致所有由内核分配的资源释放——但是不
本文标题:FreeRTOS编程指南
链接地址:https://www.777doc.com/doc-4878935 .html