先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注go)
正文
下面所有资料都是转载整理于:https://www.rt-thread.org/document/site/#/
文章目录
- 模拟运行
- 快速上手
- 内核学习
- 有RTOS经验
- 快速上手
- 编程指南
- [API 手册](#API_httpswwwrtthreadorgdocumentsiteothernoviceguideREADMEidapi_65)
- [第三方 RTOS 兼容层](#_RTOS_httpswwwrtthreadorgdocumentsiteothernoviceguideREADMEidrtos_69)
- [Env 工具](#Env_httpswwwrtthreadorgdocumentsiteothernoviceguideREADMEidenv_80)
- [RT-Thread IDE](#RTThread_IDEhttpswwwrtthreadorgdocumentsiteothernoviceguideREADMEidrtthreadide_84)
- 设备与驱动
- 组件
- 开发工具
- RT-Thread 标准版本
- [RT-Thread 简介](#RTThread_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardREADMEidrtthread_193)
-
- [RT-Thread 概述](#RTThread_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardREADMEidrtthread_197)
- 许可协议
- [RT-Thread 的架构](#RTThread_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardREADMEidrtthread_209)
- [初识 RT-Thread](#_RTThreadhttpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardtutorialquickstartstm32f103simulatorstm32f103simulatoridrtthread_246)
- 系统启动代码
- 用户入口代码
- 跑马灯的例子
- 其他例子
- 常见问题
- [第三方 RTOS 兼容层](#_RTOS_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardtutorialquickstartstm32f103simulatorstm32f103simulatoridrtos_449)
- RT-Thread 潘多拉 STM32L475 上手指南
-
- [IoT Board 开发板简介](#IoT_Board_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardtutorialquickstartiot_boardquickstartidiotboard_462)
- [IoT Board SDK 说明](#IoT_Board_SDK_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardtutorialquickstartiot_boardquickstartidiotboardsdk_482)
- 准备工作
- 运行第一个示例程序
- 继续学习
- 内核基础
- 线程管理
- 时钟管理
- 线程间同步
- 线程间通信
- 内存管理
- 中断管理
- 内核移植
- [RT-Thread SMP 介绍与移植](#RTThread_SMP_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualsmpsmpidrtthreadsmp_545)
- [I/O 设备模型](#IO_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdevicedeviceidio_547)
- [UART 设备](#UART_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdeviceuartuart_v1uartiduart_549)
- [ADC 设备](#ADC_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdeviceadcadcidadc_551)
- [DAC 设备](#DAC_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdevicedacdaciddac_553)
- [CAN 设备](#CAN_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdevicecancanidcan_555)
- [I2C 总线设备](#I2C_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdevicei2ci2cidi2c_557)
- [PWM 设备](#PWM_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdevicepwmpwmidpwm_559)
- [RTC 设备](#RTC_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdevicertcrtcidrtc_561)
- [SPI 设备](#SPI_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdevicespispiidspi_563)
- ringbuffer
- [FinSH 控制台](#FinSH_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualfinshfinshidfinsh_567)
- 虚拟文件系统
- [ulog 日志](#ulog_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualulogulogidulog_571)
- [utest 测试框架](#utest_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualutestutestidutest_573)
- [POSIX 接口](#POSIX_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualposixposixidposix_575)
- [**1. MQTT 背景应用**](#1_MQTT_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardapplicationnotepackagesumqttumqttid_1mqtt_577)
- [应用 RT-Thread 实现蜂鸣器播放器](#_RTThread_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardtutorialbeepplayerREADMEidrtthread_579)
- [应用 RT-Thread 实现蜂鸣器播放器](#_RTThread_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardtutorialbeepplayerREADMEidrtthread_581)
- 智能车连载教程简介
新手指导
版本简介
RT-Thread 操作系统现在有三个版本,分别适应满足不同场合的需求。
- 标准版本:RT-Thread 简介
- Nano版本:RT-Thread Nano 简介
- Smart版本:RT-Thread Smart 入门指南
学习路线
从版本简介中可以看出,Nano 版本
是 标准版本
的极简内核版本,Smart 版本
是在 标准版本
上增加了用户态创造而来,所以学习 标准版本
是学习 RT-Thread 的基础。本篇文章以学习 RT-Thread 标准版本 为例,为初学者制定学习路线如下,分为入门学习、进阶学习、应用开发。
入门学习
无RTOS经验
针对人群:有 C 语言、嵌入式基础,想系统学习 RT-Thread 操作系统
模拟运行
快速上手
推荐使用 潘多拉开发板 配套使用 潘多拉开发板教程. pdf,或者以下主流的学习板进行学习,不建议没有任何基础就将 RT-Thread 移植到一块开发板上。
- RT-Thread 潘多拉 STM32L475 上手指南
- 野火霸道 STM32F103 上手指南
- 正点原子 nanoSTM32F103 上手指南
- 野火挑战者 STM32F429 上手指南
- 正点原子探索者 STM32F407 上手指南
- 正点原子阿波罗 STM32F429 上手指南
- 野火 I.MX RT1052 上手指南
- 正点原子 I.MX RT1052 号令者上手指南
- 其他…
内核学习
有RTOS经验
针对人群:学过 FreeRTOS 或 uC/OS, 想把 RT-Thread 使用起来
快速上手
准备一块板子,根据 RT-Thread 支持的板子 BSP 进行 快速上手,或者根据 STM32 系列 BSP 制作教程进行移植。
如果使用 Ubuntu 进行开发,可以参考:在 Ubuntu 下开发 RT-Thread。
编程指南
快速学习内核,参考:《RT-Thread 编程指南》。
API 手册
第三方 RTOS 兼容层
为方便之前有其他 RTOS 使用经验的用户快速上手 RT-Thread,以及将基于其他 RTOS 的 API 编写的应用层代码快速移植到 RT-Thread 上,RT-Thread 社区编写了第三方 RTOS 兼容层。目前支持以下第三方 RTOS 的 API 无感移植:
进阶学习
开发工具
Env 工具
Env 工具:Env 工具用于对源码功能进行配置或裁减,可以生成 MDK/IAR/GCC 工程,需要配合 MDK/IAR/GCC 使用,详见 Env 用户手册。
RT-Thread IDE
RT-Thread Studio :可以在 Studio 中下载源码包并创建 rt-thread 工程,独立完成开发、编译、下载、调试等功能,并能进行功能裁剪,详见 RT-Thread Studio 用户手册。
设备与驱动
组件
应用开发
Demo 示例
Demo演示和教程[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KBtUmYbL-1645022946719)()]Sample示例img |
---|
基于RT-Thread和i.MX RT1052的开源AutoQuad飞控 |
基于RT-Thread的开源飞控StarryPilot |
基于RT-Thread的人体健康监测系统 |
基于RT-Thread的激光雷达避障小车 |
基于RT-Thread的蓝牙遥控平衡小车 |
蜂鸣器播放器 |
分布式温度监控系统 |
智能车教程 |
代码贡献
开发指南[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rb6TCmF3-1645022946720)()]代码规范[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eFZcaflt-1645022946721)()]提交代码img | ||
软件包开发指南 | RT-Thread编程风格 | 向RT-Thread贡献代码 |
STM32系列BSP制作教程 | BSP开发规范 | |
传感器驱动开发指南 |
开发工具
- RT-Thread Studio
- Env 开发工具
- Scons 介绍
- Kconfig 介绍
RT-Thread 标准版本
RT-Thread 简介
作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型 RTOS 的种种优越之处。RT-Thread 是一款完全由国内团队开发维护的嵌入式实时操作系统(RTOS),具有完全的自主知识产权。经过近 15 个年头的沉淀,伴随着物联网的兴起,它正演变成一个功能强大、组件丰富的物联网操作系统。
RT-Thread 概述
RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务与任务之间通过任务调度器进行非常快速地切换(调度器根据优先级决定此刻该执行的任务),给人造成多个任务在一个时刻同时运行的错觉。在 RT-Thread 系统中,任务通过线程实现的,RT-Thread 中的线程调度器也就是以上提到的任务调度器。
RT-Thread 主要采用 C 语言编写,浅显易懂,方便移植。它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。针对资源受限的微控制器(MCU)系统,可通过方便易用的工具,裁剪出仅需要 3KB Flash、1.2KB RAM 内存资源的 NANO 版本(NANO 是 RT-Thread 官方于 2017 年 7 月份发布的一个极简版内核);而对于资源丰富的物联网设备,RT-Thread 又能使用在线的软件包管理工具,配合系统配置工具实现直观快速的模块化裁剪,无缝地导入丰富的软件功能包,实现类似 Android 的图形界面及触摸滑动效果、智能语音交互效果等复杂功能。
相较于 Linux 操作系统,RT-Thread 体积小,成本低,功耗低、启动快速,除此以外 RT-Thread 还具有实时性高、占用资源小等特点,非常适用于各种资源受限(如成本、功耗限制等)的场合。虽然 32 位 MCU 是它的主要运行平台,实际上很多带有 MMU、基于 ARM9、ARM11 甚至 Cortex-A 系列级别 CPU 的应用处理器在特定应用场合也适合使用 RT-Thread。
许可协议
RT-Thread 系统完全开源,3.1.0 及以前的版本遵循 GPL V2 + 开源许可协议。从 3.1.0 以后的版本遵循 Apache License 2.0 开源许可协议,可以免费在商业产品中使用,并且不需要公开私有代码。
RT-Thread 的架构
近年来,物联网(Internet Of Things,IoT)概念广为普及,物联网市场发展迅猛,嵌入式设备的联网已是大势所趋。终端联网使得软件复杂性大幅增加,传统的 RTOS 内核已经越来越难满足市场的需求,在这种情况下,物联网操作系统(IoT OS)的概念应运而生。**物联网操作系统是指以操作系统内核(可以是 RTOS、Linux 等)为基础,包括如文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接能力的软件平台,**RT-Thread 就是一个 IoT OS。
RT-Thread 与其他很多 RTOS 如 FreeRTOS、uC/OS 的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间层组件,如下图所示。
它具体包括以下部分:
- 内核层:RT-Thread 内核,是 RT-Thread 的核心部分,包括了内核系统中对象的实现,例如多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等;libcpu/BSP(芯片移植相关文件 / 板级支持包)与硬件密切相关,由外设驱动和 CPU 移植构成。
- 组件与服务层:组件是基于 RT-Thread 内核之上的上层软件,例如虚拟文件系统、FinSH 命令行界面、网络框架、设备框架等。采用模块化设计,做到组件内部高内聚,组件之间低耦合。
- RT-Thread 软件包:运行于 RT-Thread 物联网操作系统平台上,面向不同应用领域的通用软件组件,由描述信息、源代码或库文件组成。RT-Thread 提供了开放的软件包平台,这里存放了官方提供或开发者提供的软件包,该平台为开发者提供了众多可重用软件包的选择,这也是 RT-Thread 生态的重要组成部分。软件包生态对于一个操作系统的选择至关重要,因为这些软件包具有很强的可重用性,模块化程度很高,极大的方便应用开发者在最短时间内,打造出自己想要的系统。RT-Thread 已经支持的软件包数量已经达到 60+,如下举例:
- 物联网相关的软件包:Paho MQTT、WebClient、mongoose、WebTerminal 等等。
- 脚本语言相关的软件包:目前支持 JerryScript、MicroPython。
- 多媒体相关的软件包:Openmv、mupdf。
- 工具类软件包:CmBacktrace、EasyFlash、EasyLogger、SystemView。
- 系统相关的软件包:RTGUI、Persimmon UI、lwext4、partition、SQLite 等等。
- 外设库与驱动类软件包:RealTek RTL8710BN SDK。
- 其他。
Keil 模拟器 STM32F103 上手指南
一般嵌入式操作系统因为它的特殊性,往往和硬件平台密切相关连,具体的嵌入式操作系统往往只能在特定的硬件上运行。对于刚接触 RT-Thread 操作系统的读者并不容易马上就获得一个和 RT-Thread 操作系统相配套的硬件模块,但随着计算机技术的发展,我们可以采用软件方式来模拟一个能够运行 RT-Thread 操作系统的硬件模块,这就是 ARM 公司的 MDK-ARM 仿真模拟环境。
MDK-ARM(MDK-ARM Microcontroller Development Kit)软件是一套完整的集成开发环境(IDE),它出自 ARM 公司,包括了针对 ARM 芯片(ARM7,ARM9,Cortex-M 系列,Cortex-R 系列等)的高效 C/C++ 编译器;针对各类 ARM 设备、评估板的工程向导,工程管理;用于软件模拟运行硬件平台的模拟器;以及与市面上常见的如 ST-Link,JLink 等在线仿真器相连接以配合调试目标板的调试器。MDK-ARM 软件中的软件仿真模拟器,采用完全软件模拟方式解释执行 ARM 的机器指令,并实现外围的一些外设逻辑,从而构成一套完整的虚拟硬件环境,使得用户能够不借助真实的硬件平台就能够在电脑上执行相应的目标程序。
MDK-ARM 集成开发环境因为其完全的 STM32F103 软件仿真环境,也让我们有机会在不使用真实硬件环境的情况下直接在电脑上运行目标代码。这套软件仿真模拟器能够完整地虚拟出 ARM Cortex-M3 的各种运行模式、外设,如中断异常,时钟定时器,串口等,这几乎和真实的硬件环境完全一致。实践也证明,本文使用到的这份 RT-Thread 入门例程,在编译成二进制代码后,不仅能够在模拟器上软件模拟运行,也能够不需要修改地在真实硬件平台上正常运行。
下面我们将选择 MDK-ARM 集成开发环境作为目标硬件平台来观察 RT-Thread 操作系统是如何运行的。
准备工作
MDK 开发环境:需要安装 MDK-ARM 5.24 (正式版或评估版,5.14 版本及以上版本均可),这个版本也是当前比较新的版本,它能够提供相对比较完善的调试功能。安装方法可以参考 Keil MDK安装。
使用 STM32F103 软件仿真 ,还需要下载安装 STM32F103 pack 文件,如果在 MDK 中下载较慢,也可以点击此处下载,下载后双击安装即可。
初识 RT-Thread
作为一个操作系统,RT-Thread 的代码规模怎么样呢?在弄清楚这些之前,我们先要做的就是获得与本文相对应的 RT-Thread 的例子,这份例子可以从以下链接获得:
这个例子是一个压缩包文件,将它解压,我们这里解压到 D:/。解压完成后的目录结构如下图所示:
各个目录所包含的文件类型的描述如下表所示:
目录名 | 描述 |
---|---|
applications | RT-Thread 应用程序。 |
rt-thread | RT-Thread 的源文件。 |
- components | RT-Thread 的各个组件目录。 |
- include | RT-Thread 内核的头文件。 |
- libcpu | 各类芯片的移植代码,此处包含了 STM32 的移植文件。 |
- src | RT-Thread 内核的源文件。 |
- tools | RT-Thread 命令构建工具的脚本文件。 |
drivers | RT-Thread 的驱动,不同平台的底层驱动具体实现。 |
Libraries | ST 的 STM32 固件库文件。 |
kernel-sample-0.1.0 | RT-Thread 的内核例程。 |
在目录下,有一个 project.uvprojx 文件,它是本文内容所引述的例程中的一个 MDK5 工程文件,双击 “project.uvprojx” 图标,打开此工程文件:
在工程主窗口的左侧 Project
栏里可以看到该工程的文件列表,这些文件被分别存放到如下几个组内,分别是:
目录组 | 描述 |
---|---|
Applications | 对应的目录为 rtthread_simulator_v0.1.0/applications,它用于存放用户应用代码。 |
Drivers | 对应的目录为 rtthread_simulator_v0.1.0/drivers,它用于存放 RT-Thread 底层的驱动代码。 |
STM32_HAL | 对应的目录为 rtthread_simulator_v0.1.0/Libraries/CMSIS/Device/ST/STM32F1xx,它用于存放 STM32 的固件库文件。 |
kernel-sample | 对应的目录为 rtthread_simulator_v0.1.0/kernel-sample-0.1.0,它用于存放 RT-Thread 的内核例程。 |
Kernel | 对应的目录为 rtthread_simulator_v0.1.0/src,它用于存放 RT-Thread 内核核心代码。 |
CORTEX-M3 | 对应的目录为 rtthread_simulator_v0.1.0/rt-thread/libcpu,它用于存放 ARM Cortex-M3 移植代码。 |
DeviceDrivers | 对应的目录为 rtthread_simulator_v0.1.0/rt-thread/components/drivers,它用于存放 RT-Thread 驱动框架源码。 |
finsh | 对应的目录为 rtthread_simulator_v0.1.0/rt-thread/components/finsh,它用于存放 RT-Thread 命令行 finsh 命令行组件。 |
现在我们点击一下窗口上方工具栏中的按钮,对该工程进行编译,如图所示:
编译的结果显示在窗口下方的 “Build” 栏中,没什么意外的话,最后一行会显示“0 Error(s), * Warning(s).”,即无任何错误和警告。
注:由于工程中包含的内核例程代码较多,若使用的是 MDK 试用版本,则会有 16KB 限制,此时可以只保留某个目标例程的代码(例如内核例程只保留一个 thread_sample.c 参与编译),将其他不用的例程先从工程中移除,然后编译。
在编译完 RT-Thread/STM32 后,我们可以通过 MDK-ARM 的模拟器来仿真运行 RT-Thread。点击窗口右上方的按钮或直接按 “Ctrl+F5” 进入仿真界面,再按 F5 开始运行,然后点击该图工具栏中的按钮或者选择菜单栏中的 “View→Serial Windows→UART#1”,打开串口 1 窗口,可以看到串口的输出只显示了 RT-Thread 的 LOGO,这是因为用户代码是空的,其模拟运行的结果如图所示:
提示:我们可以通过输入Tab键或者
help + 回车
输出当前系统所支持的所有命令,如下图所示。
系统启动代码
一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头。以 MDK-ARM 为例,MDK-ARM 的用户程序入口为 main() 函数,位于 main.c 文件中。系统启动后先从汇编代码 startup_stm32f103xe.s 开始运行,然后跳转到 C 代码,进行 RT-Thread 系统功能初始化,最后进入用户程序入口 main()。
下面我们来看看在 components.c 中定义的这段代码:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ttps://img-blog.csdnimg.cn/img_convert/cc83f32e4094b27a53d8d0978d53f455.png)
系统启动代码
一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头。以 MDK-ARM 为例,MDK-ARM 的用户程序入口为 main() 函数,位于 main.c 文件中。系统启动后先从汇编代码 startup_stm32f103xe.s 开始运行,然后跳转到 C 代码,进行 RT-Thread 系统功能初始化,最后进入用户程序入口 main()。
下面我们来看看在 components.c 中定义的这段代码:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-tyzO1IuX-1713205851687)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!