“从0开始的FreeRTOS”系列教程第一讲

本教程旨在介绍实时操作系统(FreeRTOS)的基本概念与使用方法,包括任务、队列、定时器管理等内容,帮助读者掌握RTOS在工程开发中的应用。

大家好,这次给大家带来了Freertos的教程,这次打算一口气做完一整个系列的教程,大概更新频率会是月更

这个系列的教程的主要目的是带大家了解实时系统(real time operating system)的基本概念,熟悉freertos的api使用方法,具备基本的使用rtos进行工程开发的能力

系列计划分几期录完,内容分别为

  • 任务管理
  • 队列管理
  • 软件定时器管理
  • 中断管理
  • 资源管理
  • 事件组
  • 任务通知

本教程的开发环境:

  • 硬件环境
    stm32f103ZET6
  • 软件版本
    Keil MDK 5.23
    CubeMX 4.17
  • 软件库环境
    HAL库版本1.13.0
    FreeRTOS版本9.0

我们这节课主要解决两个问题:

  1. 什么是RTOS?
  2. 为什么要用RTOS?

第一个问题:什么是RTOS(Real time operating system 实时操作系统),在回答这个问题之前,我们先说明白什么是OS(Operating system 操作系统)。

我们正常使用电脑时感觉和使用单片机有很大的差距,在单片机上,我们可以直接调用IO,中断这些硬件功能,但是在电脑时,我们只能够通过一些应用程序与计算机进行交互。

这是因为我们在操作单片机时是在直接和单片机的硬件进行交互,而在使用电脑的时候,实际上我们是和操作系统进行交互,然后操作系统再帮我们完成和硬件交互的过程,用专业一点的方法来说,就是操作系统区分了用户态和内核态,涉及硬件的操作,只能在内核态下由操作系统进行访问,而用户则只能在用户态进行操作。

操作系统本身就像套在硬件外面的一层壳一样,我们用户再在操作系统的外层进行用户应用的开发,用户应用通过操作系统去操作硬件。

而实时操作系统也是操作系统的一种。

实时操作系统相比一般的操作系统会更加强调实时性,相比我们平时使用的操作系统更加注重及时响应用户的输入,实时操作系统的重点是在外界时间或者数据产生时,能够快速接收和处理,处理的结果又能在规定的时间做出响应。

实时操作系统一般用在工业控制,军事设备,航空航天这些对实时性要求强的场景中。

图1-1

在stm32开发时,我们一般会采取裸机开发的方式,所谓裸机是指我们一般的轮询+中断的工程代码构筑方式,我们能够实现比较复杂的任务的手段主要是通过中断优先级和中断嵌套。而且这些工作的完成是依赖于nvic寄存器,也就是完全以硬件的方式完成的。

但我们也可以通过freertos这样的实时操作系统进行开发,也就是我们创建一些用户进程,由操作系统根据我们之前设定好的需求对进程的运行进行管理,这是一种通过软件对任务进行调度的方式。

当然,我们上面讲的并不是操作系统的全部,实际上操作系统的历史发展和多道程序设计技术密切相关,但这些不是我们这里的重点了

第二个问题,为什么要用rtos:
使用rtos最大的优势是避免由于不定长中断引发的问题,在传统的裸机开发时,有的时候会因为过长等待一个中断的触发,或者过长时间处理一个中断,导致整个系统发生了混乱乃至于崩溃。

而在rtos中,我们可以通过灵活的调度机制避免这种问题

另外RTOS会给每个任务分配固定的任务栈,并在发生栈溢出时进行处理,避免了由于栈溢出导致系统崩溃的风险

此外使用rtos还有便于实现软件接口等一些优势,比如在移植工程时,如果是裸机开发,我们就要重新配置中断,而如果是rtos,我们直接将用户进程拷贝过来就能使用了,免去了重新进行硬件配置的麻烦

最后,在非常复杂的大工程,以至于完全基于中断进行设计几乎不可能时,使用rtos进行任务调度会是很好的选择

我们这次教程要介绍的FreeRTOS就是RTOS的一种,其他比较常见的还有uCOSⅡ,eCos,都江堰等实时操作系统,FreeRTOS正如其名,是一个’free’的rtos,它的源码和文档可以免费从官网上面获取。

选择FreeRTOS作为我们这次教程讲解的对象,一方面是因为可以通过CubeMX很轻松的生成一个包含FreeRTOS的32工程。另一方面,FreeRTOS已经是一个应用范围很广,占有率很高,社区很庞大的实时操作系统了。

图1-1

在下一期教程里,我会给大家介绍一下freertos的源码结构,用cubemx生成包含freertos的工程的方法,以及工程的组件。

韦东山的 FreeRTOS 系列教程在嵌入式开发领域具有较高的知名度,其内容涵盖了从基础概念到实际开发的多个方面。关于源代码的获取,通常有以下几种方式: 1. **官方渠道**:韦东山团队或相关机构(如百问网)在其官方网站或课程页面中通常会提供配套的源代码下载。用户可以通过注册账号并购买相关课程后获取完整的代码包。 2. **在线平台**:一些开源平台或技术社区(如 GitHub、Gitee、优快云 等)可能会有开发者分享的基于韦东山教程的示例代码。搜索时可以使用关键词如“韦东山 FreeRTOS 示例代码”或“韦东山 FreeRTOS GitHub”。 3. **书籍附带资源**:如果韦东山的教程是以书籍形式出版的,通常书籍的配套资源中会包含源代码。这些资源可能通过出版社的官网或随书光盘提供。 4. **直播或视频课程的配套资料**:在一些直播或视频课程中,师会在课程介绍中提供源代码的下载链接或相关资源包。 如果用户希望获取具体的源代码片段,例如与 FreeRTOS 配置相关的代码,可以参考以下示例代码: ```c // FreeRTOSConfig.h 中的配置示例 #define configUSE_QUEUE_SETS 1 // 启用队列集功能 ``` 上述代码片段展示了如何在 `FreeRTOSConfig.h` 文件中启用队列集功能,这是 FreeRTOS 中用于管理多个队列的一种机制。 对于汇编指令和函数调用相关的示例,可以参考以下代码: ```asm ; 汇编代码示例 ADD R0, R0, #1 ; 将 R0 的值加 1 STR R0, [SP, #4] ; 将 R0 的值存储到 SP 偏移 4 的地址 LDR R1, [SP, #4] ; 将 SP 偏移 4 的地址值加载到 R1 BL add_val ; 调用函数 add_val,返回地址保存到 LR ``` 在 C 函数中传递参数时,ARM 架构下的寄存器使用规则通常如下: - 第一个参数通过 R0 寄存器传递 - 第二个参数通过 R1 寄存器传递 - 更多参数则通过栈传递 例如,在 `cnt = add(cnt, 1)` 中: - `R0 = cnt` - `R1 = 1` 这些规则可以帮助开发者理解函数调用时寄存器的状态和参数传递机制[^3]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值