freertos调度时间片设置范围
FreeRTOS操作系统配置参数说明

当然,如果没有使用内核方面的调试器,这个宏定义是没有意义的。
USE_APPLICATION_TASK_TAG
处于就绪状态的相同优先级任务使用时间片调度机制共享处理器时间。
MINIMAL_STACK_SIZE
此参数用于定义空闲任务的栈空间大小,单位字。默认128个字
MAX_TASK_NAME_LEN
定义任务名最大的字符数
USE_16_BIT_TICKS
系统时钟节拍计数使用TickType_t数据类型定义的。
图中描述了四个处于空闲优先级的任务,任务A、B和C是用户任务,任务I是空闲任务。上下文切换周期性的发生在T0、T1…T6时刻。当用户任务运行时,空闲任务立刻让出CPU,但是,空闲任务已经消耗了当前时间片中的一定时间。这样的结果就是空闲任务I和用户任务A共享一个时间片。用户任务B和用户任务C因此获得了比用户任务A更多的处理器时间。
USE_TASK_NOTIFICATIONS
设置USE_TASK_NOTIFICATIONS为Enable将会开启任务通知功能,有关的API函数也会被编译。设置宏USE_TASK_NOTIFICATIONS为Disabled则关闭任务通知功能,相关API函数也不会被编译。默认这个功能是开启的。开启后,每个任务多增加8字节RAM。
USE_PORT_OPTIMISED_TASK_SELECTION
FreeRTOS的硬件有两种方法选择下一个要执行的任务:通用方法和特定于硬件的方法。
Disabled:可以用于所有FreeRTOS支持的硬件;完全用C实现,效率略低于特殊方法;不强制要求限制最大可用优先级数。
【FreeRTOS操作系统教程】第17章 FreeRTOS系统时钟节拍和时间管理

即延迟时间的范围是:1- 0xFFFFFFFF
使用举例:
/* ********************************************************************************************************* * 函 数 名: vTaskLED * 功能说明: LED 闪烁 * 形 参: pvParameters 是在创建该任务时传递的形参 * 返 回 值: 无 * 优 先 级: 2 ********************************************************************************************************* */ static void vTaskLED(void *pvParameters) {
使用举例:
/* ********************************************************************************************************* * 函 数 名: vTaskTaskUserIF * 功能说明: 接口消息处理。 * 形 参: pvParameters 是在创建该任务时传递的形参 * 返 回 值: 无 * 优 先 级: 1 (数值越小优先级越低,这个跟 uCOS 相反) ********************************************************************************************************* */ static void vTaskTaskUserIF(void *pvParameters) {
freertos 定时器用法

freertos 定时器用法摘要:1.FreeRTOS 定时器简介2.定时器操作的基本步骤3.定时器应用实例正文:FreeRTOS 定时器用法FreeRTOS 是一款开源实时操作系统,提供了丰富的功能以支持各种实时应用。
在FreeRTOS 中,定时器是一个重要的组件,用于实现延时、调度等功能。
本文将详细介绍FreeRTOS 定时器的用法。
1.FreeRTOS 定时器简介FreeRTOS 定时器主要包括系统定时器、软件定时器和周期性定时器。
系统定时器由操作系统内核管理,用于操作系统任务调度等;软件定时器由用户进程创建和管理,用户可以自定义定时器行为;周期性定时器则是定时器的一种特殊形式,按照指定的时间间隔产生事件。
2.定时器操作的基本步骤(1) 配置定时器:在使用定时器前,需要对其进行初始化配置,包括设置定时器超时值、选择定时器类型等。
(2) 启动定时器:配置完成后,需要调用相应函数启动定时器。
对于系统定时器和软件定时器,可以使用`xTimerStart()`函数启动;对于周期性定时器,在创建时设置` periodic`标志,系统将自动启动定时器。
(3) 处理定时器事件:定时器超时后,会触发相应的事件。
对于系统定时器,会触发系统任务调度;对于软件定时器,会触发用户进程中的回调函数;对于周期性定时器,会按照指定的时间间隔触发事件。
(4) 停止定时器:在定时器不再需要时,需要调用相应函数停止定时器。
对于系统定时器和软件定时器,可以使用`xTimerStop()`函数停止;对于周期性定时器,只需删除定时器即可。
3.定时器应用实例以下是一个简单的FreeRTOS 定时器应用实例,实现一个任务每秒打印一次“Hello, FreeRTOS!”。
```c#include "FreeRTOS.h"#include "task.h"#include "timers.h"#define TIMER_INTERVAL (1000 / portTICK_PERIOD_MS)void vPrintTask(void *pvParameters){for (;;){printf("Hello, FreeRTOS!");vTaskDelay(TIMER_INTERVAL);}}int main(void){// 创建并启动定时器xTimerCreate("PrintTaskTimer",pdMS_TO_TICKS(TIMER_INTERVAL), pdTRUE, NULL, vPrintTask);xTimerStart(xTimerGetHandleFromName("PrintTaskTimer"), NULL);// 创建并启动一个持续运行的任务xTaskCreate(vPrintTask, "PrintTask", 256, NULL, 1, NULL);// 开始调度任务vTaskStartScheduler();// 程序不会执行到这里return 0;}```在这个例子中,我们创建了一个软件定时器,每隔1 秒触发一次vPrintTask 任务。
Freertos之系统配置

Freertos转自:/html/42/t-2642.htmlfreeRTOS 配置在:FREERTOS_CONFIG.H 里面,条目如下:#ifndef FREERTOS_CONFIG_H#define FREERTOS_CONFIG_H/* Here is a good place to include header files that are required across y our application. */#include "something.h"/* 是否配置成抢先先多任务内核,是1的时候,优先级高的任务优先执行。
为0任务就没有优先级之说,用时间片轮流执行*/#define configUSE_PREEMPTION 1/* IDLE任务的HOOK函数,用于OS功能扩展,需要你自己编相应函数,名字是voi d vApplicationIdleHook( void ) */#define configUSE_IDLE_HOOK 0/* SYSTEM TICK的HOOK函数,用于OS功能扩展,需要你自己编相应函数,名字是void vApplicationTickHook(void ) */#define configUSE_TICK_HOOK 0/* 系统CPU频率,单位是Hz */#define configCPU_CLOCK_HZ 58982400/* 系统SYSTEM TICK每秒钟的发生次数,数值越大系统反应越快,但是CPU用在任务切换的开销就越多*/#define configTICK_RATE_HZ 250/* 系统任务优先级数。
5 说明任务有5级优先度。
这个数目越大耗费RAM越多*/#define configMAX_PRIORITIES 5/* 系统最小堆栈尺寸,注意128不是128字节,而是128个入栈。
比如ARM32位,1 28个入栈就是512字节*/#define configMINIMAL_STACK_SIZE 128/* 系统可用内存。
FreeRTOS-00-说明+基础知识

FreeRTOS-00-说明+基础知识1 说明本⽂仅作为学习FreeRTOS的记录⽂档,作为初学者肯定很多理解不对甚⾄错误的地⽅,望⽹友指正。
1.1 简介FreeRTOS是⼀个RTOS(实时操作系统)系统,⽀持抢占式、合作式和时间⽚调度。
适⽤于微处理器或⼩型微处理器的实时应⽤。
本⽂档使⽤的FreeRTOS版本:FreeRTOS Kernel V10.4.1参考⽂档:《FreeRTOS_Reference_Manual_V10.0.0.pdf》、《FreeRTOS_Real_Time_Kernel-A_Hands-On_Tutorial_Guide.pdf》、《STM32F4 FreeRTOS开发⼿册_V1.1.pdf》参考视频:1.2 测试⼯程说明测试环境为在Linux进⾏仿真跑FreeRTOS,关于如何实现在Linux下的FreeRTOS仿真说明如下:⽹上在linux下跑FreeRTOS的教程很多,这⾥我直接check了⼀份别⼈已经创建了的代码。
代码路径:或者去官⽹,按照官⽹说明创建也可以。
官⽹:编译之前需要先安装pcap开发包,不同的系统安装⽅式也不同,官⽹也给出了安装⽅式。
To install on ubuntu run$ sudo apt-get install libpcap-devTo install on rpm based system run$ sudo yum install libpcap-develor$ sudo dnf install libpcap-develTo install on MacOS run$ brew install libpcap编译⽅式:进⼊simulator⽬录,直接执⾏make即可。
运⾏⽅式:$ ./build/freertos-simulator2 FreeRTOS任务基础知识主要介绍任务管理。
从以下⼏个⽅⾯进⾏介绍:多任务系统、任务状态、任务优先级、任务实现、任务控制块、任务堆栈。
FreeRTOS任务运行时间统计方法分析与改进

F r e e R T O S任务运行时间统计方法分析与改进安云飞1,2,赵丙风1,2(1.中国电子科技集团公司第五十四研究所,石家庄050081;2.卫星导航系统与装备技术国家重点实验室)摘要:针对X i l i n x S D K开发工具生成F r e e R T O S支持包中未实现任务运行时间统计功能,分析了F r e e R T O S预留任务运行时间统计接口与实现方法,指出了现有接口和方法刻度粗糙㊁未统计中断处理时间㊁未考虑计数溢出㊁需要额外配置定时中断,并提出一种改进方法,包括用64b i t物理计时器替代定时中断㊁扩展计数值位宽㊁增加中断处理时间统计等㊂实验结果表明改进方法有效,可以全面真实地反映任务耗时情况㊂关键词:F r e e R T O S;实时操作系统;嵌入式系统;任务运行时间;C o r t e x A53中图分类号:T P316.2文献标识码:AA n a l y s i s a n d I m p r o v e m e n t o f F r e e R T O S T a s k R u n n i n g T i m e C o u n t i n g M e t h o dA n Y u n f e i1,2,Z h a oB i n g f e n g1,2(1.T h e54t h R e s e a r c h I n s t i t u t e o f C E T C,S h i j i a z h u a n g050081,C h i n a;2.S t a t e K e y L a b o r a t o r y o f S a t e l l i t e N a v i g a t i o n S y s t e m a n d E q u i p m e n t T e c h n o l o g y)A b s t r a c t:T h e f u n c t i o n o f t a s k r u n n i n g t i m e c o u n t i n g i s n o t i m p l e m e n t e d i n F r e e R T O SB S P o f X i l i n x S D K.T h i s p a p e r a n a l y z e s t h e F r e-e R T O S r e s e r v e d i n t e rf a c e a n d m e t h o d f o r t a s k r u n n i ng t i m e c o u n t i n g a n d p o i n t o u t th e d e f e c t s t h a t t h e a c c u r a c yi s r o u g h,t h e i n t e r r u p tf u n c t i o n r u n n i ng t i m e i s n o t c o u n t e d,th e c o u n ti n g o v e r f l o w i s n o t c o n s i d e r e d a n d a n a d d i t i o n a l t i m i n g i n t e r r u p t f u n c t i o n n e e d t o b e c o n-f i g u r e d.A n i m p r o v e d m e t h o d i s p r o p o s e d w h i c h u s e s a64-b i t p h y s i c a l t i m e r,e x t e n d s t h e c o u n t i n g b i t w i d t h,c o u n t s t h e r u n n i n g t i m e o f i n t e r r u p t f u n c t i o n,e t c.T h e e x p e r i m e n t r e s u l t s s h o w t h a t t h e i m p r o v e d m e t h o d i s e f f e c t i v e a n d c a n t r u l y a n d c o m p r e h e n s i v e l y r e f l e c t t h e t i m e-c o n s u m i n g o f o n e t a s k.K e y w o r d s:F r e e R T O S;r e a l-t i m e o p e r a t i n g s y s t e m;e m b e d d e d s y s t e m s;t a s k r u n n i n g t i m e;C o r t e x-A530引言R T O S(R e a l T i m e O p e r a t i n g S y s t e m)实时操作系统一般应用于嵌入式环境,特别适用于对事件响应速度有严格要求的场合㊂常用的R T O S有国外的F r e e R T O S㊁μC/O S㊁R T X,以及国内的H u a w e i L i t e O S和A l i O S T h i n g s等㊂其中,开源且免费的F r e e R T O S的市场占用率最高[1]㊂F r e e R T O S具有开源㊁精练㊁可移植㊁可裁剪等特点,受到各行各业嵌入式研发人员的喜爱,比如参考文献[2]~[7]分别将F r e e R T O S应用到了各自不同的领域㊂F r e e R T O S亦存在一些不足,参考文献[8]和[9]移植T L S F算法对内存管理机制进行改进,提高了内存分配速度并降低了内存碎片率㊂X i l i n x S D K虽然可以方便地生成F r e e R T O S支持包,但未移植任务运行时间统计功能㊂任务运行时间信息可以真实有效地反映各个任务的耗时情况,帮助开发人员判断任务优先级分配是否合理或者任务运行状态是否正常㊂F r e e R T O S预留了任务运行时间统计接口,但其实现方法具有诸多局限性,比如时间刻度计数不够精确㊁中断服务函数处理时间未统计㊁未考虑时间计数值溢出问题和需要额外配置一个定时器中断等㊂本文通过分析原方法,对其进行了相应改进㊂1F r e e R T O S任务运行时间统计接口F r e e R T O S提供了统计各个任务占用C P U时间的接口函数,可以知道系统中的各个任务占用C P U的时间,从而判断系统设计是否合理㊂1.1移植接口移植任务运行时间统计功能需要额外配置一个高频度定时器用于时间计数值(移植接口定义的表示时间进度的变量)累计,频率至少是时间片频度的10倍,否则无法有效评估任务运行时间,但是频率过大会增加C P U的负担㊂然后在t s k T C B结构体中增加u l R u n T i m e C o u n t e r变量,用于任务运行时间累计㊂任务切换入口处和出口处分别标记时间计数值,两次之差就是该任务的运行时间,累加到u l R u n T i m e C o u n t e r表征任务实际运行时间总和㊂具体移植接口如下:首先需要在F r e e R T O S C o n f i g.h 文件中将c o n -f i gG E N E R A T E _R U N _T I M E _S T A T S 定义为1㊂然后,需要实现如下两个宏定义:①p o r t C O N F I G U R E _T I M E R _F O R _R U N _T I M E _S T A T S:配制一个高精度定时器/计数器,提供时间基准,定时器频率至少是时间片频率的10倍㊂②p o r t G E T _R U N _T I M E _C O U N T E R _V A L U E :获取时间计数值,时间计数值依据p o r t C O N F I G U R E _T I M -E R _F O R _R U N _T I M E _S T A T S 配制的频率开始累计,一般在定时中断函数中实现㊂定义c o n f i g U S E _T R A C E _F A C I L I T Y 和c o n f i gU S E _S T A T S _F O R MA T T I N G _F U N C T I O N S 使能格式化输出函数v T a s k L i s t ()和v T a s k G e t R u n T i m e S t a t s(),用户可以将任务信息和任务运行时间信息格式化输出到指定字符串㊂1.2 任务运行时间统计流程F r e e R T O S 任务是以v T a s k S t a r t S c h e d u l e r ()函数启动的,之后系统调度内核开始工作㊂移植接口已经配置了一个至少10倍于时间片周期的定时中断,时间计数值在定时中断函数中累加㊂v T a s k S w i t c h C o n t e x t ()函数执行的是任务切换工作,在该函数内部获取当前时间计数值,如果当前计数值大于上次计数值,则计数值未溢出,可以累加任务运行时间到当前任务结构体成名变量u l R u n T -i m e C o u n t e r 中㊂切换到一下任务之前标记当前时间计数值,作为下一任务实际运行的入口时间,具体工作流程如图1所示㊂图1 F r e e R T O S 任务运行时间统计流程图1.3 现有任务时间统计的局限性分析以上现用F r e e R T O S 移植接口和工作流程,可以发现其任务运行时间统计具有诸多局限性:需要额外开启一个定时中断;刻度粗糙,增大定时中断频率可以细化刻度,但会增加C P U 负担;未对中断处理函数C P U 占用进行统计,中断处理时间实际累加到任务处理时间;u l R u n -T i m e C o u n t e r 定义为32位无符号整形,未充分考虑计数溢出的情况;任务运行时间统计的是总共的C P U 占用,无法统计一段时间的C P U 占用情况㊂2 改进的任务运行时间统计方法本文针对以上提及的F r e e R T O S 任务运行时间统计的诸多局限性进行了改进,采用的硬件平台为U l t r a S c a l e系列F P G A ,内嵌A R M C o r t e x A 53四核+R 5双核,开发环境为V i v a d o _S D K 2018.3,F r e e R T O S 版本为V 10.1.2㊂本文采用单核运行C o r t e x A 53,F r e e R T O S 为S D K 自动生成板级支持包㊂具体修改如下:①采用C o r t e x A 53自带64位物理定时器替代定时中断模式㊂定义如下两个宏定义:#d e f i n e p o r t C O N F I G U R E _T I M E R _F O R _R U N _T I M E _S T A T S ()X T i m e _S t a r t T i m e r ()#d e f i n e p o r t G E T _R U N _T I M E _C O U N T E R _V A L U E ()m f c p(C N T P C T _E L 0)第一个宏定义启动64位物理定时器;第二个宏定义获取时间计数值㊂该方法可以免去定时中断的使用㊂②采用100MH z ㊁64位物理定时器,时间刻度可到n s 级㊂因为未采用定时中断进行计数,因此提高定时器的频率不会额外增加C P U 的时间损耗㊂③中断服务函数v A p p l i c a t i o n I R Q H a n d l e r ()中入口和出口分别增加如下代码:i f (u l l P o r t I n t e r r u p t N e s t i n g ==1){//I R Q E n t r y u l T o t a l R u n T i m e=p o r t G E T _R U N _T I M E _C O U N T E R _V A L U E (); i f (u l T o t a l R u n T i m e >u l T a s k S w i t c h e d I n T i m e){ p x C u r r e n t T C B->u l R u n T i m e C o u n t e r +=(u l T o t a l R u n -T i m e -u l T a s k S w i t c h e d I n T i m e ); }u l T a s k S w i t c h e d I n T i m e =u l T o t a l R u n T i m e;}i f (u l l P o r t I n t e r r u p t N e s t i n g ==1){//I R Q E x i t u l T o t a l R u n T i m e =p o r t G E T _R U N _T I M E _C O U N T E R _V A L -U E (); i f (u l T o t a l R u n T i m e >u l T a s k S w i t c h e d I n T i m e){ u l I R Q R u n T i m e C o u n t e r+=(u l T o t a l R u n T i m e -u l T a s k S -w i t c h e d I n T i m e ); }u l T a s k S w i t c h e d I n T i m e =u l T o t a l R u n T i m e;}u l l P o r t I n t e r r u p t N e s t i n g 表示中断嵌套层级,u l l P o r t -I n t e r r u p t N e s t i n g 为1表示当前中断无嵌套㊂ul I R Q R u n -T i m e C o u n t e r 为新定义64位变量,表示中断服务函数C P U 占用时间累计㊂④u l R u n T i m e C o u n t e r 定位为64位无符号整数㊂即使是100MH z 计数频率,也需要5000多年才会溢出㊂⑤t s k T C B 结构体中新增变量u l L a s t R u n T i m e -C o u n t e r,用于锁存某时刻之前的任务运行时间㊂v T a s k G e t I n f o ()函数中p x T a s k S t a t u s>u l R u n T i m e -C o u n t e r =p x T C B >u l R u n T i m e C o u n t e r;修改为:px T a s k S t a t u s >u l R u n T i m e C o u n t e r=p x T C B >u l R u n T i m e -C o u n t e r p x T C B >u l L a s t R u n T i m e C o u n t e r ;p x T C B >u l L a s t R u n T i m e C o u n t e r=p x T C B>u l R u n T i m e -C o u n t e r;v T a s k G e t R u n T i m e S t a t s ()实际调用v T a s k G e t I n f o ()采集任务运行时间信息,修改v T a s k G e t I n f o ()后,v T a s k G e t R u n T i m e S t a t s()可以统计两次调用之间的各个任务C P U 占用时间,具体实现过程如图2所示㊂图2 改进的任务运行时间统计方法流程图3 实验和分析本文分析了现有F r e e R T O S 任务运行时间统计接口及实现方法,指出了存在的不足,并提出了相应改进措施㊂下面将通过实验验证改进方法的有效性㊂3.1 任务运行时间统计精度实验设置F r e e R T O S 时间片周期为1000H z,原方法需要配置的定时中断周期为20k H z ,改进方法需要设置的物理定时器周期为100MH z ,F P G A 每10m s 生成一个外部中断,A R M C o r t e x A 53接收10m s 外部中断并触发任务1㊂任务1精确延时5m s 内随机时间每100次(即每秒)触发一次任务2,任务2调用v T a s k G e t R u n T i m e S -t a t s()按固定格式输出任务运行时间统计信息,计算任务1与实际延时时间的误差㊂原方法与改进方法统计的任务1运行时间精度如表1所列㊂表1 任务运行时间统计精度分析比较统计方法最大误差平均误差均方误差原F r e e R T O S 方法1.32%0.97%0.79%本文改进方法0.00%0.00%0.00%实验结果表明,改进方法采用100MH z 物理计时器,精度可达n s 级,可以更精确地统计任务运行时间㊂3.2 中断函数运行时间统计实验设置F r e e R T O S 时间片周期为1000H z ,原方法需要配置的定时中断周期为20k H z,改进方法需要设置的物理定时器周期为100MH z ,F P G A 每10m s 生成一个外部中断,A R MC o r t e x A 53接收10m s 外部中断,外部中断函数中精确延时5m s 并触发任务1㊂任务1每100次(即每秒)触发一次任务2,任务2调用v T a s k G e t R u n T i m e S t a t s ()按固定格式输出任务运行时间统计信息㊂原方法与改进方法统计的空闲任务和中断函数运行时间如表2所列㊂表2 中断函数运行时间统计分析与比较统计方法中断运行时间空闲任务运行时间原F r e e R T O S 方法 100%本文改进方法50%50%实验结果表明,原F r e e R T O S 方法未能有效统计中断函数运行时间,而误将中断函数运行时间统计到空闲任务中,改进方法可以有效统计中断函数运行时间㊂3.3 计数值溢出情况实验设置F r e e R T O S 时间片周期为1000H z,原方法需要配置的定时中断周期为20k H z,改进方法需要设置的物理定时器周期为100MH z ,F P G A 每10m s 生成一个外部中断,A R MC o r t e x A 53接收10m s 外部中断并触发任务1㊂任务1每100次(即每秒)触发一次任务2,任务2调用v T a s k G e -t R u n T i m e S t a t s()按固定格式输出任务运行时间统计信息㊂原方法与改进方法统计的计数值溢出情况如表3所列㊂表3 计数值溢出情况分析与比较统计方法计数值溢出周期原F r e e R T O S 方法59.6h本文改进方法5.1e +7h 实验结果表明,原F r e e R T O S 方法未充分考虑计数值溢出情况,改进方法溢出周期为5.1e +7h,可以忽略㊂3.4 任务运行时间短时统计问题原F r e e R T O S 任务运行时间统计的是从开启任务调度后的累计结果,不利于分析短时的任务耗时异常㊂改进方法通过 做差 可以统计两次v T a s k G e t R u n T i m e S t a t s()之间的任务耗时情况,从而方便分析短时内出现的任务异常问题㊂4 结 语本文针对实时系统应用中对任务运行时间统计的迫切需求,基于U l t r a S c a l e 系列F P G A 平台分析了现有F r e eR T O S 的任务运行时间统计接口与实现方法,指出了其存在的若干不足,并对其进行了相应的改进㊂实验结果表明,改进方法有效,可以真实反映各个任何和中断的耗时情况㊂本文提及的改进方法亦可以应用于其他R T O S 类系统㊂参考文献[1]刘火良,杨森.F r e e R T O S 内核实现与应用开发实战指南[M ].北京:机械工业出版社,2019.[2]刘林.基于F r e e R T O S 的智能插座管理系统的设计与实现[D ].长沙:湖南大学,2015.[3]魏均.基于F r e e R T O S 嵌入式系统的多媒体应用研究[D ].哈尔滨:哈尔滨工业大学,2008.[4]易文博,陈国平,管春.F r e e R T O S 在Z Y N Q 实时液晶显示系统中的应用[J ].现代电子技术,2020,43(22):1518.[5]宋华鲁,闫银发,张世福.基于S TM 32和F r e e R T O S 的嵌入式太阳能干燥实时监测和控制系统设计[J ].现代电子技术,2013,36(23):103109.[6]朱耀麟,樊佩.基于F r e e R T O S 的嵌入式云台控制系统设计[J ].电子技术应用,2015,41(5):2531.[7]郭开荣,温渤婴.F r e e R T O S 在微机继电保护试验装置中的应用[J ].继电器,2006,34(19):46.[8]何巍,何建忠.开源R T O S 内存管理机制分析和改进[J ].计算机工程,2010,36(10):6769.[9]刘林,朱青,何昭晖.F r e e R T O S 内存管理方案的分析与改进[J ].计算机工程与应用,2016,52(13):7680.安云飞㊁赵丙风(工程师),主要研究方向为嵌入式软件㊁卫星导航㊂通信作者:安云飞,1397026550@q q.c o m ㊂(责任编辑:薛士然 收稿日期:2021-01-11) 解决智能设备自身计算能力不足做出的初步探索,可以作为未来智能设备研究的参考㊂本文仍有一些需要改进的地方,如云端计算机获取树莓派摄像头视频流会有一些延迟,是否有更加快速的远程视频流读取方式;云端计算机采用目标检测算法处理图像的速度不够快,是否可以将主干网络替换成规模小㊁速度快的网络,如M o b i l e N e t;树莓派小车单一目标跟踪策略依然有缺陷,是否可以采用双网络模式,单独设立一个用于识别特定目标的网络㊂这些需要改进的地方将是未来研究的重点㊂参考文献[1]骆第含,赵子豪,岳有山.智能小车的发展现状和趋势[J ].河南科技,2017,23(625):9495.[2]李龙棋,方美发,唐晓腾.树莓派平台下的实时监控系统开发[J ].闽江学院学报,2014,35(5):6772.[3]周晓彦,王珂,李凌燕.基于深度学习的目标检测算法综述[J ].电子测量技术,2017(11):8992.[4]R e d m o n J ,F a r h a d i A.Y O L O 9000:B e t t e r ,F a s t e r ,S t r o n ge r [C ]//P r o c e e d i n g s of t h e I E E E C o n f e r e n c e o n C o m pu t e r V i -s i o n a n d P a t t e r n R e c o gn i t i o n ,2017:72637271.[5]R e d m o n J ,F a r h a d i A.Y O L O v 3:A n I n c r e m e n t a l I m pr o v e -m e n t [J ].a r X i v ,2018.[6]M j p g st r e a m e r [E B /O L ].[202103].h t t p s ://gi t h u b .c o m /j a c k s o n l i a m /m j p g st r e a m e r .[7]魏秀参.解析深度学习:卷积神经网络原理与视觉实践[M ].北京:电子工业出版社,2018.刘英明(讲师),主要从事嵌入式系统㊁物联网应用技术研究㊂通信作者:刘英明,w i s e 2014365@163.c o m ㊂(责任编辑:薛士然 收稿日期:2021-03-15)。
freertos调度算法描述

freertos调度算法描述FreeRTOS是一款开源的实时操作系统,广泛应用于嵌入式系统中。
它的调度算法是其核心功能之一,决定了任务的执行顺序和优先级。
本文将对FreeRTOS的调度算法进行描述。
FreeRTOS的调度算法基于优先级抢占式调度,即根据任务的优先级来决定任务的执行顺序。
每个任务都有一个优先级,优先级越高的任务将被优先执行。
当有多个任务具有相同的优先级时,采用时间片轮转的方式进行调度,即每个任务按照一定的时间片轮流执行。
在FreeRTOS中,任务的优先级范围是0到configMAX_PRIORITIES-1,其中configMAX_PRIORITIES是系统中支持的最大优先级数。
优先级为0的任务是系统空闲任务,用于处理系统空闲时的任务。
优先级为configMAX_PRIORITIES-1的任务是系统中最高优先级的任务。
FreeRTOS的调度算法是基于抢占式调度的,即当一个优先级更高的任务就绪时,会立即抢占当前正在执行的任务,将CPU资源分配给优先级更高的任务。
这种调度算法保证了高优先级任务的及时响应,提高了系统的实时性。
在FreeRTOS中,任务的调度是通过任务切换来实现的。
任务切换是指将CPU的控制权从当前任务切换到下一个任务的过程。
任务切换可以由多种事件触发,例如任务主动挂起、等待事件发生、时间片用完等。
当一个任务主动挂起或等待事件发生时,系统会自动进行任务切换,将CPU的控制权交给下一个就绪的任务。
FreeRTOS的调度算法还支持任务间的同步和通信。
任务间的同步可以通过信号量、互斥量、消息队列等机制实现。
任务间的通信可以通过消息队列、邮箱等机制实现。
这些机制可以保证任务之间的顺序执行和数据的正确传递,提高系统的可靠性和稳定性。
总结来说,FreeRTOS的调度算法是基于优先级抢占式调度的,通过任务切换实现任务的调度。
它能够根据任务的优先级来决定任务的执行顺序,保证高优先级任务的及时响应。
freertos合作式任务调度原理

freertos合作式任务调度原理FreeRTOS是一个开源的实时操作系统,它提供了一种合作式任务调度的机制。
合作式任务调度是一种任务调度方式,其中任务自愿地释放CPU控制权,让其他任务执行。
本文将详细介绍FreeRTOS 合作式任务调度的原理和工作方式。
在FreeRTOS中,每个任务都有一个优先级。
任务的优先级决定了任务在调度时的执行顺序。
优先级越高的任务将先于优先级较低的任务执行。
当多个任务具有相同的优先级时,FreeRTOS使用一种循环调度算法,确保任务能够公平地获取CPU资源。
在合作式任务调度中,任务之间不会被强制中断,而是由任务自愿地释放CPU控制权。
当一个任务完成它的工作或等待某个事件发生时,它会主动调用一个特殊的函数,将CPU控制权交给其他任务。
这个特殊的函数在FreeRTOS中被称为任务挂起函数。
任务挂起函数可以是任务主动进入休眠状态,等待某个事件的发生。
一旦这个事件发生,任务就会被唤醒,并重新开始执行。
任务挂起函数也可以是任务主动放弃CPU控制权,让其他任务执行。
这种方式可以确保高优先级任务不会被低优先级任务长时间占用CPU资源。
任务挂起函数的调用是由任务自主决定的。
当一个任务调用任务挂起函数时,它会把CPU控制权交给调度器。
调度器会根据任务的优先级和其他因素,决定下一个要执行的任务。
调度器会选择一个优先级最高的就绪任务来执行。
如果没有就绪任务,调度器会选择一个空闲任务执行。
任务挂起函数的调用是一个轻量级的操作,它不会引入额外的开销。
这是因为FreeRTOS使用了一种基于堆栈的上下文切换机制,它只保存和恢复任务的堆栈内容,而不涉及其他寄存器或系统状态的保存。
这使得任务挂起函数的调用非常高效,可以快速地切换任务。
合作式任务调度的一个重要概念是任务间通信。
在一个实时系统中,不同的任务可能需要相互协作,共享信息和资源。
FreeRTOS提供了一些机制来实现任务间通信,如信号量、消息队列和事件标志组。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
freertos调度时间片设置范围
一、什么是时间片
时间片(Time Slice)是指在多任务系统中,每个任务被分配到的执行时间。
在FreeRTOS中,时间片是以时间单位(通常是毫秒)来表示的。
每个任务在分配给它的时间片内执行,当时间片用完后,系统会进行任务切换,将CPU资源分配给下一个任务。
二、为什么需要设置时间片
在一个多任务系统中,不同的任务可能具有不同的优先级和执行时间要求。
如果不进行时间片的设置,那么系统会根据任务的优先级来进行调度,高优先级任务会一直占用CPU资源,低优先级任务无法得到执行。
这样会导致低优先级任务无法及时响应,影响系统的实时性能。
为了解决这个问题,FreeRTOS引入了时间片的概念。
通过设置时间片,可以让高优先级任务和低优先级任务都能得到执行的机会,从而保证系统的实时性能。
同时,时间片的设置还可以根据任务的需求进行调整,以满足不同任务的实时性要求。
三、如何设置时间片
在FreeRTOS中,时间片的设置是通过任务控制块(TCB)中的uxTimeSlice字段来实现的。
uxTimeSlice字段是一个整型变量,用于表示任务分配到的时间片长度。
任务的时间片可以通过
vTaskPrioritySet函数进行设置,具体代码如下所示:
```
void vTaskPrioritySet( TaskHandle_t xT ask, UBaseType_t uxNewPriority );
```
其中,xTask为任务的句柄,uxNewPriority为任务的优先级。
在设置任务的优先级之后,可以通过vT askPrioritySet函数设置任务的时间片长度。
时间片的长度是以时间单位来表示的,具体数值根据任务的实时性要求和系统的性能来确定。
需要注意的是,时间片的设置只对具有相同优先级的任务有效。
对于不同优先级的任务,FreeRTOS会根据任务的优先级来进行调度,而不需要进行时间片的设置。
四、时间片设置的范围
时间片的设置范围取决于系统的时钟频率和任务的数量。
时间片的长度应该足够小,以便所有任务都能够及时响应,同时也不能太小,以免频繁进行任务切换,影响系统的性能。
通常情况下,时间片的长度可以设置为几十毫秒到几百毫秒之间。
具体的设置范围需要根据系统的实际情况来确定。
如果任务的响应时间要求较高,可以适当缩短时间片的长度;如果任务的响应时间
要求较低,可以适当延长时间片的长度。
需要注意的是,时间片的设置应该综合考虑系统的实时性要求和系统的性能。
时间片设置过长可能导致低优先级任务无法及时响应,时间片设置过短可能导致频繁的任务切换,影响系统的性能。
因此,在设置时间片时需要进行合理的权衡和调整。