freertos资料整理_第1页
freertos资料整理_第2页
freertos资料整理_第3页
freertos资料整理_第4页
freertos资料整理_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用了半天时间对FreeRTOS有了一个初步的认识,大概总结一下,其中混杂了系统实现和实际应用方面的问题。现只是以应用为目的,实现方面待以后进一步研究。1.FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理。与平台有关的文件包含在portable文件夹中,主要是port.c, portmacro.h两个文件。平台无关的文件主要是:list.c(基本链表结构), queue.c(包括消息队列,信号量的实现), croutine.c,tasks.c(任务管理,时间管理)。命名协定RTOS内核与范例程序源代码使用下面的协定: 变量 char类型的变量以

2、c 为前缀 short类型的变量以 s 为前缀 long类型的变量以 l 为前缀 float类型的变量以 f 为前缀 double类型的变量以 d 为前缀 枚举变量以 e 为前缀 其他类型(如结构体)以 x 为前缀 指针有一个额外的前缀 p , 例如short类型的指针前缀为 ps 无符号类型的变量有一个额外的前缀 u , 例如无符号short类型的变量前缀为 us 函数 文件内部函数以prv为前缀 API函数以其返回值类型为前缀,按照前面对变量的定义 函数的名字以其所在的文

3、件名开头。如vTaskDelete函数在Task.c文件中定义 数据类型数据类型并不直接在RTOS内核内部引用。相反,每个平台都有其自身的定义方式。例如,char类型定义为portCHAR,short类型定义为portSHORT等。范例程序源代码使用的就是这种符号,但这并不是必须的,你可以在你的程序中使用任何你喜欢的符号。 此外,有两种额外的类型要为每种平台定义。分别是: portTickType可配置为16位的无符号类型或32位的无符号类型。参考API文档中的 定制部分获取详细信息。portBASE_TYPE为特定体系定义的最有效率的数据类型。 如果p

4、ortBASE_TYPE定义为char则必须要特别小心的保证用来作为函数返回值的signed char可以为负数,用于指示错误。 2. FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、 优先级最高的任务先运行。FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。 3.freertos既可以配置为可抢占内核也可以配置为不可抢占内核。当FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务

5、的CPU使用权,这样可保证系统满足实时性的要求;当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这 样可提高CPU的运行效率。 4.任务管理系统为每个任务分配一个TCB结构typedef struct tskTaskControlBlock volatile portSTACK_TYPE     *pxTopOfStack;/指向堆栈顶 xListItem    xGenericListItem;  

6、 /通过它将任务连入就绪链表或者延时链表或者挂起链表中, xListItem包含其TCB指针 xListItem    xEventListItem;/通过它把任务连入事件等待链表 unsigned portBASE_TYPE    uxPriority;/优先级 portSTACK_TYPE      *pxStack;           &#

7、160;  /指向堆栈起始位置 signed portCHAR     pcTaskName configMAX_TASK_NAME_LEN ;。省略一些次要结构 tskTCB; 系统的全局变量:static xList pxReadyTasksLists configMAX_PRIORITIES ; 就绪队列static xList xDelayedTaskList1;static xList xDelayedTaskList2; 两个延时任务队列static xList * volatile pxDelayedTaskL

8、ist;static xList * volatile pxOverflowDelayedTaskList; 两个延时队列的指针,应该是可互换的。static xList xPendingReadyList; static volatile xList xTasksWaitingTermination;   等待结束队列static volatile unsigned portBASE_TYPE uxTasksDeleted = ( unsigned portBASE_TYPE ) 0;  结束队列中的个数?static xList xSuspended

9、TaskList;   挂起队列static volatile unsigned portBASE_TYPE uxCurrentNumberOfTasks;记录了当前系统任务的数目static volatile portTickType xTickCount;是自启动以来系统运行的ticks数static unsigned portBASE_TYPE uxTopUsedPriority;记录当前系统中被使用的最高优先级,static volatile unsigned portBASE_TYPE uxTopReadyPriority;记录当前系统中处于就绪状态的最高优先级。

10、static volatile signed portBASE_TYPE xSchedulerRunning  ;表示当前调度器是否在运行,也即内核是否启动了 任务建立和删除,挂起和唤醒  5.时间管理     操作系统总是需要个时钟节拍的,这个需要硬件支持。freertos同样需要一个time tick产生器,通常是用处理器的硬件定时器来实现这个功能。(时间片轮转调度中和延时时间控制?)它周期性的产生定时中断,所谓的时钟节拍管理的核心就是这个定时中断的服务程序。freertos的时钟节拍isr中除去保存

11、现场,灰度现场这些事情外,核心的工作就是调用vTaskIncrementTick()函数。vTaskIncrementTick()函数主要做两件事情:维护系统时间(以tick为单位,多少个节拍);处理那些延时的任务,如果延时到期,则唤醒任务。 任务可用的延时函数:vTaskDelay();vTaskDelayUntil();特别之处在于vTaskDelayUntil()是一个周期性任务可以利用它可以保证一个固定的(确定的)常数执行频率,而vTaskDelay()无法保证。 6.任务间的通信(详见“FreeRTOS任务间通讯”)1)当然可以用全局变量的形式通信,但是不安全。2

12、)队列(xQueueHandle)是FreeRTOS中通信所需的主要数据结构。3)信号量(xSemaphoreHandle),有二进制信号量,计数信号量和互斥信号量,其都是以队列为基础结构建立。二进制信号量可以用于中断和任务间的同步。也就是说希望任务随外部中断而执行。即外设给出“数据已就绪”信号,系统中断,任务收到此中断信号接收数据。互斥一般用于都共享资源或数据结构的保护。因为任务调度不能保证数据不被破坏。当一个任务需要访问资源,它必须先获得 ('take') 令牌;当访问结束后,它必须释放令牌 - 允许其他任务能够访问这个资源。(对此还有待进一步实验研究)。7.系统配置fre

13、eRTOS 配置在:FREERTOS_CONFIG.H 里面,条目如下:/* 是否配置成抢先先多任务内核,是1的时候,优先级高的任务优先执行。 为0任务就没有优先级之说,用时间片轮流执行 */#define configUSE_PREEMPTION                1 /* IDLE任务的HOOK函数,用于OS功能扩展,需要你自己编相应函数, 名字是void vApplicationIdleHook( void ) */#

14、define configUSE_IDLE_HOOK                   0    /* SYSTEM TICK的HOOK函数,用于OS功能扩展,需要你自己编相应函数, 名字是 void vApplicationTickHook(void ) */ #define configUSE_TICK_HOOK    &

15、#160;            0 /* 系统CPU频率,单位是Hz */#define configCPU_CLOCK_HZ                  58982400  /* 系统SYSTEM TICK每秒钟的发生次数, 数值越大系统反应越快,但是CPU用在任务切换的开销就越

16、多 */#define configTICK_RATE_HZ                      250 /* 系统任务优先级数。5 说明任务有5级优先度。这个数目越大耗费RAM越多 */#define configMAX_PRIORITIES           

17、;           5  /* 系统最小堆栈尺寸,注意128不是128字节,而是128个入栈。比如ARM32位,128个入栈就是512字节 */ #define configMINIMAL_STACK_SIZE            128  /* 系统可用内存。一般设成除了操作系统和你的程序所用RAM外的最大RAM。 比如20KRA

18、M你用了2K,系统用了3K,剩下15就是最大HEAP 尺寸。你可以先设小然后看编译结果往大里加*/#define configTOTAL_HEAP_SIZE                       10240 /* 任务的PC名字最大长度,因为函数名编译完了就不见了,所以追踪时不知道哪个名字。16表示16个char */#define configMAX_TASK

19、_NAME_LEN             16 /* 是否设定成追踪,由PC端TraceCon.exe记录,也可以转到系统显示屏上 */#define configUSE_TRACE_FACILITY                  0 /* 就是SYSTEM TICK的长度,16是1

20、6位,如果是16位以下CPU, 一般选1;如果是32位系统,一般选0 */#define configUSE_16_BIT_TICKS                          0 /* 简单理解以下就是和IDLE TASK同样优先级的任务执行情况。建议设成1,对系统影响不大 */#define configIDLE_SHOULD

21、_YIELD                     1 /* 是否用MUTEXES。 MUTEXES是任务间通讯的一种方式,特别是用于任务共享资源的应用,比如打印机,任务A用的时候就排斥别的任务应用,用完了别的任务才可以应用 */#define configUSE_MUTEXES         

22、                            0   /*  确定是否用递归式的MUTEXES */#define configUSE_RECURSIVE_MUTEXES         &

23、#160;    0 /* 是否用计数式的SEMAPHORES,SEMAPHORES也是任务间通讯的一种方式 */#define configUSE_COUNTING_SEMAPHORES       0 /* 是否应用可切换式的API。freeRTOS 同一功能API有多个,有全功能但是需求资源和时间较多的,此项使能后就可以用较简单的API, 节省资源和时间,但是应用限制较多 */#define configUSE_ALTERNATIVE_API   &

24、#160;                   0    /* 此项用于DEBUG,来看是否有栈溢出,需要你自己编相应检查函数void vApplicationStackOverflowHook(xTaskHandle *pxTask, signed portCHAR *pcTaskName )  */#define configCHECK_FOR_STACK_OVE

25、RFLOW      0 /* 用于DEBUG,登记SEMAPHORESQ和QUEUE的最大个数,需要在任务用应用函数vQueueAddToRegistry()和vQueueUnregisterQueue()  */#define configQUEUE_REGISTRY_SIZE                    

26、0;   10  /* 设定可以改变任务优先度 */ #define INCLUDE_vTaskPrioritySet                               1  /* 设定可以查询任务优先度 */#defi

27、ne INCLUDE_uxTaskPriorityGet                              1  /* 设定可以删除任务 */ #define INCLUDE_vTaskDelete      &

28、#160;                                1    /* 据说是可以回收删除任务后的资源(RAM等)*/ #define INCLUDE_vTaskCleanUpResources  &#

29、160;              0  /* 设置可以把任务挂起 */#define INCLUDE_vTaskSuspend                           

30、;          1 /* 设置可以从中断恢复(比如系统睡眠,由中断唤醒 */#define INCLUDE_vResumeFromISR                              

31、;  1   /* 设置任务延迟的绝对时间,比如现在4:30,延迟到5:00。时间都是绝对时间 */#define INCLUDE_vTaskDelayUntil                                 

32、1  /* 设置任务延时,比如延迟30分钟,相对的时间,现在什么时间,不需要知道 */#define INCLUDE_vTaskDelay                                     

33、;      1  /* 设置 取得当前任务分配器的状态 */#define INCLUDE_xTaskGetSchedulerState                      1 /* 设置当前任务是由哪个任务开启的 */#define INCLUDE_xTaskGetCurrentTaskHandle

34、              1 /* 是否使能这一函数,还数的目的是返回任务执行后任务堆栈的最小未用数量,同样是为防止堆栈溢出 */#define INCLUDE_uxTaskGetStackHighWaterMark       0  /* 是用用协程。协程公用堆栈,节省RAM,但是没有任务优先级高,也无法和任务通讯 */#define configUSE_CO_ROUTIN

35、ES                                   0    /* 所有协程的最大优先级数,协程优先级永远低于任务。就是系统先执行任务,所有任务执行完了才执行协程。*/#define configM

36、AX_CO_ROUTINE_PRIORITIES          1 /*  系统内核的中断优先级,中断优先级越低,越不会影响其他中断。一般设成最低 */#define configKERNEL_INTERRUPT_PRIORITY            dependent of processor  /* 系统SVC中断优先级,这两项都在在M3和PIC3

37、2上应用 */#define configMAX_SYSCALL_INTERRUPT_PRIORITY  dependent on processor and application  #endif /* FREERTOS_CONFIG_H */配置FreeRTOSFreeRTOS 是高度可配置的。所有的可配置项都在FreeRTOSConfig.h 文件中。每一个Demo 程序中都包含了一个配置好的FreeRTOSConfig.h 文件,可以以Demo程序中的FreeRTOSConfig.h 文件作为模板,在其基础上加以修改。下面先给出一个典型的FreeRTOSC

38、onfig.h 文件,然后再逐项加以说明。cpp view plaincopy1. #ifndef FREERTOS_CONFIG_H  2. #define FREERTOS_CONFIG_H  3.   4. /* Here is a good place to include header files that are required across  

39、;5. your application. */  6. #include "something.h"  7.   8. #define configUSE_PREEMPTION                1  9. #define configUSE_IDLE_HOOK &

40、#160;               0  10. #define configUSE_TICK_HOOK                 0  11. #define configCPU_CLOCK_HZ 

41、                 58982400  12. #define configTICK_RATE_HZ                  250  13. #define con

42、figMAX_PRIORITIES                5  14. #define configMINIMAL_STACK_SIZE            128  15. #define configTOTAL_HEAP_SIZE &#

43、160;             10240  16. #define configMAX_TASK_NAME_LEN             16  17. #define configUSE_TRACE_FACILITY    

44、0;       0  18. #define configUSE_16_BIT_TICKS              0  19. #define configIDLE_SHOULD_YIELD           &

45、#160; 1  20. #define configUSE_MUTEXES                   0  21. #define configUSE_RECURSIVE_MUTEXES         0  22.

46、#define configUSE_COUNTING_SEMAPHORES       0  23. #define configUSE_ALTERNATIVE_API           0  24. #define configCHECK_FOR_STACK_OVERFLOW      

47、;0  25. #define configQUEUE_REGISTRY_SIZE           10  26. #define configGENERATE_RUN_TIME_STATS       0  27.   28. #define configUSE_CO_ROUTINES 

48、60;             0   29. #define configMAX_CO_ROUTINE_PRIORITIES     1  30.   31. #define configUSE_TIMERS          

49、          1  32. #define configTIMER_TASK_PRIORITY           3  33. #define configTIMER_QUEUE_LENGTH           

50、; 10  34. #define configTIMER_TASK_STACK_DEPTH        configMINIMAL_STACK_SIZE  35.   36. #define configKERNEL_INTERRUPT_PRIORITY         dependent of processor

51、  37. #define configMAX_SYSCALL_INTERRUPT_PRIORITY    dependent on processor and application  38.   39. #define configASSERT( ( x ) )           &

52、#160;   if( ( x ) = 0 ) vCallAssert( _FILE_, _LINE_ )  40.   41. #define INCLUDE_vTaskPrioritySet                1  42.

53、#define INCLUDE_uxTaskPriorityGet               1  43. #define INCLUDE_vTaskDelete                    

54、60;1  44. #define INCLUDE_vTaskSuspend                    1  45. #define INCLUDE_xResumeFromISR            

55、60;     1  46. #define INCLUDE_vTaskDelayUntil                 1  47. #define INCLUDE_vTaskDelay          

56、0;           1  48. #define INCLUDE_xTaskGetSchedulerState          1  49. #define INCLUDE_xTaskGetCurrentTaskHandle       1 

57、 50. #define INCLUDE_uxTaskGetStackHighWaterMark     0  51. #define INCLUDE_xTaskGetIdleTaskHandle          0  52. #define INCLUDE_xTimerGetTimerDaemonTaskHandle  0  

58、;53. #define INCLUDE_pcTaskGetTaskName               0  54.   55. #endif /* FREERTOS_CONFIG_H */  可配置的参数configUSE_PREEMPTION设为 1则采用抢占式调度器, 设为 0则采用协作式调度器。configUSE_IDLE_HOOK设为1

59、则使能 idle hook,设为0则禁止idle hook。configUSE_TICK_HOOK设为1则使能 tick hook,设为0则禁止tick hook。configCPU_CLOCK_HZ设置为 MCU 内核的工作频率,以Hz为单位。配置FreeRTOS的时钟Tick时会用到。对不同的移植代码也可能不使用这个参数。如果确定移植代码中不用它就可以注释掉这行。configTICK_RATE_HZFreeRTOS的时钟Tick的频率,也就是FreeRTOS用到的定时中断的产生频率。这个频率越高则定时的精度越高,但是由此带来的开销也越大。FreeRTOS 自带的Demo 程序中将TickR

60、ate 设为了1000Hz只是用来测试内核的性能的。实际的应用程序应该根据需要改为较小的数值。当多个任务共用一个优先级时,内核调度器回来每次时钟中断到来后轮转切换任务(round robin),因此,更高的Tick Rate 会导致任务的时间片“time slice”变短。configMAX_PRIORITIES程序中可以使用的最大优先级。FreeRTOS 会为每个优先级建立一个链表,因此没多一个优先级都会增加些RAM 的开销。所以,要根据程序中需要多少种不同的优先级来设置这个参数。configMINIMAL_STACK_SIZE任务堆栈的最小大小,FreeRTOS根据这个参数来给idle t

61、ask 分配堆栈空间。这个值如果设置的比实际需要的空间小,会导致程序挂掉。因此,最好不要减小Demo 程序中给出的大小。configTOTAL_HEAP_SIZE设置堆空间(Heap)的大小。只有当程序中采用FreeRTOS 提供的内存分配算法时才会用到。configMAX_TASK_NAME_LEN任务名称最大的长度,这个长度是以字节为单位的,并且包括最后的 NULL 结束字节。configUSE_TRACE_FACILITY如果程序中需要用到TRACE功能,则需将这个宏设为1。否则设为0。开启TRACE功能后,RAM占用量会增大许多,因此在设为1之前请三思。configUSE_16_BIT

62、_TICKS将 configUSE_16_BIT_TICKS设为 1后portTickType 将被定义为无符号的16位整形类型,configUSE_16_BIT_TICKS 设为0 后portTickType 则被定义为无符号的32位整型。configIDLE_SHOULD_YIELD这个参数控制那些优先级与idle 任务相同的任务的行为,并且只有当内核被配置为抢占式任务调度时才有实际作用。内核对具有同样优先级的任务会采用时间片轮转调度算法。当任务的优先级高于idle任务时,各个任务分到的时间片是同样大小的。但当任务的优先级与idle任务相同时情况就有些不同了。当configIDLE_SHO

63、ULD_YIELD 被配置为1时,当任何优先级与idle 任务相同的任务处于就绪态时,idle任务会立刻要求调度器进行任务切换。这会使idle任务占用最少的CPU时间,但同时会使得优先级与idle 任务相同的任务获得的时间片不是同样大小的。因为idle任务会占用某个任务的部分时间片。configUSE_MUTEXES设为 1 则程序中会包含mutex 相关的代码,设为 0 则忽略相关的代码。configUSE_RECURSIVE_MUTEXES设为 1 则程序中会包含recursive mutex 相关的代码,设为 0 则忽略相关的代码。configUSE_COUNTING_SEMAPHORE

64、S设为 1 则程序中会包含semaphore 相关的代码,设为 0 则忽略相关的代码。configUSE_ALTERNATIVE_API设为 1 则程序中会包含一些关于队列操作的额外API函数,设为 0 则忽略相关的代码。这些额外提供的API运行速度更快,但是临界区(关中断)的长度也更长。有利也有弊,是否要采用需要用户自己考虑了。configCHECK_FOR_STACK_OVERFLOW控制是否检测堆栈溢出。configQUEUE_REGISTRY_SIZE队列注册表有两个作用,但是这两个作用都依赖于调试器的支持:1.      &

65、#160; 给队列一个名字,方便调试时辨认是哪个队列。2.        包含调试器需要的特定信息用来定位队列和信号量。如果你的调试器没有上述功能,哪个这个注册表就毫无用处,还占用的宝贵的RAM空间。configGENERATE_RUN_TIME_STATS设置是否产生运行时的统计信息,这些信息只对调试有用,会保存在RAM 中,占用RAM空间。因此,最终程序建议配置成不产生运行时统计信息。configUSE_CO_ROUTINES设置为1则包含co-routines 功能,如果包含了co-routines

66、功能,则编译时需包含croutine.c 文件configMAX_CO_ROUTINE_PRIORITIESco-routines 可以使用的优先级的数量。configUSE_TIMERS设置为1则包含软件定时器功能。configTIMER_TASK_PRIORITY设置软件定时器任务的优先级。configTIMER_QUEUE_LENGTH设置软件定时器任务中用到的命令队列的长度。configTIMER_TASK_STACK_DEPTH设置软件定时器任务需要的任务堆栈大小。configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUP

67、T_PRIORITYCortex-M3, PIC24, dsPIC, PIC32, SuperH 和 RX600 的移植代码中会使用到 configKERNEL_INTERRUPT_PRIORITY.PIC32, RX600 和 Cortex-M系列 会使用到 configMAX_SYSCALL_INTERRUPT_PRIORITYconfigKERNEL_INTERRUPT_PRIORITY应该被设为最低优先级。对那些只定义了 configKERNEL_INTERRUPT_PRIORITY 的系统:configKERNEL_INTERRUPT_PRIORITY决定了FreeRTOS内核使用的

68、优先级。所有调用API函数的中断的优先级都应设为这个值,不调用API函数的中断可以设为更高的优先级。对那些定义了configKERNEL_INTERRUPT_PRIORITY 和configMAX_SYSCALL_INTERRUPT_PRIORITY的系统:configKERNEL_INTERRUPT_PRIORITY决定了FreeRTOS内核使用的优先级。configMAX_SYSCALL_INTERRUPT_PRIORITY决定了可以调用API函数的中断的最高优先级。高于这个值的中断处理函数不能调用任何API 函数。configASSERT宏configASSERT()的作用类似C语言标准

69、库中的宏assert(),configASSERT() 可以帮助调试,但是定义了configASSERT()后会增加程序代码,也会使程序变慢。以INCLUDE 开头参数以 'INCLUDE' 开头的宏允许我们将部分不需要的API 函数排除在编译生成的代码之外。这可以使内核代码占用更少的ROM 和RAM。比如,如果代码中需要用到 vTaskDelete 函数则这样写:#defineINCLUDE_vTaskDelete    1如果不需要,则这样写:#defineINCLUDE_vTaskDelete    0一、任务创

70、建1. xTaskCreatetask. h portBASE_TYPE xTaskCreate(                             pdTASK_CODE pvTaskCode,     

71、;                        const portCHAR * const pcName,                 

72、60;           unsigned portSHORT usStackDepth,                             void *pvPa

73、rameters,                             unsigned portBASE_TYPE uxPriority,            &

74、#160;                xTaskHandle *pvCreatedTask                           );创建新的

75、任务并添加到任务队列中,准备运行 Parameters: pvTaskCode 指向任务的入口函数. 任务必须执行并且永不返回 (即:无限循环).pcName 描述任务的名字。主要便于调试。最大长度由configMAX_TASK_NAME_LEN.定义usStackDepth 指定任务堆栈的大小 ,堆栈能保护变量的数目- 不是字节数. 例如,如果堆栈为16位宽度,usStackDepth定义为 100, 200 字节,这些将分配给堆栈。堆栈嵌套深度(堆栈宽度)不能超

76、多最大值包含了size_t类型的变量pvParameters 指针用于作为一个参数传向创建的任务uxPriority 任务运行时的优先级pvCreatedTask 用于传递一个处理引用创建的任务返回: pdPASS 是如果任务成功创建并且添加到就绪列中,另外错误代码在projdefs. H文件定义2. vTaskDeletetask. h void vTaskDelete( xTaskHandle pxTask );INCLUDE_vTaskDelete必须定义为1

77、,这个函数才能可用。查看配置部分获得更多信息。 从RTOS实时内核管理中移除任务。要删除的任务将从就绪,封锁,挂起,事件列表中移除。 注意:空闲任务负责释放内核分配给已删除任务的内存。因此,如果应用程序调用了vTaskDelete (),微控制器执行时间,空闲任务不假死是很重要的。内存分配给任务的代码不会自动释放,应该在任务删除之前。 参数: pxTask 处理要删除的任务。传递NULL将引起调用任务删除二、任务控制3. vTaskDelay task. h void vTaskDel

78、ay( portTickType xTicksToDelay );INCLUDE_vTaskDelay必须设置为1,这个函数才为可用。参考配置获得更多信息。 延时任务为已知时间片。任务被锁住剩余的实际时间由时间片率决定。portTICK_RATE_MS常量用来用来从时间片速率(一片周期代表着分辨率)来计算实际时间。 vTaskDelay()指定一个任务希望的时间段,这个时间之后(调用vTaskDelay() )任务解锁。例如,指定周期段为100时间片,将使任务在调用vTaskDelay()100个时间片之后解锁。vTaskDelay(

79、)不提供一个控制周期性任务频率的好方法,像通过代码采取的路径,和其他任务和中断一样,在调用vTaskDelay()后 影响频率,因此任务所需的时间下一次执行。 参考 vTaskDelayUntil() ,这个交替的API函数设计了执行固定的频率。它是指定的一个绝对时间(而不是一个相对时间)后,调用任务解锁。 参数: xTicksToDelay 时间数量,调用任务应该锁住的时间片周期4. vTaskDelayUntiltask. h void vTaskDelayUntil( 

80、portTickType *pxPreviousWakeTime, portTickType xTimeIncrement );INCLUDE_vTaskDelayUntil 必须定义为1,此函数才能用。参考配置获得更多信息。 延时一个任务到指定时间。这个函数用在循环任务以确保一定频率执行。这个函数在一个重要方面上不同于vTaskDelay(),vTaskDelay() 指定的这个时间(任务希望开启)是与vTaskDelay() 有关,而vTaskDelayUntil() 指定是一个绝对时间(任务希望开启

81、) vTaskDelay()中断任务从调用这个函数开始到指定时间。很难使用vTaskDelay()自身来产生一个固定的执行频率,因为:随着调用vTaskDelay()一个任务开启的时间和任务下一次调用vTaskDelay()的时间,这两者之间可能不是固定的【任务可能采取不同方式,可能通过调用,可能来自中断,或者优先取得每次任务执行的时间】。 而vTaskDelay()指定的时间与调用这个函数相关,vTaskDelayUntil() 指定的是绝对时间(任务希望开启的)。 应该注意:vTaskDelayUntil() 如果指定的苏醒时间使用完,将立

82、即返回。因此,一个使用vTaskDelayUntil() 来周期性的执行的任务,如果执行周期因为任何原因(例如任务是临时为悬挂状态)暂停而导致任务错过一个或多个执行周期,那么需要重新计算苏醒时间。通过检查像pxPreviousWakeTime可变的参数来组织当前时间片计数。然而在大多数使用中并不是必须的。 产量 portTICK_RATE_MS 用来计算时间片频率的实时时间- 按照一个时间片周期。 参数: pxPreviousWakeTime 指定一个变量来掌握任务最后开启的时间。这个变量在第一次使用中(参考下面的

83、例子)必须使用当前时间来初始化。在vTaskDelayUntil()中,这个变量是自动修改的 xTimeIncrement 循环周期时间。任务将在一定时间开启(*pxPreviousWakeTime + xTimeIncrement)。使用相同的xTimeIncrement参数值,来调用vTaskDelayUntil()将使任务按固定的周期执行。5. uxTaskPriorityGettask. h unsigned portBASE_TYPE uxTaskPriorityGet( xTaskH

84、andle pxTask );设置INCLUDE_vTaskPriorityGet 为1,此函数才能用。参考配置以获得更多信息。 获得任务的优先级。 参数: pxTask 需要处理的任务. 当传递NULL时,将返回所调用任务的优先级Returns: pxTask的优先级6. vTaskPrioritySettask. h void vTaskPrioritySet( xTaskHandle pxTask, unsigned p

85、ortBASE_TYPE uxNewPriority );设置INCLUDE_vTaskPrioritySet为1,才能使用此函数。参考配置获得更多信息。 设置任务的优先级。 如果设置的优先级高于当前执行任务的优先级,则上下文切换将在此函数返回之前发生。 参数: pxTask 需要设置优先级的任务。当传递NULL,将设置调用任务的优先级uxNewPriority 任务需要设置的优先级7. vTaskSuspend task. h void vTaskSuspend(

86、 xTaskHandle pxTaskToSuspend );设置INCLUDE_vTaskSuspend 为1,此函数才能使用。参考配置获得更多信息。 挂起任务,当挂起一个任务时,不管优先级是多少,不需要占用任何微控制器处理器时间。调用vTaskSuspend不会累积即:在统一任务中调用vTaskSuspend两次,但只需调用一次vTaskResume () 来是挂起的任务就绪。 参数: pxTaskToSuspend 处理需要挂起的任务。传递NULL将挂起调用此函数的任务。8. v

87、TaskResume task. h void vTaskResume( xTaskHandle pxTaskToResume );设置INCLUDE_vTaskSuspend为1,此函数才能使用。参考配置获得更多信息。 唤醒挂起的任务。 必须是调用 vTaskSuspend () 后挂起的任务,才有可能通过调用 vTaskResume ()重新运行。 Parameters: pxTaskToResume 就绪的任务的句柄9.

88、 vTaskResumeFromISRtask. h portBASE_TYPE vTaskResumeFromISR( xTaskHandle pxTaskToResume );设置INCLUDE_vTaskSuspend和INCLUDE_xTaskResumeFromISR都为1,才能使用此函数。参考配置获得更过信息。从ISR中唤醒挂起的任务。可能通过多个 调用vTaskSuspend()挂起的任务,可以通过调用 xTaskResumeFromISR()再次运行。vTaskResumeFromISR()不应该用于任务和中断同步,因为可能会在中断发生期间,任务已经挂起这样导致错过中断。使用信号量最为同步机制将避免这种偶然性。 参数: pxTaskToResume 就绪任务的句柄Returns: pdTRUE: 如果唤醒了任务将,引起上下文切换。pdFALSE.:用于ISR确定是否上下文切换10. vTaskSetApplicationTaskTag task. h void vTaskSetApplicationTaskTag( 

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论