STM32之RTOS:uCOS和FreeRTOS

2023-05-16

RTOS全称是 Real Time Operating System,中文就是实时操作系统。

RTOS是指一类系统,如 uC/OS,FreeRTOS,RTX,RT-Thread 等,都是 RTOS 类操作系统。

ucosii            Micrium(2016被Silabs收购)
ucosiii
freertos         英国Real Time Engineers Ltd,Richard Barry. 开源、免费商用,市占率最高
rtx                 Keil/ARM    官方支持,发展很快,将M3/M4内核性能充分发挥
rawos            国内高质量rtos,商业化原因暂停维护中
embOS         Segger        高品质,没它家的GUI产品emWin火

FreeRTOS 是RTOS中的一种,免费且开放源码。完全可以免费用于商业产品。同时,FreeRTOS十分的小巧,内核只有3个.c文件,全部与任务调度有关,可以在资源有限的微控制器中运行。

因此,许多半导体厂商产品的SDK(Software Development Kit—软件开发工具包) 使用FreeRTOS作为其操作系统,尤其是 WIFI、蓝牙这些带协议栈的芯片或模块。

如上图所示,裸机也叫做前后台系统,中断属于前台系统,while(1)循环中的叫做后台系统,任务是顺序执行的。而RTOS(Real Time OS)即实时操作系统。在RTOS支持的系统中,每个任务均有一个优先级(类似前面章节的中断抢占优先级),而当前正在运行的任务永远都是已经就绪的最高优先级任务,如上图中所示在裸机中假设在某种情况下需要马上运行task4,但是却不能够马上响应,需要轮到task4执行时,才可以运行,这样就不实时了,而且使用中断可能也不合适,因为中断处理函数中代码执行的代码越少越好,也需要避免使用浮点运算,局限太大了。而实时操作系统可以通过一些任务管理的方式(抢占或挂起)让需要优先运行的任务立即运行,除了中断能够打断其他的任务都不能够,这也是被称为实现系统的原因,任务管理后面再进行补充。
使用实时操作系统还需要额外的ROM/RAM开销,2~5%的CPU额外负荷,以及内核的费用,但是嵌入式实时操作系统提高了系统的可靠性;线程方式的并发任务处理,解决模块化问题,同时保证实时性;官方提供了网络协议栈、文件系统、图形界面(ucGUI、emWin、QT....)的支持;嵌入式实时操作系统充分发挥了32位CPU的多任务潜力。

用RTOS做嵌入式开发的优势

1.并发性
裸机程序并发工作效率低,不可避免的在主程序中会有一个超级大的 while(1) 循环,这里面几乎包含整个项目的所有业务逻辑。因为每个业务逻辑里面都会有delay这样的循环等待函数,这样导致了所有的业务逻辑几乎都是串行起来工作的。这个时候CPU就会有很多时间都浪费在了延时函数里,一直在空转,导致软件的并发效率非常差;
2.模块化:高内聚、低耦合的原则
从软件工程的角度,我们在做软件开发时,都会强调高内聚、低耦合的原则。而裸机的模块化开发难度非常大,模块间的耦合较重,这也导致了无法在大型项目使用裸机来开发。还是刚才 main 函数中大 while(1) 的例子,可以想象到那么多功能都紧紧的挤在一个函数里,不可拆分,模块化开发的困难重重;
举一个非常贴切的例子,在一些使用看门狗的项目中,如果使用delay延时函数,那得注意点,万一延时过长,主函数来不及喂狗,看门狗就被触发了。最后会产生这样一种感觉,一个简简单单的delay还得考虑喂狗功能,裸机开发时操的心太多了,自然无法应用在大型项目中;
3.生态
很多高级软件组件,必须依赖于操作系统来实现;
4.实时性
软件的实时性在一些领域会有一定的要求,软件的每个步骤必须在指定的时间被触发。工控领域就是最常见到的场景,如果实时性无法保证,机械设备可能就无法按照指定时序要求去动作,以至于发生机械事故,甚至会威胁到人的生命。回过来接着看裸机软件,如果软件变得庞大以后,可以想象到,主程序中那么大的一个 while(1) 循环,代码耦合严重,到处都是delay延时,要保证实时性几乎是不可能的;
5.可重用性
在嵌入式碎片化极其严重的时代,各式各样的芯片,想要让同样的代码,在裸机环境下同时适配不同的硬件,难度非常大。这样也就导致了裸机的代码会过多的依赖于底层硬件,重复造轮子的过程也就不可避免。

常见RTOS优势对比

常见的RTOS有UCOS/FreeRTOS/RT-Thread,其中RT-Thread是国产的,它们的年限都比较长了,在市面上都有一定的知名度,用过的人比较多。
1. 基本功能、性能
各家 RTOS 差异很小,可比性并不是很大;
2. 易用性/可读性
其中FreeRTOS做的比较差。UCOS可读性强,注释很全。做的最好的是RT-Thread,它是类Linux的代码风格,面向对象的设计模式,代码简洁易懂。在保证了体积(最小 ROM:3K RAM:1.5K)的同时,还借鉴了 Linux 的设备驱动框架、虚拟文件系统、Shell 等功能,设计更加优雅;
3.组件丰富性
RT-Thread比起传统UCOS、FreeRTOS 不仅仅在基础功能上多而全,多达50个以上的可重用软件组件,还有很多物联网组件,对于物联网产品几乎做到开箱即用。RT-Thread还可以运行PythonJava、Lua 这些高级语言的脚本,进一步降低开发难度;
4.开发资料
这块UCOS做的最好,还有配套相关的书籍,FreeRTOS属于后起之秀,网上也有很多相关资料。RT-Thread 这块之前还是略显薄弱的。因此,入门RTOS最好的系统就首选UCOS。

RTOS也是一种操作系统,只不过相对Win和Linux来说,具有实时性特点,响应及时。

大体来说,RTOS也符合操作系统的一般特点。能够为我们提供进程调度、内存管理、文件管理、IO管理等功能。让上层应用不必再花费时间去处理这些问题,操作系统已经帮我们写好了。操作系统在本质上也是一整套具有管理功能的C程序。

关于操作系统的一般性内容,可以参考操作系统这门课。

本文主要记录RTOS的一些关键问题。

uCOS

一、概述

μC/OS-II(Micro Control Operation System)由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适用于多种微处理器,微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。 μC/OS-II已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO-178B标准。现在最新版的是μC/OS-III。

Micrium官网:Micrium Software and Documentation - Silicon Labs

二、性质

  • μC/OS-II被广泛应用于微处理器、微控制器和数字信号处理器。
  • μC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean J.Labrosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的B B S 上。
  • μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的, 绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。
  • 严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。
  • uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。
  • uC/OS-II以源代码的形式发布,是开源软件, 但并不意味着它是免费软件。你可以将其用于教学和私下研究(peaceful research);但是如果你将其用于商业用途,那么你必须通过Micrium获得商用许可。 

三、应用

μC/OS-II可以提供如下服务:

  • 信号量

  • 互斥信号量

  • 事件标识

  • 消息邮箱

  • 消息队列

  • 任务管理

  • 固定大小内存块管理

  • 时间管理

另外,在μC/OS-II内核之上,有如下独立模块可供用户选择:

  • μC/FS文件系统模块

  • μC/GUI图形软件模块

  • μC/TCP-IP协议栈模块

  • μC/USB协议栈模块

四、组成

μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。

1) 核心部分(OSCore.c)

是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。

2) 任务处理部分(OSTask.c)

任务处理部分中的内容都是与任务的操作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μC/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。

3) 时钟部分(OSTime.c)

μC/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等操作是在这里完成的。

4) 任务同步和通信部分

为事件处理部分,包括信号量、邮箱、邮箱队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。

5) 与CPU的接口部分

是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用性的操作系统,所以对于关键问题上的实现,还是需要根据具体CPU的具体内容和要求作相应的移植。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。

五、任务管理

uC/OS-II 中最多可以支持256个任务,分别对应优先级0~255,其中0 为最高优先级。255为最低级。

注意:uC/OS中最多可以支持64个任务,分别对应优先级0~63,其中0 为最高优先级。63为最低级。

uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。

系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整型变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu的利用率。

六、时间管理

uC/OS-II的时间管理是通过定时中断来实现的,该定时中断一般为10毫秒或100毫秒发生一次,时间频率取决于用户对硬件系统的定时器编程来实现。中断发生的时间间隔是固定不变的,该中断也成为一个时钟节拍。

uC/OS-II要求用户在定时中断的服务程序中,调用系统提供的与时钟节拍相关的系统函数,例如中断级的任务切换函数,系统时间函数。

七、内存管理

在ANSI C中是使用malloc和free两个函数来动态分配和释放内存。但在嵌入式实时系统中,多次这样的操作会导致内存碎片,且由于内存管理算法的原因,malloc和free的执行时间也是不确定。

uC/OS-II中把连续的大块内存按分区管理。每个分区中包含整数个大小相同的内存块,但不同分区之间的内存块大小可以不同。用户需要动态分配内存时,系统选择一个适当的分区,按块来分配内存。释放内存时将该块放回它以前所属的分区,这样能有效解决碎片问题,同时执行时间也是固定的。

八、通信同步

对一个多任务的操作系统来说,任务间的通信和同步是必不可少的。uC/OS-II中提供了4种同步对象,分别是信号量,邮箱,消息队列和事件。所有这些同步对象都有创建,等待,发送,查询的接口用于实现进程间的通信和同步。

九、任务调度

uC/OS-II 采用的是可剥夺型实时多任务内核。可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。

uC/OS-II的任务调度是完全基于任务优先级的抢占式调度,也就是最高优先级的任务一旦处于就绪状态,则立即抢占正在运行的低优先级任务的处理器资源。为了简化系统设计,uC/OS-II规定所有任务的优先级不同,因为任务的优先级也同时唯一标志了该任务本身。

1) 高优先级的任务因为需要某种临界资源,主动请求挂起,让出处理器,此时将调度就绪状态的低优先级任务获得执行,这种调度也称为任务级的上下文切换。

2) 高优先级的任务因为时钟节拍到来,在时钟中断的处理程序中,内核发现高优先级任务获得了执行条件(如休眠的时钟到时),则在中断态直接切换到高优先级任务执行。这种调度也称为中断级的上下文切换。

这两种调度方式在uC/OS-II的执行过程中非常普遍,一般来说前者发生在系统服务中,后者发生在时钟中断的服务程序中。

调度工作的内容可以分为两部分:最高优先级任务的寻找和任务切换。其最高优先级任务的寻找是通过建立就绪任务表来实现的。u C / O S 中的每一个任务都有独立的堆栈空间,并有一个称为任务控制块TCB(Task Control Block)的数据结构,其中第一个成员变量就是保存的任务堆栈指针。任务调度模块首先用变量OSTCBHighRdy 记录当前最高级就绪任务的TCB 地址,然后调用OS_TASK_SW()函数来进行任务切换。

获取uCOS

Micrium官网:Micrium Software and Documentation - Silicon Labs

获取操作系统时要明白,它不是一套放之四海而皆准的程序,是需要和具体的CPU架构进行匹配的,目前,已经在市面上大多数的CPU上移植过了,需要找到和你所用开发板相对应的版本,或者最相近的版本。

我们拿到的也不一定就和我们的开发板一模一样,可能有一些差别,所以通常我们获取之后也要做进一步的移植。

通常的原则是这样的,该操作系统大体上分为内核部分(一般和硬件无关)和其他硬件相关部分,我们找的时候,如果没有完全相对应的型号,首先也要保证内核上是一致的,如果内核都不一致,我们拿过来基本就无法使用。接下来,就是型号匹配度越高越好。匹配度越高,我们就越能“拿来就用”,否则,移植的时候要调的东西就越多。

进入官网后,不知道的,还真一时找不到在哪下载。

在这里插入图片描述

点进去之后,简单介绍了下ucos,然后就介绍CesiumRTOS,不知道这是啥意思。难道就是ucos的官方叫法?后来查了下才发现不是。

我们要点击EXAMPLS*******************************************
在这里插入图片描述
然后在打开的界面中选择相对应厂家的ucos版本(筛选或者直接往后拉直接选择)

点进去,发现啥也没有。

注意上面那段话,说是要注册登录,才能看到下载入口(据说注册很麻烦,因为是外网,QQ邮箱是没用的,收不到链接)。

这里我就不去注册了,直接去百度找一份。

ucOS目录结构

 找到一份ucOS II,大小9.49M,里面有如下内容:

ucOS大体分为两部分,一部分是硬件无关的,操作系统内核的内容(实际存在一小部分硬件相关的),集中在uC-CPU/uC-LIB/uCOS-II这三个文件夹中。

其他的是跟硬件相关的,是厂家根据具体的开发板添加进去的内容,是和开发板上的硬件相关的。比如串口usart,APP目录、BSP目录。

LstFlash/LstRAM/ObjFlash/ObjFlash,都是编译后生成的内容,可以直接删除。

这里设置的内容

KeiDelAll.bat是个可以删除的批处理文件。

STM32F10xR.LIB是标准库文件,到时通过这个去链接Keil中包含的头文件。可以不删。

另外,有些文件夹中有些无关的内容,比如和工程有关的内容,可以一并删除。

硬件无关的部分,我们要理解,要会用,而不必去修改;我们重点关注的是硬件相关部分,也就是我们移植的时候要去调整的代码。

ucOS移植需知

RTOS其实就是一个大的裸机程序,也是从main开始运行的;
main之前也是有一个汇编的启动文件的;
main中调用了很多初始化函数;

bsp部分介绍
bsp是board support packet 板级支持包
bsp其实就是对硬件操作的封装(底层驱动或中间驱动层封装)
完全移植的工作量主要就在bsp这一块,目标是,调通板载的所有硬件。

……

在移植的时候,可能需要使用到标准库或者HAL,根据具体需要将相关库一并加入工程。




FreeRTOS

实时操作系统,本用于追求实时性的嵌入式系统,典型:ucos、uclinux、vxworks
特点:中断响应快、一般可嵌套中断、使用实地址、多任务
近年来趋势:由RTOS向IoTOS转型。典型:freertos、LiteOS(华为)、rt-thread,即物联操作系统,越来越讲究对网络的支持。

freertos以前是第三方免费rtos,后被amazon收购
官网:FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions

FreeRTOS 版权

FreeRTOS 由美国的Richard Barry于2003年发布,Richard Barry是FreeRTOS的拥有者和维护者,在过去的十多年中FreeRTOS历经了9个版本,与众多半导体厂商合作密切, 累计开发者数百万,是目前市场占有率最高的 RTOS。

FreeRTOS于2018年被亚马逊收购,改名为 AWS FreeRTOS,版本号升级为 V10,且开源协议也由原来的 GPLv2+修改为 MIT,与GPLv2+相比,MIT更加开放,你完全可以理解为是为所欲为的免费。V9 以前的版本还是维持原样,V10 版本相比于V9就是加入了一些物联网相关的组件,内核基本不变。亚马逊收购FreeRTOS也是为了进军眼下炒的火热的物联网和人工智能。

FreeRTOS收费问题

FreeRTOS 是一款 “开源免费”的实时操作系统,遵循的是 GPLv2+的许可协议。这里说 到的开源,指的是你可以免费得获取到 FreeRTOS 的源代码,且当你的产品使用了 FreeRTOS 且没有修改 FreeRTOS 内核源码的时候,你的产品的全部代码都可以闭源,不用开源,但是当 你修改了 FreeRTOS 内核源码的时候,就必须将修改的这部分开源,反馈给社区,其它应用部 分不用开源。免费的意思是无论你是个人还是公司,都可以免费地使用,不需要掏一分钱。

目录结构

只有三个文件夹:

FreeRTOS

第一个FreeRTOS是被亚马逊收购前本来就用的内容:

Source里面就是内核的源代码。

portable是硬件相关的部分。 

其他c文件就是硬件无关的部分。

以前就第一个文件夹,后来被亚马逊收购后,可以更好的对接网络。于是多了两个文件夹FreeRTOS-Labs和FreeRTOS-Plus。

FreeRTOS-Plus

这里面大多是跟网络相关的一些内容。

FreeRTOS-Labs

是FreeRTOS-Plus的最小化代码,方便其用在一些存储容量不够用的场景。

简单总结:

(1)FreeRTOS目录,原有部分,主体是kernel和port部分
(2)FreeRTOS-Plus目录,IoTOS附加部分,主体是第三方联网组件
(3)FreeRTOS-Labs目录,IoTOS附加部分,面向轻资源设备的第三方联网组件
RTOS学习主要学什么
(1)RTOS的应用开发,核心是任务创建、IPC、内存管理等
(2)RTOS的内核开发,核心是kernel部分源码解析和port部分硬件相关
(3)IoT开发,核心是IoTOS提供的组件和资源使用,每个IoTOS玩法资源都不同

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32之RTOS:uCOS和FreeRTOS 的相关文章

  • PostgreSQL查询

    PostgreSQL 数据库连接 QT xff1a 建立到数据库的连接 QSqlDatabase db 61 QSqlDatabase addDatabase 34 QPSQL 34 db setHostName 34 localhost

随机推荐

  • Conda install 报错:An HTTP error occurred when trying to retrieve this URL. HTTP errors are often...

    1 问题描述 xff1a 准备在Anaconda prompt执行以下命令 xff1a conda install c stellargraph stellargraph 报错 xff1a An HTTP error occurred wh
  • svn原理----revert,回滚

    一 子命令Svn revert 取消所有的本地编辑 下面我们来看一下子命令Svn revert例子 xff1a 丢弃对一个文件的修改 xff1a Svn revert foo c Reverted foo c 如果你希望恢复一整个目录的文件
  • Qt 自定义控件提升,头文件找不到的问题

    Qt 自定义控件提升 xff0c 头文件找不到的问题 在附加包含目录添加 xff1a
  • 分析int(*p)[4] = a

    面试题 xff1a 二级指针 include lt iostream gt int main int a 3 4 61 0 1 2 3 4 5 6 7 8 9 10 11 int p 4 61 a std cout lt lt p 43 1
  • af::convolve在CUDA中局限性

    使用在Cuda出现访问冲突问题 xff08 opengcl正常 xff09 xff1a af convolve I I kernel 报错 xff1a 0x00007FFC6443ADAC af dll 处 位于 XXXX exe 中 引发
  • 2016

    2016 最近 xff0c 许多朋友兴起总结2016了 xff0c 看得我心痒 xff0c 心热 我自己不禁也总结起来了 别人的总结要么是 2016XXXX 要么是 2016OOOO 我苦思2秒 xff0c 却想不起一个标题来 xff0c
  • gdb反汇编disassemble

    GDB Command Reference disassemble command gdb反汇编可用disassemble disass命令 用法如下 xff1a disassemble disassemble Function 指定要反汇
  • S.M.A.R.T. 参数(smartctl)计算硬盘精确健康值

    参考 xff1a Acronis Drive Monitor Disk Health Calculation 文章目录 1 背景2 smartctl a dev sda3 计算健康值3 1 关键参数3 1 1 公式说明3 2 2 计算举例
  • python脚本——通过telnet连接设备

    文章目录 一 说明二 代码三 用法总结 一 说明 通过telnetlib库 xff0c telnet到设备上并做一些测试 包括重启设备 等待重启完成 其它测试操作等 二 代码 span class token comment usr bin
  • lspci 命令详解及常用命令

    文章目录 一 说明二 参数说明三 用法举例 一 说明 lspci是查看设备上pcie设备信息的命令 该命令的不同参数配合 xff0c 在查看pcie设备和定位pcie问题时很有用 包括查看pcie设备中断号 查看配置空间内容 修改配置空间寄
  • 中断模式和polling模式 && 硬件中断和软件中断

    文章目录 一 总结在前二 中断2 1 硬件中断与软件中断2 1 1 对比2 1 2 硬件中断2 1 3 软件中断 三 polling 一 总结在前 S NOInterruptPolling1中断模式下 xff0c 设备通知CPU有业务需要被
  • dma_alloc_coherent 申请内存用法和问题总结

    文章目录 1 dma alloc coherent用法2 问题3 解决方法方法一 xff0c 走CMA空间配置3 1 内核配置 96 96 CONFIG CMA 96 96 3 2 修改cma起始地址3 3 设置cma空间 xff08 大小
  • hadoop之HDFS:通过Java API访问HDFS

    HDFS是一个分布式文件系统 xff0c 可以通过Java API接口对HDFS进行操作 xff0c 下面记录实现Java API的过程和出现的一些问题及解决方案 环境搭建 导入jar包 common包中的jar文件导入 hadoop 2
  • sonic开发——修改内核配置

    参考 xff1a https github com Azure sonic linux kernel sonic 中的内核配置修改不需要编译menuconfig xff0c 而是直接修改 patch kconfig exclusions和p
  • 计算机内存管理之内存访问

    文章目录 一 设备I O内存访问ioremap amp ioremap nocacheioremap cachedioremap wc amp ioremap wtI O内存访问流程 二 设备地址映射到用户空间mmap过程 三 devmem
  • 内存管理之预留内存

    文章目录 一 memblock二 cmdline 有时候 xff0c 我们需要预留一段内存不受内核直接管理分配 xff0c 有什么办法 xff1f 一 memblock mmeblock是内存的一种管理机制 xff0c 主要管理这两种内存
  • 远程工作的一些命令

    文章目录 git配置ssh免密登录sshfs映射远程目录linux远程控制其它主机vscode ssh失败 git配置 git config global user name usrname git config global user e
  • 机器视觉-相机标定及畸变矫正

    摘要 xff1a 本文首先介绍了针孔相机模型 xff08 线性模型 xff09 xff0c 然后推导四个坐标轴变换的关系 xff0c 引出R T K D中包含相机的5个内参 xff0c 6个外参 然后介绍相机畸变的原因以及畸变模型 xff0
  • STM32的寄存器操作

    STM32最基本的 xff0c 最底层的 xff0c 就是对寄存器的直接操作 通过操作特定寄存器的特定位 xff0c 来实现相对应的功能 本文通过GPIO点亮LED来演示 GPIO 查阅数据手册 xff0c 了解相关内容 启动代码 旧版的k
  • STM32之RTOS:uCOS和FreeRTOS

    RTOS全称是 Real Time Operating System xff0c 中文就是实时操作系统 RTOS是指一类系统 xff0c 如 uC OS xff0c FreeRTOS xff0c RTX xff0c RT Thread 等