ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

初识 Free RTOS

初识 Free RTOS 一、FreeRTOS简介Free RTOSReal Time Operating System实时操作系统顾名思义一款免费的实时操作系统。作为一种专门设计用于处理实时任务的操作系统。与通用计算机上运行的桌面操作系统如Windows、Linux不同RTOS专注于提供对实时性能和响应时间的支持。那么为什么要学习Free RTOS呢之前所学习的51、32单片机都是对裸机进行操作编程。即不加入任何 RTOS Real Time Operating System 实时操作系统的程序。常用的 RTOS 有国外的FreeRTOS、 μC/OS、RTX 和国内的 RT-Thread 等其中尤以国外开源且免费的 FreeRTOS 的市场占有率最高。所谓裸机通常指的是在没有操作系统OS支持的环境中直接运行程序的状态。换句话讲也就是说裸机开发是一种在没有操作系统或者其他软件中间层的情况下直接操作硬件的软件开发方式在裸机开发中程序员需要编写直接与硬件交互的代码包括底层初始化、时钟、中断服务程序、外设控制等。与在有操作系统的环境中相比裸机开发对硬件的了解程度更为深入同时也需要处理更多的底层细节。裸机开发的缺点1实时性差裸机编程都在一个死循环中程序轮流执行所有任务优先级相同但所有任务可以被中断打断2CPU利用率低一旦遇到Delay函数CPU就会进行空等待没有任务调度器使CPU利用率低3结构臃肿所有任务都放在无限循环内而实时操作系统可以很好的解决这些缺点提供对实时性能和响应时间的支持优点如下1分而治之实现功能划分为多个任务而每个任务又是一个独立的无限循环2任务调度RTOS包含一个任务调度器能够有效地管理多个任务的执行。它负责按照优先级或其他调度算法决定哪个任务在何时执行。当遇到阻塞态时当前任务交出CPU使用权CPU转去处理下一个任务3抢占式任务可以有软件指定优先级高优先级的任务可以抢占低优先级的任务。同样中断可以打断任一优先级的任务4任务堆栈每个任务都有自己独立的栈空间用于保存局部变量以及任务的上下文信息Free RTOS基于上层优点同时还拥有其他特点使得Free RTOS在市场上的占有率很高1免费开源商业产品中使用无潜在商业风险无须担心2可裁剪FreeRTOS的核心代码9000行包含在3个.c文件中3简单简单易用可移植性非常好4优先级不限任务优先级分配没有限制多任务可同一优先级5任务不限可创建的实时任务数量没有软件限制对于硬件层取决于栈空间大小6抢占/协程/时间片支持抢占式协程式、时间片流转任务调度对于相同优先级的任务而言在FreeRTOS中有一个“心脏”——滴答定时器滴答定时器每计时到一个时间单位时间片就会触发一次滴答定时器中断在这个滴答定时器中断中主要就是执行相同优先级任务的切换对于不同优先级的任务而言高优先级的任务可以抢占低优先级的任务。执行过程中如果遇到阻塞态时当前任务交出CPU使用权CPU转去处理下一个任务。当高优先级任务执行完成后开始执行低优先级任务二、FreeRTOS数据类型和命名规范2.1 数据类型每个移植的版本都含有自己的portmacro.h头文件里面定义了2个数据类型TickType_tFreeRTOS配置了一个周期性的时钟中断Tick Interrupt每发生一次中断中断次数累加这被称为tick counttick count这个变量的类型就是TickType_tTickType_t可以是16位的也可以是32位的FreeRTOSConfig.h中定义configUSE_16_BIT_TICKS时TickType_t就是uint16_t否则TickType_t就是uint32_t对于32位架构建议把TickType_t配置为uint32_tBaseType_t这是该架构最高效的数据类型32位架构中它就是uint32_t16位架构中它就是uint16_tBaseType_t通常用作简单的返回值的类型还有逻辑值比如pdTRUE/pdFALSE2.2 命名规范2.2.1 变量名变量名前缀表示变量名的数据类型变量名前缀含义uint32_t定义的变量前缀uluunsigned无符号llong、int32_t长整型uint16_t定义的变量前缀usuunsigned无符号sshort、int16_t短整型uint8_t定义的变量前缀ucuunsigned无符号cchar、int8_t短整型stdint.h中未定义的变量类型定义的变量前缀x比如BaseType_tTickType_t其他非标准的类型结构体、task_handle、queue_handle等定义的变量stdint.h中未定义的无符号变量类型定义的变量前缀ux比如UBaseType_t定义的变量size_t定义的变量前缀uxsize_t定义的变量e枚举变量p指针变量c根据MISRA代码规则char定义的变量只能用于ASCII字符pc根据MISRA代码规则char*定义的指针变量只能用于ASCII字符串2.2.2 函数名函数名前缀返回值类型所定义的文件位置函数名前缀含义vTaskPrioritySet返回值类型void在task.c中定义xQueueReceive返回值类型BaseType_t在queue.c中定义pvTimerGetTimerID返回值类型pointer to void在timer.c中定义prvprivate表示私有函数被static修饰2.2.3 宏宏的名字是大写同时用下划线分开可以添加小写的前缀表示所定义的文件位置宏的前缀含义在哪个文件里定义port (比如portMAX_DELAY)portable.h或portmacro.htask (比如taskENTER_CRITICAL())task.hconfig (比如configUSE_PREEMPTION)FreeRTOSConfig.hpd (比如pdTRUE)projdefs.h
返回列表