硬件注意事项
硬件无关的FreeRTOS层在硬件相关层之上。硬件相关层声明了你选择什么样的芯片架构。图3.1显示了FreeRTOS的各层。

图3.1:FreeRTOS的软件层
FreeRTOS包含所有你需要用来启动很运行系统的硬件无关以及硬件相关的代码。它支持许多编译器(CodeWarrior,GCC,IAR等)也支持许多处理器架构(ARM7,ARM Cortex-M3,PICs各系列,Silicon Labs 8051, x86等)。请参阅FreeRTOS网站,可以看到处理器和编译器支持列表。
FreeRTOS是高可配置设计。FreeRTOS可以被编译成为适合单CPU,极简RTOS,只之支持少数任务的操作系统,也可以被编译成为适合多核功能强大的结合了TCP/IP,文件系统,和USB的怪兽。
配置选项可以通过设置不同的#defines,在FreeRTOSConfig.h文件里选择。时钟速度,堆大小,互斥,和API子集,连同其他许多选项,都可以在这个文件中配置。这里是几个例子,设置了任务优先级的最大数量,CPU的频率,系统节拍器的频率,最小的堆栈大小和总的堆大小:
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
#define configCPU_CLOCK_HZ ( 12000000UL )
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 100 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 4 * 1024 ) )
对于不同的交叉编译器和CPU架构,硬件相关代码分布在多个文件中。举例来说,如果你使用ARM Cortex-M3芯片,IAR编译器工作,那么硬件相关的代码就存在FreeRTOS/Source/portable/IAR/ARM_CM3/目录下。portmacro.h文件声明了所有硬件特定功能,port.c和portasm.s 包含了所有实际硬件相关的代码。硬件无关的头文件portable.h在编译的时候用#include's引入正确的portmacro.h文件。FreeRTOS使用#define'd调用在portmacro.h中声明的硬件特定功能。
让我们来看一个例子,FreeRTOS是如何调用一个硬件相关功能的。硬件无关的文件tasks.c常常需要插入一个代码的临界区,以防止抢占。在不同架构上,插入一个临界区的表现也不同,并且硬件无关的task.c不需要了解硬件相关的细节。所以task.c调用全局宏指令portENTER_CRITICAL(), 乐得忽略它实际上是如何做到的。假设我们使用IAR编译器在ARM Crotex-M3芯片上编译生成FreeRTOS,使用那个定义了portENTER_CRITICAL()的文件/Source/portable/IAR/ARM_CM3/portmacro.h,如下所示:
#define portENTER_CRITICAL() vPortEnterCritical()
vPortEnterCritical()实际上是在FreeRTOS/Source/portable/IAR/ARM_CM3/port.c中定义的。freertos操作系统这个port.c文件是一个硬件相关的文件,同时包含了对IAR编译器和Cortex-M3芯片认识的代码文件。vPortEnterCritical()函数利用这些硬件特定的知识进入临界区,又返回到与硬件无关的task.c中。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30698-2.html
题外带句