自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 深入理解 Cache

​ Cache 在物理实现上就是 sram (Static Random Access Memory),Cache 位于 CPU 与 内存(Dram)之间,也称为 L1 cache(一级缓存)。Cache 是位于 CPU 和主内存之间的一个小而快速的内存块,就叫它为缓存吧。CPU 对缓存的访问速度明显快于对主存储器的访问。每当 CPU 读取或写入特定地址时,它都会首先在缓存中查找它,如果它在缓存中找到地址,它将使用缓存中的数据,而不是执行对主内存的访问。

2024-07-21 18:04:02 496

原创 mmu 是什么?为什么需要 mmu ?

​ mmu (Memory Management Unit) 即内存管理单元,是 cpu 可选的硬件模块。​ 在编程人员使用角度,虚拟内存与物理内存都是一串数字(地址),只不过在访问虚拟内存时,cpu 发出的地址访问命令总先被 mmu 来劫持,而不是直接通过总线发送到内存控制器上。

2024-04-14 16:17:45 671

原创 移植 Zephyr 到 Art-Pi

​ 最近工作中接触到了 Zephyr,不由觉得 Zephyr 是个很强大、全面、优秀的实时操作系统,但同时是有一定的上手难度的,其复杂的构建系统让小编倒吸一口凉气。但此时,Zephyr 的 shell 还不能使用,因为 shell 作为 Zephyr 的一个子系统此时还未使能,这也是 Zephyr 构建系统的一大优势,以搭积木的形式构建系统,缺少某一模块,仍然能够编译链接通过,仅仅是该能力缺失而已。​ 这一命令的背后到底发生了什么?​ 使用命令行的方式虽然能进行调试,但是很麻烦,效率不高,这时候可参考。

2024-03-24 00:06:53 993

原创 Zephyr 源码调试

本文章介绍如何在 Zephyr 提供的 qemu 上调试 Zephyr 源码,为后续分析 Zephyr OS 相关原理做铺垫

2024-01-24 22:06:40 740 1

原创 Zephyr 学习笔记(一)

Zephyr OS 是一个占用空间小的内核,用于资源受限的嵌入式系统:从简单的嵌入式环境传感器、LED 可穿戴设备到复杂的嵌入式控制器、智能手表和物联网无线应用.

2024-01-20 23:42:11 855

原创 面向对象设计原则

变化是复用的天敌,面向对象设计最大的优势在于:抵御变化。

2023-07-23 14:45:34 168

原创 代理服务器与CDN的概念

域名发给 DNS 服务器后,DNS 服务器发现这个域名有些特殊,DNS 会告诉客户端向 CDN DNS 服务器要,CDN DNS 服务器就返回 CDN 负载均衡系统的 IP 地址,CDN 负载均衡系统会根据客户端的 IP 地址返回离客户端最近的 CDN 服务器的 IP 地址。类似于 CPU 的 cache 机制,cache 命中了就相当于 CDN 服务器上有想要的资源,cache 未命中,cdn 去源站获取资源并缓存。内容所有者向 CDN 运营商指出费用,CDN 将其内容交付给最终用户。

2023-04-02 12:44:52 804 1

原创 ELF 文件格式 ------- 符号表

为了让链接器能够修改引用外部符号的位置处的机器码,还需要一个重定位表,该表必然记录了需要修改的机器码在该文件中的位置(offect)以及被引用符号所在符号表的 index,有了需要被修改的位置,有了被引用符号所在该文件符号表的 index,就能够找到被引用符号的 symbal 信息,进而扫描全局符号表,看有没有与这个 symbal 信息相匹配的。通过 symbal 节,能够描述可重定位文件中所有符号的信息,包括该符号的作用域、强还是弱符号,以及该符号是否是外部符号。符号的数据结构描述了一个符号的所有信息。

2023-03-26 17:02:43 1593

原创 ELF 文件格式 ------- 节头部表

​ ELF(Executable and Linking Format)是一种文件格式,该格式的文件可执行,可链接。可执行是站在操作系统的角度的,可链接是站在链接器(Linker)的角度。可执行指的是操作系统能够加载该文件到内存中,并让 CPU 去执行该文件中的指令。可链接指的是链接器能够将分离的这种格式的文件链接(拼图)成为一个可以让操作系统加载的文件。

2023-03-12 22:43:58 692

原创 网络安全 -------- 加解密

(只要文件发生改动,经过单项散列函数处理后得到地摘要都会不一样,所以,文件和文件的摘要具有很强的对应关系)接收方接收后,使用发送方的公钥,将加密的摘要解开,得到 128 bit 的摘要,然后将文件进行单项散列函数,得到摘要,然后与解密出来的摘要进行对比,相等则文件完整。散列值的长度与消息长度无关,无论消息是 1bit、10m、100G,单项散列函数都会计算出固定长度的散列值。报文鉴别:消息接收者可以使用收到的公钥对加密的摘要进行解密,从而核实消息发送者对文件的签名。输出的散列值也被称为:消息摘要,指纹。

2023-01-27 23:20:56 1354 1

原创 冲破临界区

冲破临界区

2022-11-12 11:47:11 262

原创 Linux 文件系统

data block (数据区块) 是用来放置文件内容数据的地方,在 Ext2 文件系统中所支持的 block 大小有 1k,2k,及 4k 三种,在格式化时就固定了,且每个 block 都有编号,以方便 inode 的记录。​ 文件系统通常会将这两部分的数据分别存放在不同的区块,权限与属性放到 inode 中,至于实际数据则放到 data block 区块中。Ext2 文件系统在格式化的时候基本上是区分为多个区块群组的,每个区块群组都有独立的 inode/block/superblock 系统。

2022-10-07 23:22:45 240

原创 C 语言可变参数

​ 任何一个可变参数的函数都必须至少包含一个固定参数,可选参数由于数目不定(0个或以上)使用 …表示

2022-10-07 23:11:06 447

原创 交叉编译 openocd

​ 一般的开源项目都是在 linux 环境下开发的,可以在 linux 环境下安装相关依赖后,直接从源码编译为可执行文件使用,linux 的可执行文件为 elf 格式,而 windows 为 exe,这对 windows 环境就很不友好了

2022-09-17 17:16:20 3265

原创 rtos 中对共享资源的保护策略

rtos 中对共享资源的保护策略

2022-09-05 22:38:13 349

原创 shell 脚本执行机制

shell 脚本执行机制

2022-08-13 14:54:56 277

原创 处理器的调试接口

​在 Cortex M 中对处理器上对总线逻辑的控制使用另外的总线接口,即所谓的 “调试访问端口(DAP)”。

2022-08-06 23:35:31 2104

原创 rt-thread 中对 hardfault 的处理

​ 当系统进入异常时,通常会进入异常对应的处理函数,当系统中存在非法操作时,比如除0、非对齐访问、爆栈,此时便会触发 hardfault 异常

2022-07-03 18:32:22 1480

原创 GDB 在嵌入式中的相关概念

GDB 是什么

2022-06-28 22:41:45 211

原创 链接器 --- Linker

​ 对于经常使用 IDE 的开发者,通常点击一个按钮就万事大吉了,这虽然极大简化了过程

2022-06-20 22:57:46 958

原创 计算机网路 -------- 数据链路层

链路:从一个节点到相邻节点的一段物理线路,中间没有其他交换节点

2022-06-08 21:01:02 104

原创 计算机网络设备原理

​ 要想访问互联网,必须通过路由器,因为互联网那么多 IP 地址,很多处在不同一网段。局域网通过交换机即可,比如电脑机房之间的电脑通信。

2022-06-03 21:58:02 192

原创 qemu 搭建 ARM Linux环境

qemu 搭建 ARM Linux环境1.背景​ 在某些情况下,如果我们没有板子,或者板子某些硬件坏掉了(大多数情况下是根本没板子,板子太贵),这时我们还想继续学习linux下驱动开发或者Linux内核的移植该怎么办?这时可以采用 qemu 模拟出来一个ARM开发板,同时启动Linux内核。2.基本条件​ Linux 内核要想启动,必须存在三件套,根文件系统、内核镜像、u-boot。由于 qemu 启动Linux内核不需要 u-boot 来引导,因此,u-boot可以不需要。存在 linux 环

2022-05-11 22:40:22 8987 10

原创 单片机开发之裸机也能 “多任务”?

单片机开发之裸机也能 “多任务”?1. 背景​ 对于一些简单的单片机项目,没必要非得跑RTOS,因此,多项目都是“裸奔”(指纯循环加上中断的机制)。所以,开发出一套好用的裸机框架是非常有必要的,本文章带你手把手实现裸机中的“多任务”调度。2. 基本知识​ 需要掌握的基本知识并不多,也都是最基本的知识,总结如下Systick 定时器函数指针结构体数组3. 代码实现​ 整个系统的代码由 Systick 中断发动,Systick 就像是一个发动机,每隔一定的周期发动一次中断,利用这一个中断的

2022-04-21 22:18:16 5337 6

原创 STM32 的图形加速器 DMA2D

STM32 的图形加速器 DMA2D1. 背景​ 在实际使用 LTDC 控制器控制液晶屏时,配置好的显存地址写入要显示的像素数据,LTDC 就会把这些数据从显存中搬运到液晶面板进行显示。实际上要显示的数据量非常的大,我们常常以纯软件的方式填充显存(指定那个位置要显示什么颜色),这样非常影响绘图速度,因此我们希望能用 DMA 来操作,针对这个需求,STM32 专门定制了 DMA2D 外设,它可以用于快速绘制矩形、执行、分层数据混合、数据复制以及进行图像数据格式转换,可以把它理解为图形专用的 DMA。2.

2022-04-01 18:24:14 2697 1

原创 LCD 液晶显示器 ---------- LTDC 控制器

LTDC 液晶控制器1. 简介​ LCD-TFT (液晶显示器----薄膜晶体管) 显示器控制器提供并行数字 RGB 以及水平同步、垂直同步、像素时钟和数据使能信号,这些信号直接输出到不同 LCD 和 TFT 面板的接口。本文以 stm32h750 介绍 LTDC。2. LTDC 主要特性24 位 RGB 并行像素输出2 个带有专用 FIFO 的显示层(前景背景层),利用这个特性可做出前景背景层的分离效果,比如背景播放视频,前景是弹幕可针对不同LCD屏编程时序可编程 HSYNC、VSYNC和

2022-04-01 14:41:45 4271

原创 LCD液晶显示器 ----------- 原理篇

LCD 液晶显示原理1. 背景​ 在做嵌入式开发时,经常用到 LCD 显示屏,因为用户只能看得懂显示屏中的画面。因此,熟练掌握显示屏原理是非常有必要的,所以让我们来揭开LCD 显示屏的神秘面纱,进而达到完全掌控的目的。本章之讲解 LCD 显示原理以及显示时序。2. 基本概念2.1 LCD 是什么​ LCD(Liquid crystal display),翻译过来就是液体晶体显示,也就是液晶显示器,LCD 显示器具有功耗低、体积小、承载的信息量大以及不伤眼的优点,因此他成为现在的主流电子显示设备尤

2022-04-01 12:06:00 24407

原创 RT-thread 自动初始化原理

废话不说直接看代码核心代码如下typedef int (*init_fn_t)(void);// 定义一个函数指针#define SECTION(x) __attribute__((section(x)))#define INIT_EXPORT(fn, level) RT_USED const init_fn_t __rt_init_##fn SECTION(".rti_fn." level) = fn本质:通过 __attribute__((section

2022-03-03 11:16:55 382

原创 Rt-thread 链表操作的的几个 API

rtthread 链表操作的的几个 API /* 将节点 n 插入到节点 l 的后面,如果 l 为头节点,则插入到链表头部 */rt_inline void rt_list_insert_after(rt_list_t *l, rt_list_t *n){ l->next->prev = n; n->next = l->next; l->next = n; n->prev = l;} /* 将节点 n 插入到节点 l 的前面,

2022-03-01 18:06:18 650 3

原创 linux 内核 container_of 原理

#include <stdio.h>#include <string.h>/* 返回 ptr 所在结构体的指针 */#define rt_container_of(ptr, type, member) \ ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))struct rt_list_node{ struct rt_list_node* next;

2022-02-25 11:47:53 409

原创 冒泡排序 (局部有序优化) 与 选择排序

#include <stdio.h>#include <stdlib.h>int a[7] = {4,2,3,1,6,7,8};int b[7] = {4,2,3,1,6,7,8};void Bubble_Sort(int *a,int len){ for(int end = len-1 ; end > 0 ; end--) { int sortIndex = 1; for(int begin = 1 ; begin <= end ; begin

2022-02-25 11:41:15 726

原创 python 语法练习二

from time import process_time_nsfrom unicodedata import nameimport logging面向对象 类class Student(object):def init(self,name,score,id): # c++ 中的构造函数self.name = nameself.score = scoreself.__id = iddef get_info(self): print('name :%s score :%d'%(tz

2022-02-19 21:06:31 161

原创 python 语法练习一

import timetime 模块相关函数print(‘tick = %d’%time.time())print(time.ctime())print(time.process_time())print(time.ctime())字符串拼接name = ‘tang’ + ‘zhen’ + ‘ye’print(‘name is %s’%name)字符串截取name = “my name is xxx”print(name[0:5])字符串 lenname = ‘hello pyth

2022-02-19 21:06:18 70

原创 python笔记

字符编码因为计算机只认识数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特作为一个字节ascii 码只有127个字符,即a~z A~Z 和一些符号要显示中文python 3 版本中,字符串是以Unicode编码的,也就是说,Python 的字符传支持多种语言。由于Python 的字符串类型是 str,在内存中以 Unicode 表示,一个字符对应若干字节。如果要在网络上传输,或者保存到自盘闪光,就需要把str 转换为以字节为单位的bytesprint('A

2022-02-19 21:05:54 92

原创 git 修改远端 commit 信息

git 修改远端 commit 信息git rebase HEAD~x( x 代表最近几条commit ),执行之后将出现以下界面上面的 pick 后面即远端的 commit 信息,最下面的是最后的 commit修改指定 commit 的 pick 为 edit ,然后 wq 保存退出根据提示信息执行 git commit --amend 命令,进入如下界面修改本次提交的 commit 信息,wq 保存退出然后执行 git rebase --continue,本地修改就完成了执行 git p

2022-02-01 22:57:08 2224

原创 C++ 与 C 的不同

为什么要重载函数?可以用相同的函数名来定义一组功能相同或类似的函数,程序的可读性增强。构成函数重载的条件:在同一个作用域中,可有一组具有相同函数名,不同参数列表的函数,这组函数被称为函数重载。 不同参数列表。函数参数个数不同函数参数类型不同函数参数类型顺序不同为什么能函数重载?c++的函数重载实现的本质是:c++编译器采用了叫做name mangling技术,编译器根据参数类型的不同将函数名改成不同的函数名,也就是底层函数名字不同,然后根据参数类型找到对应的函数进行调用extern c用法extern ”C

2022-01-08 13:57:14 200

原创 RT-thread 堆栈理解

1. 背景​ 相信不少的小伙伴一直有这个问题,堆栈堆栈,到底在哪里?本文以RT-thread 为例,讲解 RTT 中堆栈的位置。2. 栈在哪,堆在哪?​ 在回答堆栈在哪之前,首先要明白堆栈是内存,内存是什么?是实际的存储设备,比如 eeprom、flash、sram、sdram。我们的代码以及数据不可能没地方放,否则 cpu 怎么去执行指令。​ cpu 需要从内存中读取数据到 cpu内部(寄存器),他怎么知道把数据放入内部那个寄存器呢?汇编代码中说明了数据存入那些寄存器中。​ 栈不需要程序员手动去

2022-01-08 13:54:35 2790

原创 MDK 分散加载文件剖析(二)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2022-01-08 11:28:50 838

原创 RT-Thread 内核线程切换原理

1、背景本文章主要说明 rtthread 内核线程是如何切换的,初学者刚从裸机开发接触 RTOS 时难免会有些不适应,明白这部分原理之后就会对 RTOS 有更深的理解。在学习内核线程切换原理之前需要有以下基础知识铺垫。本文以 arm 公司的 Cortex-M3 内核为例。2、基础知识 CM3 拥有通用寄存器 R0-R15 以及一些特殊功能寄存器(中断屏蔽寄存器等等) R0-R12 都是通用寄存器,用来临时存储程序运行时产生的数据 R13 这个寄存器存储堆栈指针,在 CM3 内核

2022-01-02 21:54:52 2299 10

原创 MDK 分散加载文件剖析(一)

MDK 分散加载文件剖析与实战

2021-12-26 22:57:27 5848 3

空空如也

空空如也

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

TA关注的人

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