当前位置: 首页 > news >正文

400行程序写一个实时操作系统(三):Sparrow的学习方法

千里之行始于足下,为了让大家的学习更加事半功倍,笔者将会介绍RTOS的学习方法。

可能很多人拿到一份源码,就想通过各种方式搞懂它,例如抄代码或者读代码。

笔者认为,单纯抄一个实时操作系统是没有任何用处的。比如对于Sparrow,它的程序仅仅有四百行,不到一天就可以抄完,但是又能收获什么呢?

老实说,笔者也干过抄源码和看源码这种事情,比如,笔者曾经抄过FreeRTOS五千多行源码,耗费了大量时间,也尝试看过linux内核源码,但是,这样的效率非常低,甚至是几乎没有任何用处。

读者可能会质疑和反对,但是,请听笔者细细分析原因。

首先,编程是一种结果向的产物,而不是过程,你看到的源码是不断修改后的结果,而不是过程。程序 = 数据结构 + 算法。我们想获得的,是代码的思路(通常是算法),编程是对我们算法的一种描述,而不是算法本身,这也就注定了,通过看源码理解思路,是低效的,因为源码并不等同于算法,如果有人直接将算法讲述给你,你再参考源码的具体实现,或者尝试编程实现,往往会收获更多,这才是学习编程最高效的方式。但是,可能有人会说:我上哪找人直接讲述源码?莫慌,笔者的这篇文章就是为了解决这些问题而写的。但在此之前,让笔者继续讨论那些没有必要的学习方式。

其次,不管是抄源码还是看源码,代码都是死的。编程产生的代码就是要运行在机器上的,也就注定了它面向的对象是计算机,而不是人本身,除非你的大脑是二进制的!没有运行的代码,毫无意义!快速学习一个项目,需要的是对项目深刻的理解,但是抄代码等行为,让我们的认知开始变得“趋利避害”,也就是说,我们往往会忽视那些细节,只重点关注我们看得懂的部分,走不出自己的舒适圈,谈何提高?

最后,学习一个项目,重要的是背后的基础知识,而不是项目本身。所谓冰山一角,便是如此。没有水下的冰山,何来一角冰山?为什么有的人常常能够举一反三,那是因为它理解了一个事物的本质,从而能够在这个基础上进行扩展。很多人看源码,却从来不思考更深层次的东西,只关注源码的浅层次的实现功能。

现在该让笔者介绍一些更加有用的学习方式了。

让程序先跑起来

笔者已经说过,程序面向的对象是机器,死的代码没有任何意义,只有计算机认可的代码才是好代码,通过观察运行的程序,笔者可以更加高效的推测程序运行的原理。

读日志

读者可以在运行的程序中加入各种printf,观察打印的日志,从而推测程序的执行思路,并且可以猜测程序的各种原理,并且通过日志来验证它。

带着目的去查看运行中的程序

通常,我们学习一个项目是为了学会其中的各种原理,那么我们必须要有目的,同时要有疑惑,当解决疑惑时,就是我们的提高。为了学习项目而学习项目是不可取的,你应该重点关注你得到了什么,以及如何去运行这些知识,而不是学完后仍然脑袋空空。

上手修改并调试

对程序的修改,是对我们的想法最好的验证,在调试过程中,我们对程序的理解会进一步加深。

明确程序只是算法的具体实现

程序 = 数据结构 + 算法。如果有一些优质的资料介绍代码的算法,笔者建议通过算法来看程序,而不是通过程序推测算法。

在后面的章节中,笔者将会先介绍Sparrow的基本原理以及算法,然后让Sparrow运行起来,通过gdb等软件,一步步执行程序并且介绍Sparrow的程序是怎样实现它的算法的。

Sparrow源码地址:skaiui2/SKRTOS_sparrow at source (github.com)

相关文章:

400行程序写一个实时操作系统(三):Sparrow的学习方法

千里之行始于足下,为了让大家的学习更加事半功倍,笔者将会介绍RTOS的学习方法。 可能很多人拿到一份源码,就想通过各种方式搞懂它,例如抄代码或者读代码。 笔者认为,单纯抄一个实时操作系统是没有任何用处的。比如对…...

为什么人工智能用 Python?

人工智能领域倾向于使用Python,主要归因于Python的多个显著优势: 简洁性与可读性:Python的语法设计简洁明了,代码易于阅读和理解,这对于涉及复杂算法和逻辑的人工智能项目尤为重要。它降低了编程门槛,使得…...

【C++差分数组】P1672何时运输的饲料

本文涉及知识点 C差分数组 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 P1672何时运输的饲料 原文比较啰嗦&#xff0c;我简述一下&#xff1a; 第x天运来F1(1<F1<1e6)千克的饲料&#xff0c;第D&#xff08;1<2e3)天还剩F2&…...

Go基础知识:切片

数组 Go 数组的大小是固定的&#xff0c;其长度是其类型的一部分&#xff08;[4]int并且[5]int是不同的、不兼容的类型&#xff09; var a [10]intb : [2]string{"Penn", "Teller"} b : [...]string{"Penn", "Teller"}package maini…...

Redis配置篇 - 指定Redis配置的三种方式,以及Redis配置文件介绍

文章目录 1 指定Redis配置的三种方式1.1 通过命令行参数来指定Redis配置1.2 通过配置文件来指定Redis配置1.3 在服务器运行时更​​改 Redis 配置 2 关于Redis配置文件 1 指定Redis配置的三种方式 1.1 通过命令行参数来指定Redis配置 在redis启动时&#xff0c;可以直接通过命…...

探索scikit-learn的datasets模块:数据集的加载与使用

引言 在机器学习和数据分析领域&#xff0c;数据集的选择和准备是至关重要的一步。scikit-learn库的datasets模块为我们提供了多种内置的数据集&#xff0c;方便我们进行模型训练和测试。这些数据集既有大型的数据集&#xff0c;也有便于教学和初步探索的小型数据集。本文将重…...

手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]

有时候&#xff0c;您会被锁定在自己的 Android 设备之外&#xff0c;而且似乎不可能重新进入。 一个例子就是你买了一部二手手机&#xff0c;后来发现无法使用。另一种情况是你忘记了屏幕锁定密码和用于验证密码的 Google 帐户凭据。这种情况很少见&#xff0c;但确实会发生&…...

SSL 协议(HTTPS 协议的关键)

所谓的协议 协议只是一种规则&#xff0c;你不按规则来就无法和目标方进行你的工作 协议说白了只是人定的规则&#xff0c;任何人都可以定协议 我们不需要太了解细节&#xff0c;这些是制定和完善协议的人去做的&#xff0c;我们只需要知道协议的一个大概 一、SSL 协议 1、…...

test_2_27(C指针)

test_2_27 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>使用指针数组来模拟实现二维数组int main() {int* arr[10];//指针数组int arr1[] { 1,2,3,4,5 };int arr2[] { 2,3,4,5,6 };int arr3[] { 3,4,5,6,7 };int* arr[3] {arr1, arr2, arr3};int i 0;for …...

设计模式——门面模式 | 外观模式

哈喽&#xff0c;各位盆友们&#xff01;我是你们亲爱的学徒小z&#xff0c;今天给大家分享的文章是设计模式的——门面模式。 文章目录 定义通用类图1.通用结构2.优点3.缺点 使用场景注意事项1.一个子系统可以有多个门面2.门面不参与子系统内的业务逻辑 定义 定义&#xff1a;…...

FPGA时序分析和约束学习笔记(1、FPGA基本原理)

FPGA时序分析和约束学习笔记-&#xff08;1、FPGA基本原理&#xff09; Field现场Programmable可编程Gate门Array阵列 1、FPGA基本资源组成 可编程逻辑功能块&#xff08;logic elements &#xff0c;缩写LE&#xff09; 片内互联线&#xff08;interconnect&#xff0c;缩写…...

VMware桥接模式无法连接网络

windows下打开控制面板&#xff0c;找到WLAN&#xff0c;记住下面的名称&#xff08;带有VMware的都是虚拟机的网卡&#xff0c;要找到物理主机的网卡&#xff09; 回到VMware&#xff0c;编辑——打开虚拟网络编辑器 桥接选择上面的WLAN下的网络名称&#xff0c;确定即可。&…...

YOLO11改进|卷积篇|引入空间通道重组卷积ScConv

目录 一、【SCConv】卷积1.1【SCConv】卷积介绍1.2【SCConv】核心代码 二、添加【SCConv】卷积2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【SCConv】卷积 1.1【SCConv】卷积介绍 SCConv 模块提供了一种新的视角来看待CNNs的特征提取…...

Java:方法详解

目录 一.什么是方法(method) 二.方法定义 三.方法中实参和形参的关系 四.方法重载 五.递归 一.什么是方法(method) 方法就是一个代码片段&#xff0c;再C语言中我们曾经学过一个类似的方式——函数&#xff0c;他们都是将具有独立功能的代码组织成一个整体&#xff0c;形成…...

Python 三方库下载安装

Python 三方库下载安装 1、在线安装 pip install pandas # 直接安装 python -m pip install pandas # 使用指定Python中的pip进行安装 pip install pandas1.2.3 # 安装指定版本 pip install pandas -i http://pypi.douban.com/simple --trusted-host pypi.…...

使用npm i报错node-sass失败问题解决

node 版本&#xff1a;v14.15.4 解决方法&#xff1a; npm config set sass_binary_sitehttps://npmmirror.com/mirrors/node-sass设置完之后&#xff0c;再npm i 就可以下载成功 亲测有效...

vite+vue3实现动态路径导入

最近在做一个项目有个需求: 项目图片分为英语,中文,德语 ,我将这些图片存放到/image/language/下面的每个语言的文件夹内,如en,zh-cn文件夹下面存放对应的语言的图片,如果在代码里面写路径的话,除了要写一堆路径还要判断不同的语言,非常麻烦,但是在vue3vite里面import导入的是加…...

JAVA——File类

目录 1.概述 2.构造方法 a.根据文件路径创建文件对象 b.根据父级路径和子级路径创建对象 c.根据File表示的路径和String表示路径进行拼接 3.常见方法 a.判断文件是否存在 b.判断文件是否为文件夹 c.判断是否为文件 d.获取文件大小 e.获取文件的绝对路径 f.获取定义…...

掌握Postman,开启API测试新纪元!

Postman是一款流行的API测试工具和开发环境&#xff0c;旨在简化API开发过程、测试和文档编制。它提供了一套功能强大的工具&#xff0c;帮助开发人员更轻松地构建、测试和调试Web服务。 Postman 工具的优势 Postman 可以快速构建请求、还可以保存以后再使用。 Postman 还提…...

JAVA-数据结构-排序

1.直接插入排序 1.原理&#xff1a;和玩扑克牌一样&#xff0c;从左边第二个牌开始&#xff0c;选中这个&#xff0c;和前面的所有牌比较&#xff0c;插在合适的位置 public static void insertsort(int[] arr){//直接插入排序for (int i 1; i < arr.length; i) {//此循环…...

魔兽争霸3终极优化指南:三步告别卡顿与显示异常

魔兽争霸3终极优化指南&#xff1a;三步告别卡顿与显示异常 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代电脑上的卡顿、掉帧…...

ICC II时钟树综合(CTS)前,这5个NDR和约束设置没做好,后期时序肯定崩

ICC II时钟树综合前的5个致命陷阱&#xff1a;NDR与约束设置实战指南 时钟树综合&#xff08;CTS&#xff09;是数字后端设计中最关键的阶段之一&#xff0c;而90%的后期时序问题往往源于CTS前的配置疏漏。本文将深入剖析五个最容易被忽视却影响深远的设置环节&#xff0c;结合…...

GAD7980 ADC在振动数据采集中的实战应用与设计要点

1. 项目概述&#xff1a;为什么我们需要“快、精、高”的振动数据采集&#xff1f;在工业设备状态监测、精密仪器分析乃至消费电子性能评估领域&#xff0c;振动数据就像设备的“心电图”。它直接反映了机械结构的健康状况、运动部件的平衡性以及系统运行的稳定性。过去&#x…...

前端新玩具:用几行JavaScript在网页上控制你的游戏手柄和绘图板

前端新玩具&#xff1a;用几行JavaScript在网页上控制你的游戏手柄和绘图板 当游戏手柄的震动反馈通过网页触发&#xff0c;当数位板的压感数据实时映射到Canvas画布——这些曾需要原生应用才能实现的交互&#xff0c;如今在浏览器中只需几行JavaScript代码。Web HID API的诞生…...

实景复刻:动态目标实时映射与轨迹溯源平台

实景复刻&#xff1a;动态目标实时映射与轨迹溯源平台技术定位&#xff1a;实景动态复刻体系构建者 时空轨迹全链路溯源范式开创者执行摘要在数字孪生、视频孪生从静态可视化向动态可计算演进的关键阶段&#xff0c;物理世界与数字世界时空不同步、虚实不精准、动态不连续、轨…...

颠覆性创新:为什么Upkie开源轮式双足机器人正在重新定义机器人开发范式

颠覆性创新&#xff1a;为什么Upkie开源轮式双足机器人正在重新定义机器人开发范式 【免费下载链接】upkie Open-source wheeled biped robots 项目地址: https://gitcode.com/gh_mirrors/up/upkie 在传统机器人设计面临轮式与足式两难选择的今天&#xff0c;一个革命性…...

第08章 FastAPI 与 SSE 流式 RAG 后端

第08章 FastAPI 与 SSE 流式 RAG 后端 到目前为止&#xff0c;知识库、检索工具、MCP 客户端都已经就绪&#xff0c;但仍缺少一个面向最终用户的入口。本章用 FastAPI 把整条 RAG 链路串起来&#xff1a;接收前端发来的自然语言问题&#xff0c;调用 MCP 工具检索相关工单&…...

恶劣环境下LED发光服饰的可靠系统构建:从设计到工艺的工程实践

1. 项目概述与核心挑战如果你曾经尝试过制作一件会发光的服装&#xff0c;无论是为了音乐节、万圣节还是水下表演&#xff0c;你大概都体会过那种“亮一次&#xff0c;修三次”的挫败感。LED灯带在工作室的桌面上测试时完美无瑕&#xff0c;一旦穿到身上&#xff0c;开始活动、…...

3个按键冲突场景,Hitboxer如何帮你重获游戏控制权?

3个按键冲突场景&#xff0c;Hitboxer如何帮你重获游戏控制权&#xff1f; 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否曾在激烈的游戏对战中&#xff0c;因为同时按下W和S键而突然卡住&#xff1f;或…...

Wand-Enhancer:零成本解锁WeMod高级功能的完整指南

Wand-Enhancer&#xff1a;零成本解锁WeMod高级功能的完整指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod专业版的订阅费用而犹豫不决吗…...