自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 2、指针和数组

C语言

2022-08-26 19:47:05 280

原创 1、C语言循环的执行过程

C语言三大循环的执行过程

2022-08-18 10:16:11 565

原创 RT-Thread学习笔记(16):内核移植相关API

目录libcpu相关API实现全局中断开关关闭全局中断打开全局中断实现线程栈初始化实现上下文切换实现第一次切换实现正常切换实现PendSV中断实现时钟节拍libcpu相关API实现全局中断开关无论内核代码还是用户的代码,都可能存在一些变量,需要在多个线程或者中断里面使用,如果没有相应的保护机制,那就可能导致临界区问题。RT-Thread 里为了解决这个问题,提供了一系列的线程间同步和通信机制来解决。但是这些机制都需要用到 libcpu 里提供的全局中断开关函数。/* 关闭全局中断 */rt_ba

2022-04-05 11:44:50 442

原创 RT-Thread学习笔记(15):中断管理

目录什么是中断???中断介绍中断相关名词中断管理的运作机制中断延迟中断处理过程中断前导程序用户中断服务程序中断后续程序中断栈什么是中断???当 CPU 正在处理内部数据时,外界发生了紧急情况,要求 CPU 暂停当前的工作转去处理这个 异步事件。处理完毕后,再回到原来被中断的地址,继续原来的工作,这样的过程称为中断。实现这一功能的系统称为 中断系统,申请 CPU 中断的请求源称为 中断源。中断是一种异常,异常是导致处理器脱离正常运行转向执行特殊代码的任何事件,如果不及时进行处理,轻则系统出错,重则会导致系

2022-04-05 10:46:34 4297

原创 RT-Thread学习笔记(14):内存管理

目录内存管理的基本概念内存管理的运作机制静态内存管理动态内存管理小内存管理模块SLAB内存管理模块内存管理的应用场景静态内存管理接口动态内存管理接口附:memheap 管理算法内存管理的基本概念在计算系统中,变量、中间数据一般存放在系统存储空间中,只有在实际使用时才将它们从存储空间调入到中央处理器内部进行运算。通常存储空间可以分为两种:内部存储空间和外部存储空间。RT-Thread操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型,而不关心这些内存管理函数是如何实现的,所以

2022-04-04 21:35:27 3237

原创 RT-Thread学习笔记(13):软件定时器

硬件定时器和软件定时器硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。软件定时器,软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受硬件定时器资源限制的定时器服务,它实现的功能与硬件定时器也是类似的。使用硬件定时器时,每次在定时时间到达之后就会自动触发一个中断,用户在中断中处理信息;而使

2022-04-04 20:08:09 2837

原创 Linux学习笔记(2):ARM汇编基础

GNU汇编语法GNU 汇编语法适用于所有的架构,并不是 ARM 独享的, GNU 汇编由一系列的语句组成,每行一条语句,每条语句有三个可选部分,如下:label: instruction @ commentlabel 即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意 label 后面的“:”,任何以“:”结尾的标识符都会被识别为一个标号。instruction 即指令,也就是汇编指令或伪指令。@符号,表示后面的是注释,就跟

2022-04-04 16:15:37 338

原创 Linux学习笔记(1):Vim编辑器

画个图记录一下

2022-04-03 21:32:07 139

原创 RT-Thread学习笔记(12):事件

事件特点RT-Thread提供的事件具有如下特点:事件只与线程相关联,事件相互独立,一个32位的事件集合(set变量),用于标识该线程发生的事件类型,其中每一位表示一种事件类型(0表示该事件类型未发生、1表示该事件类型已经发生),一共32种事件类型。事件仅用于同步,不提供数据传输功能。事件无排队性,即多次向线程发送同一事件(如果线程还未来得及读走),等效于只发送一次。允许多个线程对同一事件进行读写操作。支持事件等待超时机制。在 RT-Thread 中,每个线程都拥有一个事件信息标记,它有

2022-04-03 12:47:23 1106

原创 RT-Thread学习笔记(11):互斥量

目录互斥量的优先级继承机制互斥量和二值信号量的区别互斥量的运作机制互斥量控制块互斥量的优先级继承机制在RT-Thread操作系统中为了降低优先级翻转问题利用了优先级继承算法。优先级继承算法是指,暂时提高某个占有某种资源的低优先级线程的优先级,使之与在所有等待该资源的线程中优先级最高那个线程的优先级相等,而当这个低优先级线程执行完毕释放该资源时,优先级重新回到初始设定值。因此,继承优先级的线程避免了系统资源被任何中间优先级的线程抢占。互斥量和二值信号量的区别互斥量与二值信号量最大的不同是:互斥量具有优

2022-04-03 11:57:35 1364

原创 RT-Thread学习笔记(10):信号量

目录概念二值信号量运作机制计数型信号量的运作机制概念信号量(Semaphore)是一种实现线程间通信的机制,实现线程之间同步或临界资源的互斥访问,常用于协助一组相互竞争的线程来访问临界资源。在多线程系统中,各线程之间需要同步或互斥实现临界资源的保护,信号量功能可以为用户提供这方面的支持。二值信号量信号量资源被获取了,信号量值就是 0,信号量资源被释放,信号量值就是 1,把这种只有 0和 1 两种情况的信号量称之为二值信号量。在线程系统中,我们经常会使用这个二值信号量,比如,某个线程需要等待一个标记

2022-04-03 10:58:24 1675

原创 RT-Thread学习笔记(9):邮箱

目录邮箱的概念运作机制邮箱的控制块应用场合参考邮箱的概念邮箱在操作系统中是一种常用的IPC通信方式,邮箱可以在线程与线程之间。中断与线程之间进行消息的传递,此外,邮箱相比于信号量与消息队列来说,其开销更低,效率更高,所以常用来做线程与线程、中断与线程间的通信。邮箱中的每一封邮件只能容纳固定的4字节内容(STM32是32位处理系统,一个指针的大小即为4个字节,所以一封邮件恰好能够容纳一个指针),当需要在线程间传递比较大的消息时,可以把指向一个缓冲区的指针作为邮件发送到邮箱中。线程能够从邮箱里面读取邮件消

2022-03-27 13:21:48 2760

原创 RT-Thread学习笔记(8):消息队列

本节笔记参考于:野火-《RT-Thread内核实现与应用开发实战》以及RT消息队列基本概念消息队列的运作机制消息队列的阻塞机制消息队列的应用场景常用函数基本概念消息队列,是一种常用于线程间通信的数据结构,队列可以在线程与线程间、中断和线程间传送信息,实现了线程接收来自其他线程或中断的不固定长度的消息,并根据不同的接口选择传递消息是否存放在线程自己的空间。线程能够从队列里面读取消息,当队列中的消息是空时,挂起读取线程,用户还可以指定挂起的线程时间timeout;当队列中有新消息时,挂起的读取线程被唤醒并

2022-03-27 12:03:36 2893

原创 RT-Thread学习笔记(7):线程管理

本节笔记参考于:野火-《RT-Thread内核实现与应用开发实战》以及RT线程管理线程基本概念线程调度器线程状态线程挂起函数线程恢复函数线程设计要点RT-Thread中程序运行的上下文包括:中断服务函数:线程:空闲线程:线程执行时间线程基本概念RT-Thread的线程可认为是一系列独立线程的集合。每个线程在自己的环境中运行。在任何时刻,只有一个线程得到运行,RT-Thread调度器决定运行哪个线程。调度器会不断启动、停止每一个线程,宏观看上去所有的线程都在同时在执行。作为线程,不需要对调度器的活动有所

2022-03-26 17:16:15 2892

原创 RISC-V汇编语言(5)

汇编语言RISC-V 汇编语言入门汇编语言概念简介汇编语言语法介绍RISC-V 汇编指令总览RISC-V 汇编指令操作对象RISC-V 汇编指令编码格式指令格式(format)主机字节序 (HBO - Host Byte Order)RISC-V 汇编指令分类RISC-V 汇编伪指令一览RISC-V 汇编指令进阶算术运算指令逻辑运算指令移位运算指令内存读写指令条件分支指令无条件跳转指令RISC-V 指令寻址模式总结RISC-V 汇编函数调用约定函数调用过程概述汇编编程时为何需要制定函数调用约定有关寄存器的编

2022-03-25 21:29:46 3784

原创 嵌入式开发(4)

什么是嵌入式开发嵌入开发是一种比较综合性的技术,它不单指纯粹的软件开发技术,也不单是一种硬件配置技术;它是在特定的硬件环境下针对某款硬件进行开发,是一种系统级别的与硬件结合比较紧密的软件开发技术。交叉编译参与编译和运行的机器根据其角色可以分成以下三类:构建(build)系统:执行编译构建动作的计算机。主机(host)系统:运行 build 系统生成的可执行程序的计算机系统。目标(target)系统:特别地,当以上生成的可执行程序是 GCC 时,我们用 target 来描述用来运行 GCC 将

2022-03-25 17:11:07 705

原创 编译与链接(3)

GCC介绍GCC 的命令格式GCC 的主要执行步骤GCC 涉及的文件类型ELF介绍ELF简介ELF文件格式ELF文件处理相关工具学习本节的好处有利于程序员优化程序的性能。譬如:switch vs if-else;函数调用的开销,传参数时传变量还是指针,…理解并解决编译链接时出现的错误。譬如:“error:XXXXXX redefined”,“error: cannot findXXXXXX”, …写出更健壮的程序。缓冲区溢出,非法访问,“Segmentation fau

2022-03-25 15:41:07 190

原创 RISC-V介绍(2)

ISA的基本介绍ISA是什么ISA(Instruction Set Architecture)指令集架构:是底层硬件电路面向上层软件程序提供的一层接口规范。ISA定义了:基本数据类型:BYTE/HALFWORD/WORD/……寄存器(Register)指令寻址模式异常或者中断的处理方式等等 …为什么要 ISA为上层软件提供一层抽象,制定规则和约束,让编程者不用操心具体的电路结构。CISC vs RISCCISC 复杂指令集(Complex Instruction Set C

2022-03-25 14:16:36 490

原创 计算机系统(1)

计算机的硬件组成组成图Central Processing Unit:中央处理单元(CPU)Control Unit:控制单元,指令处理、解析、运行。Arithmetic Logical Unit:算术逻辑单元,用于运算。Register:寄存器组,处理的数据都是放在寄存器的。IO桥:CPU跟外部交流的一个枢纽。Main Memory:主存。各种各样的外设。两种架构冯·洛伊曼架构:指令和数据不加区分的存储在存储器中,由同一个总线传输,优点是开销小,控制逻辑实

2022-03-24 21:19:00 190

原创 RT-Thread学习笔记(6):文件系统的使用(F407外置Flash带移植过程)

1、虚拟文件系统本节内容建议参考:文件系统RT-Thread官方介绍,我也是copy过来的。文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型 (Abstract data type),是一种用于向用户提供底层数据访问的机制。文件系统通常存储的基本单位是文件,即数据是按照一个个文件的方式进行组织。当文件比较多时,将导致文件繁多,不易分类、重名的问题。而文件夹作为一个容纳多个文件的容器而存在。DFS简介DFS 是 RT-Thread 提供的虚拟文件系统组件,全称为 Devic

2022-03-20 19:07:24 1937

原创 RT-Thread学习笔记(5):SPI驱动框架分析

1、两个设备模型在spi驱框架中,一般会自己初始化一个总线设备(rt_spi_bus),当我们通过挂载后,会相应注册一个从设备(rt_spi_device)。1、总线设备模型struct rt_spi_bus{ struct rt_device parent; rt_uint8_t mode; const struct rt_spi_ops *ops; struct rt_mutex lock; struct rt_spi_device *owner;};

2022-03-14 21:22:44 11011 2

原创 RT-Thread学习笔记(4):正点原子F407配置STemwin

1、准备工作正点原子F407开发板ENV工具Keil编译器RT-Thread4.0.5源码正点原子屏幕2、移植开始生成代码目录输入scons --distmenuconfig配置保存添加文件(drv_lcd.c)\dist\stm32f407-atk-explorer\packages\STemWin-latest\demo目录下这里使用的是做好的BSP,我们LCD是使用FSMC控制的,BSP的stm32f4xx_hal_msp.c已经有了HAL_FSMC_Msp

2022-03-12 11:11:30 4963

原创 RT-Thread学习笔记(3):启动流程

RT-Thread的启动流程本节内容学习于RT-Thread官方文档。通过前两节,大家大概理解了RT-Thread的驱动框架,现在我先给大家展示一个代码:int main(void){ int count = 1; /* set LED0 pin mode to output */ rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); while (count++) { rt_pin_write(LED0_PIN,

2022-03-10 19:37:08 478

原创 RT-Thread学习笔记(2):serial驱动框架简要分析

rt_hw_usart_init函数干了些什么??之前写了一篇pin设备框架分析pin设备框架分析,简单理了一下pin设备框架实现的思想,其实今天要说的串口基本类似,今天咱们就长话短说,我介绍几个重要的部分。首先就是标题的这个函数。包括上一节内容的**int rt_hw_pin_init(void)**函数。我们都是围绕这个进行介绍的。int rt_hw_usart_init(void){ rt_size_t obj_num = sizeof(uart_obj) / sizeof(struc

2022-03-10 18:59:30 1758

原创 RT-Thread学习笔记(1):pin设备框架的简单解读

重要结构体介绍rt_device_pin结构体struct rt_device_pin{ struct rt_device parent; /* 父类 */ const struct rt_pin_ops *ops; /* 操作函数集 */};rt_device结构体struct rt_device{ struct rt_object parent; /**< inherit from rt_objec

2022-03-10 12:55:06 1578 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除