protmacro.h文件也定义了一个数据类型的基本架构。这个数据类型中包括了基本整型变量,指针,以及系统时钟节拍器的数据类型,在ARM Cortex-M3 chips上使用IAR编译器时,就采用如下定义:
#define portBASE_TYPE long // Basic integer variable type
#define portSTACK_TYPE unsigned long // Pointers to memory locations
typedef unsigned portLONG portTickType; // The system timer tick type
这样使用数据类型的方法,和函数透过小层的#defines,看上去略微有点复杂,不过它允许了FreeRTOS能够被重新编译在一个完全不同的系统架构上,仅仅只需要通过修改这些硬件相关的文件。同时,如果你想要让FreeRTOS运行在一个当前尚未被支持的架构上,你只仅仅需要去实现硬件相关的功能,这要比在FreeRTOS上去实现硬件无关的部分,要少得多。
就如同我们已经见到的,FreeRTOS用C的预处理宏#define来实现硬件相关的功能。FreeRTOS也同样用#define来应对大量的硬件无关的代码。对于非嵌入式应用程序这样频繁使用#define是一个严重的错误,不过在许多小型嵌入式系统中这点开销比起“实时”所提供的功能来说就微不足道了。
3.3. 调度任务:快速概述
任务优先级和就绪列表
所有任务都有一个用户指定优先级,从0(最低优先级)到 configMAX_PRIORITIES-1的编译时间(最高优先级)。例如,如果configMAX_PRIORITIES设置为5,当FreeRTOS使用5个优先等级时:0(最低优先级),1,2,3,和4(最高优先级)。
FreeRTOS使用一个“就绪列表”来跟踪所有已经准备好运行的任务。它像一个任务列表数组来实现就绪列表,如下所示:
static xList pxReadyTasksLists[ configMAX_PRIORITIES ]; /* Prioritised ready tasks. */
pxReadyTasksLists[0]是所有准备好的优先级为0的任务列表,pxReadyTasksLists[1]是所有准备好的优先级为1的任务列表,以此类推,直到pxReadyTasksLists[configMAX_PRIORITIES-1]。
系统节拍器(时钟)
FreeRTOS系统的心跳就是被称为系统节拍器(时钟)。FreeRTOS配置这个系统生成一个定期的节拍(时钟)中断。用户可以配置的节拍中断频率,通常是在毫秒范围。vTaskSwitchContext()函数在每次的节拍中断释放的时候被调用。vTaskSwitchContext()选择优先级最高的就绪任务并将它赋予pxCurrentTCB变量,如下所示:
/* Find the highest-priority queue that contains ready tasks. */
while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopReadyPriority ] ) ) )
{
configASSERT( uxTopReadyPriority );
--uxTopReadyPriority;
}
/* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the tasks of the same
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30698-3.html
而且钱可随时转进转出
别用这样的新闻来误导读者
法国人吃鹅肝鱼子就把鹅肝列为顶级美食