FreeRTOS 初步认识Word格式.docx

上传人:wj 文档编号:352267 上传时间:2023-04-28 格式:DOCX 页数:15 大小:32.16KB
下载 相关 举报
FreeRTOS 初步认识Word格式.docx_第1页
第1页 / 共15页
FreeRTOS 初步认识Word格式.docx_第2页
第2页 / 共15页
FreeRTOS 初步认识Word格式.docx_第3页
第3页 / 共15页
FreeRTOS 初步认识Word格式.docx_第4页
第4页 / 共15页
FreeRTOS 初步认识Word格式.docx_第5页
第5页 / 共15页
FreeRTOS 初步认识Word格式.docx_第6页
第6页 / 共15页
FreeRTOS 初步认识Word格式.docx_第7页
第7页 / 共15页
FreeRTOS 初步认识Word格式.docx_第8页
第8页 / 共15页
FreeRTOS 初步认识Word格式.docx_第9页
第9页 / 共15页
FreeRTOS 初步认识Word格式.docx_第10页
第10页 / 共15页
FreeRTOS 初步认识Word格式.docx_第11页
第11页 / 共15页
FreeRTOS 初步认识Word格式.docx_第12页
第12页 / 共15页
FreeRTOS 初步认识Word格式.docx_第13页
第13页 / 共15页
FreeRTOS 初步认识Word格式.docx_第14页
第14页 / 共15页
FreeRTOS 初步认识Word格式.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

FreeRTOS 初步认识Word格式.docx

《FreeRTOS 初步认识Word格式.docx》由会员分享,可在线阅读,更多相关《FreeRTOS 初步认识Word格式.docx(15页珍藏版)》请在冰点文库上搜索。

FreeRTOS 初步认识Word格式.docx

枚举变量以 

其他类型(如结构体)以 

指针有一个额外的前缀 

p, 

例如short类型的指针前缀为 

ps 

无符号类型的变量有一个额外的前缀 

u, 

例如无符号short类型的变量前缀为 

us 

函数 

文件内部函数以prv为前缀 

API函数以其返回值类型为前缀,按照前面对变量的定义 

函数的名字以其所在的文件名开头。

如vTaskDelete函数在Task.c文件中定义 

数据类型

数据类型并不直接在RTOS内核内部引用。

相反,每个平台都有其自身的定义方式。

例如,char类型定义为portCHAR,short类型定义为portSHORT等。

范例程序源代码使用的就是这种符号,但这并不是必须的,你可以在你的程序中使用任何你喜欢的符号。

此外,有两种额外的类型要为每种平台定义。

分别是:

portTickType

可配置为16位的无符号类型或32位的无符号类型。

参考API文档中的定制部分获取详细信息。

portBASE_TYPE

为特定体系定义的最有效率的数据类型。

如果portBASE_TYPE定义为char则必须要特别小心的保证用来作为函数返回值的signedchar可以为负数,用于指示错误。

2.FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。

FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。

3.freertos既可以配置为可抢占内核也可以配置为不可抢占内核。

当FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;

当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行效率。

4.任务管理

系统为每个任务分配一个TCB结构

typedefstructtskTaskControlBlock

{

volatileportSTACK_TYPE*pxTopOfStack;

//指向堆栈顶

xListItemxGenericListItem;

//通过它将任务连入就绪链表或者延时链表或者挂起链表中, 

xListItem包含其TCB指针

xListItemxEventListItem;

//通过它把任务连入事件等待链表

unsignedportBASE_TYPEuxPriority;

//优先级

portSTACK_TYPE*pxStack;

//指向堆栈起始位置

signedportCHARpcTaskName[configMAX_TASK_NAME_LEN];

省略一些次要结构

}tskTCB;

系统的全局变量:

staticxListpxReadyTasksLists[configMAX_PRIORITIES];

就绪队列

staticxListxDelayedTaskList1;

staticxListxDelayedTaskList2;

两个延时任务队列

staticxList*volatilepxDelayedTaskList;

staticxList*volatilepxOverflowDelayedTaskList;

两个延时队列的指针,应该是可互换的。

staticxListxPendingReadyList;

staticvolatilexListxTasksWaitingTermination;

等待结束队列

staticvolatileunsignedportBASE_TYPEuxTasksDeleted=(unsignedportBASE_TYPE)0;

结束队列中的个数?

staticxListxSuspendedTaskList;

挂起队列

staticvolatileunsignedportBASE_TYPEuxCurrentNumberOfTasks;

记录了当前系统任务的数目

staticvolatileportTickTypexTickCount;

是自启动以来系统运行的ticks数

staticunsignedportBASE_TYPEuxTopUsedPriority;

记录当前系统中被使用的最高优先级,

staticvolatileunsignedportBASE_TYPEuxTopReadyPriority;

记录当前系统中处于就绪状态的最高优先级。

staticvolatilesignedportBASE_TYPExSchedulerRunning;

表示当前调度器是否在运行,也即内核是否启动了

任务建立和删除,挂起和唤醒

5.时间管理

操作系统总是需要个时钟节拍的,这个需要硬件支持。

freertos同样需要一个timetick产生器,通常是用处理器的硬件定时器来实现这个功能。

(时间片轮转调度中和延时时间控制?

它周期性的产生定时中断,所谓的时钟节拍管理的核心就是这个定时中断的服务程序。

freertos的时钟节拍isr中除去保存现场,灰度现场这些事情外,核心的工作就是调用vTaskIncrementTick()函数。

vTaskIncrementTick()函数主要做两件事情:

维护系统时间(以tick为单位,多少个节拍);

处理那些延时的任务,如果延时到期,则唤醒任务。

任务可用的延时函数:

vTaskDelay();

vTaskDelayUntil();

特别之处在于vTaskDelayUntil()是一个周期性任务可以利用它可以保证一个固定的(确定的)常数执行频率,而vTaskDelay()无法保证。

6.任务间的通信(详见“FreeRTOS任务间通讯”)

1)当然可以用全局变量的形式通信,但是不安全。

2)队列(xQueueHandle)是FreeRTOS中通信所需的主要数据结构。

3)信号量(xSemaphoreHandle),有二进制信号量,计数信号量和互斥信号量,其都是以队列为基础结构建立。

二进制信号量可以用于中断和任务间的同步。

也就是说希望任务随外部中断而执行。

即外设给出“数据已就绪”信号,系统中断,任务收到此中断信号接收数据。

互斥一般用于都共享资源或数据结构的保护。

因为任务调度不能保证数据不被破坏。

当一个任务需要访问资源,它必须先获得 

('

take'

) 

令牌;

当访问结束后,它必须释放令牌 

-允许其他任务能够访问这个资源。

(对此还有待进一步实验研究)。

7.系统配置

freeRTOS 

配置在:

FREERTOS_CONFIG.H 

里面,条目如下:

/* 

是否配置成抢先先多任务内核,是1的时候,优先级高的任务优先执行。

为0任务就没有优先级之说,用时间片轮流执行 

*/

#defineconfigUSE_PREEMPTION1

/*IDLE任务的HOOK函数,用于OS功能扩展,需要你自己编相应函数,名字是voidvApplicationIdleHook(void)*/

#defineconfigUSE_IDLE_HOOK0

/*SYSTEMTICK的HOOK函数,用于OS功能扩展,需要你自己编相应函数,名字是 

voidvApplicationTickHook(void)*/

#defineconfigUSE_TICK_HOOK0

系统CPU频率,单位是Hz*/

#defineconfigCPU_CLOCK_HZ58982400

系统SYSTEMTICK每秒钟的发生次数,数值越大系统反应越快,但是CPU用在任务切换的开销就越多 

#defineconfigTICK_RATE_HZ250

系统任务优先级数。

说明任务有5级优先度。

这个数目越大耗费RAM越多 

#defineconfigMAX_PRIORITIES5

系统最小堆栈尺寸,注意128不是128字节,而是128个入栈。

比如ARM32位,128个入栈就是512字节 

#defineconfigMINIMAL_STACK_SIZE128

系统可用内存。

一般设成除了操作系统和你的程序所用RAM外的最大RAM。

比如20KRAM你用了2K,系统用了3K,剩下15就是最大HEAP 

尺寸。

你可以先设小然后看编译结果往大里加*/

#defineconfigTOTAL_HEAP_SIZE10240

任务的PC名字最大长度,因为函数名编译完了就不见了,所以追踪时不知道哪个名字。

16表示16个char*/

#defineconfigMAX_TASK_NAME_LEN16

是否设定成追踪,由PC端TraceCon.exe记录,也可以转到系统显示屏上 

#defineconfigUSE_TRACE_FACILITY0

就是SYSTEMTICK的长度,16是16位,如果是16位以下CPU,一般选1;

如果是32位系统,一般选0*/

#defineconfigUSE_16_BIT_TICKS0

简单理解以下就是和IDLETASK同样优先级的任务执行情况。

建议设成1,对系统影响不大 

#defineconfigIDLE_SHOULD_YIELD1

是否用MUTEXES。

MUTEXES是任务间通讯的一种方式,特别是用于任务共享资源的应用,比如打印机,任务A用的时候就排斥别的任务应用,用完了别的任务才可以应用 

#defineconfigUSE_MUTEXES0

确定是否用递归式的MUTEXES*/

#defineconfigUSE_RECURSIVE_MUTEXES0

是否用计数式的SEMAPHORES,SEMAPHORES也是任务间通讯的一种方式 

#defineconfigUSE_COUNTING_SEMAPHORES0

是否应用可切换式的API。

同一功能API有多个,有全功能但是需求资源和时间较多的,此项使能后就可以用较简单的API,节省资源和时间,但是应用限制较多 

#defineconfigUSE_ALTERNATIVE_API0

此项用于DEBUG,来看是否有栈溢出,需要你自己编相应检查函数voidvApplicationStackOverflowHook(xTaskHandle*pxTask,signedportCHAR*pcTaskName)*/

#defineconfigCHECK_FOR_STACK_OVERFLOW0

用于DEBUG,登记SEMAPHORESQ和QUEUE的最大个数,需要在任务用应用函数vQueueAddToRegistry()和vQueueUnregisterQueue()*/

#defineconfigQUEUE_REGISTRY_SIZE10

设定可以改变任务优先度 

#defineINCLUDE_vTaskPrioritySet1

设定可以查询任务优先度 

#defineINCLUDE_uxTaskPriorityGet1

设定可以删除任务 

#defineINCLUDE_vTaskDelete1

据说是可以回收删除任务后的资源(RAM等)*/

#defineINCLUDE_vTaskCleanUpResources0

设置可以把任务挂起 

#defineINCLUDE_vTaskSuspend1

设置可以从中断恢复(比如系统睡眠,由中断唤醒 

#defineINCLUDE_vResumeFromISR1

设置任务延迟的绝对时间,比如现在4:

30,延迟到5:

00。

时间都是绝对时间 

#defineINCLUDE_vTaskDelayUntil1

设置任务延时,比如延迟30分钟,相对的时间,现在什么时间,不需要知道 

#defineINCLUDE_vTaskDelay1

设置取得当前任务分配器的状态 

#defineINCLUDE_xTaskGetSchedulerState1

设置当前任务是由哪个任务开启的 

#defineINCLUDE_xTaskGetCurrentTaskHandle1

是否使能这一函数,还数的目的是返回任务执行后任务堆栈的最小未用数量,同样是为防止堆栈溢出 

#defineINCLUDE_uxTaskGetStackHighWaterMark0

是用用协程。

协程公用堆栈,节省RAM,但是没有任务优先级高,也无法和任务通讯 

#defineconfigUSE_CO_ROUTINES0

所有协程的最大优先级数,协程优先级永远低于任务。

就是系统先执行任务,所有任务执行完了才执行协程。

#defineconfigMAX_CO_ROUTINE_PRIORITIES1

系统内核的中断优先级,中断优先级越低,越不会影响其他中断。

一般设成最低 

#defineconfigKERNEL_INTERRUPT_PRIORITY[dependentofprocessor]

系统SVC中断优先级,这两项都在在M3和PIC32上应用 

#defineconfigMAX_SYSCALL_INTERRUPT_PRIORITY[dependentonprocessorandapplication]

#endif/*FREERTOS_CONFIG_H*/

本文来自CSDN博客,转载请标明出处:

展开全文

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2