• 本书的内容架构是怎样的?

    • 第一部分:“从0到1教你写FreeRTOS内核” 
      • 重点:FreeRTOS的原理实现,FreeRTOS的内核是怎么写出来的,任务是怎么定义的,系统是怎么调度的(包括底层的汇编代码),多优先级是怎么实现的...(较难)
    • 第二部分:“FreeRTOS内核应用开发”
      • 重点:FreeRTOS的移植,内核每个组件的应用(较容易)
  • 如何学习RTOS?

                 从0到1,循序渐进,不可跳跃

  • 有哪些好的学习方法?

       1.边看书边调试。

          怎么调试?单步执行每一条程序,研究程序的执行流程和自己所想的是否一致。

       2.每学习一章之后,必须将例程重新敲一遍,哪怕一个分号,并能举一反三,真正理解,重视出现的错误。

  • 学习中可以参考那些资料?

    1. FreeRTOS V9.0.0官方源代码
    2. FreeRTOS_Reference_Manual_V9.0.0(电子版)译为 “FreeRTOS参考手册_V9.0.0”
    3. Mastering_the_FreeRTOS_Real_Time_Kernel-A_Hands-On_Tutorial_Guide(电子版)译为 “掌握FreeRTOS实时内核的实践教程指南”
    4. Using the FreeRTOS Real Time Kernel-A pratical Guide-Cortex-M3 Edition(电子版)译为 “使用FreeRTOS实时内核-实用指南Cortex-M3版”
    5. 《STM32库开发实战指南》(电子版)
  • 本书编者的编书思路有哪些需要了解的?

第一部分是基于FreeRTOS V9.0.0官方源码,从0到1,层层递进,学习时涉及到的数据类型、变量名称、函数名称、文件名称、文件存放位置完全按照FreeRTOS官方的方式来实现。有一些函数可能会去掉一些形参和一些冗余的代码,而只保留核心的功能。

第二部分主要是FreeRTOS的移植和内核组件的使用,不会去深入源码,会重点学习应用。第一和第二部分没有必然联系,对第一部分不感兴趣可以跳过。

  • 什么是裸机编程?(了解)也就是单片机编程,不加入任何RTOS的程序。
  • RTOS是什么?(全称Real Time Operating System译作实时操作系统 )
  • 为什么要学习RTOS?
    1. 项目需要。相比于裸机系统,RTOS可以实现更多的功能,能做到多任务管理。
    2. 学习升职需要
  • 裸机系统和多任务系统有什么区别?(了解)
    • 裸机系统又分为轮询系统和前后台系统
      • 轮询系统:在裸机编程的时候,先初始化好相关的硬件,然后让程序在一个死循环里不断地循环,顺序地执行各种事情
      • 前后台系统:就是在轮询系统中加入了中断。中断我们称为前台,main函数里的无限循环称为后台。
    • 多任务系统:相比前后台系统,多任务系统的事件响应也是在中断中完成的,但是事件的处理是在任务中完成的。
      • 什么是任务?在多任务系统中,根据程序的功能,我们把这个程序主体分割成一个个独立的,无限循环且不能返回的小程序,这个小程序我们称为任务。
      • 任务的特点?相互独立,互不干扰,具备自身优先级,有OS调度管理。
    • 孰优孰略,各有所长,合适的才是最好的
      • 有关这三种软件模型的区别

模型

事件响应

事件处理

特点

轮询系统

主程序

主程序

轮询响应事件,轮询处理事件

前后台系统

中断

主程序

实时响应事件,轮询处理事件

多任务系统

中断

任务

实时响应事件,实时处理事件

  • 本书的学习思路:

我们采用一种全新的方法来学习一款RTOS,即不是单纯的讲里面的API如何使用,也不是单纯的拿里面的源码一句句来讲解。而是从0开始,层层叠加,不断地完善,让自己学会怎么把一个RTOS从0到1写出来,每一个阶段的学习都能体会到成功的喜悦。【前提是 具备C语言的基础即可】

  • 选择哪个RTOS?  Freertos
  • 怎么获取Freertos的资料?源码和官方书籍可以去这个网站上下载www.freertos.org
  • FreeRTOS的编程风格(重点)
    • 1.数据类型:在FreeRTOS中,使用的数据类型虽然都是标准C里面的数据类型,但是针对不同的处理器,对标准C的数据类型进行了重定义,也就是说给他们取了一个新名字,如下图:

新定义的数据类型

标准C的数据类型

portCHAR

char

portFLOAT

short

portLONG

long

portTickType

unsigned short int

用于定义时基计数器的值和阻塞时间的值。当FreeRTOSConfig.h头文件中的宏configUSE_16_BIT_TICKS为1时则为16位

unsigned int

用于定义时基计数器的值和阻塞时间的值。当FreeRTOSConfig.h头文件中的宏configUSE_16_BIT_TICKS为0时则为32位

portBASE_TYPE

long

根据处理器的架构来决定是多少位的,如果是32/16/8bit的处理器则是32/16/8bit的数据类型。一般用于定义函数的返回值或布尔类型

在编程的时候,如果用户没有明确char的符号类型,编译器会无从选择有符号或无符号,所以,在FreeRTOS中,需要明确指定变量char是有符号还是无符号的。在KEIL中,默认char是无符号的,但是也可以配置为有符号的(勾选后),配置如下:

  • 2.变量名

在FreeRTOS中,定义变量的时候,往往把变量的类型当做前缀加在变量上。例如char型变量的前缀是c,short型变量的前缀是s,long型变量的前缀是l,portBASE_TYPE类型变量的前缀是x。如果变量时无符号型,那么再加一个前缀u,如果是指针变量则加一个前缀p。因此合并起来定义一个无符号的char型变量加前缀为uc,当定义一个char型的指针变量则前缀为pc。

这里要说明:在后面学习的其它数据类型,如数据结构,任务句柄,队列句柄等定义的变量名前缀也是x。

  • 3.函数名

函数名包含了函数的返回值类型、函数所在的文件名以及函数的功能。

私有函数则会加一个prv的前缀。(prv:private)

举例:

  1. vTaskPrioritySet()函数的返回值为void型,在task.c这个文件中定义;
  2. xQueueReceive()函数的返回值为portBASE_TYPE型,在queue.c这个文件中定义
  3. vSemaphoreCreateBinary()函数的返回值为void型,在semphr.h这个文件中定义
  • 4.宏

由大写字母表示,并配有小写字母的前缀(表示是在哪个头文件中定义)

举例:

前缀

宏定义的文件

port

portMAX_DELAY

portable.h

task

taskENTER_CRITICAL()

task.h

pd

pdTRUE

projdefs.h

config

configUSE_PREEMPTION

FreeRTOSConfig.h

err

errQUEUE_FULL

projdefs.h

这里要注意:信号量的函数都是一个宏定义,但是它遵循的是函数的命名方法而非宏定义;

在整个FreeRTOS中,还有几个通用的宏,表示0和1:

实际的值

pdTRUE

1

pdFALSE

0

pdPASS

1

pdFAIL

0

  • 补充:

我们在编程的时候最好使用空格键而非TAB键,为什么?

我们知道,一个TAB键=4个空格键,代码移植的时候,当两个编译器的TAB设置的值的大小不一样的时候,代码的格式就会乱,而直接使用空格键就可以避免。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐