
个人笔记
文章平均质量分 60
三境界
九层之台起于垒土
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LINUX中使用DT_MACHINE_START/MACHINE_START宏
DTS原创 2024-06-12 21:17:46 · 1497 阅读 · 0 评论 -
问题记录:交换两行printf -打印结果不同
windowsIAR工具链:todoSTM32。原创 2024-04-24 14:11:14 · 925 阅读 · 0 评论 -
armv8 - GIC-V2 中断控制器
GIC-V2原创 2024-01-25 17:00:03 · 1777 阅读 · 0 评论 -
C专家编程 --- 书中案例汇编与分析(持续更新中)
C原创 2022-09-28 15:16:39 · 517 阅读 · 0 评论 -
定义在头文件里的const 变量
C与C++的const全局变量原创 2022-09-27 17:05:12 · 1406 阅读 · 0 评论 -
计算机基础 --- 字节序与位操作
base knowledge原创 2022-08-28 19:38:00 · 343 阅读 · 0 评论 -
2022/8/23/21:15
个人记录原创 2022-08-24 10:12:38 · 1751 阅读 · 0 评论 -
计算机网络1---模型结构
OSI 七层模型 数据传输过程图参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系主机A发送数据过程中,从应用层到物理层,数据依次附加Head,其中数据链路层会加帧头帧尾。经过网络到达主机B前回一次去掉Head。为什么要加Head增加控制信息,构造协议数据单元(PDU)控制信息主要包括:地址(address):识别发送端/接收端差错检测编码(Error-detecting code):用于差错检测或纠正协议控制(Protocol control):实现协议功原创 2021-11-28 14:13:59 · 1689 阅读 · 0 评论 -
汇编语言14---call-ret实现函数调用
无返回值的函数使用call和ret配合可以调用和返回一段其它位置的指令,相当于面向对象语言的中的函数调用:call将下一条指令的偏移地址入栈执行函数ret将栈顶的值出栈,赋值给IP带返回值的函数数据段是公用的,可以实现返回值函数用寄存器也可以实现,一般用ax寄存器作为返回值的存储寄存器带参数-返回值的函数可以用数据段实现传参数,但是最好不要这么做,因为参数数据是临时的,应该用完就释放掉可以使用栈或者使用寄存器...原创 2021-11-03 21:19:13 · 530 阅读 · 0 评论 -
操作系统2---setup模块-->head.s-->main.c
上一节已经讲到把setup四个扇区读入到内存0x9000处偏移512字节的地方,并且完成了‘Loading system…’的显示,再调用read_it来读入了system模块(操作系统代码),调用返回后转入0x90200:0x0000执行setup.s,这一届就详细说明setup.s。setup.s详解,将完成OS启动前的设置start:mov ax,#INITSEG mov ds,ax...原创 2021-11-03 08:52:04 · 508 阅读 · 0 评论 -
汇编语言13---其他指令
16位模式下:源地址是DS:SI,目的地址是ES:DI32位模式下:源地址是DS:ESI,目的地址是ES:EDIMOVSB, MOVSW, MOVSD作用:移动字符串数据,复制由ESI寄存器寻址的内存地址处的数据到EDI寻址的内存处MOVSB:传送一个字节,之后SI和DI加/减1MOVSW:传送一个字,之后SI和DI加/减2MOVSD:传送一个双字,之后SI和DI加/减4具体是加还是减取决于DF标志位:DF=0,表示正向传送,SI/DI加DF=1,表示反向传送,SI/DI减单独的mo原创 2021-11-02 20:46:06 · 2301 阅读 · 0 评论 -
物联网知识1---RFID
RFID介绍:1.射频识别(Radio Frequency Identification),简称RFID,又称无线射频识别,属于物联网中的一种终端技术2.RFID是一种通信技术,可以通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间简历机械或光学接触3.RFID被广泛应用于采购分配,商业贸易,生产制造,防伪以及军事用途上。4.主要应用于典型物联网架构中的感知层,是整个物联网的最底层,是与“万物”链接的媒介之一。5.NFC是RFID的子集,有高度统一的标准,高度安全,低功耗,近距原创 2021-11-01 10:57:49 · 8486 阅读 · 0 评论 -
操作系统1---启动
一个计算机系统分为三层,最底层是硬件部分,中间是OS操作系统,最上层是APP。APP层要使用使用硬件资源,访问一些端口,必须经过操作系统,它为用户使用硬件资源提供了方便,比方说printf函数输出。大部分人都停留在立足于 操作系统去使用资源这一层境界,就像大部分人会弹钢琴,而不会揭开钢琴的盖子去搞清楚里面的构造和工作原理,自然就不会对钢琴有更深入,更接近本质的了解。上帝对CPU说,你只需要取值-执行,就够了。一开始,整个计算机的硬件大陆上还是一片死气沉沉,只隐约可见磁盘0磁道0扇区上闪烁着点点星光。刹那原创 2021-10-30 00:30:58 · 272 阅读 · 0 评论 -
汇编语言12---中断
中断机制; 将代码段寄存器和我们的代码段关联起来; 将数据段寄存器和我们的数据段关联起来; 注:这里的关联并没有任何实际操作,相当于给我们自己的注释而已; 相当于即使不写这一行也没有关系assume cs:code, ds:data ; 数据段开始data segment ; 创建字符串 ; 汇编打印字符串要在尾部用 $ 标记字符串的结束位置 ; 将字符串用hello做一个标记,方便后面使用它 hello db 'Hello World, Whip!$'原创 2021-10-31 16:06:55 · 1044 阅读 · 0 评论 -
汇编语言11---基本语法与分段
一段语法方面五脏俱全的代码assume cs:code, ds:data, ss:stackstack segment ; 自定义栈段容量 db 100 dup(0)stack endsdata segment db 100 dup(0)data endscode segmentstart: mov ax, stack mov ss, ax mov ax, data mov ds, ax mov ax, 1122h原创 2021-10-31 15:09:27 · 1135 阅读 · 0 评论 -
C语言---五大内存分区和可执行程序的三段
c语言五大内存分区1,stack(栈区):存放函数的局部变量和形参,由编译器自动分配和释放2,heap(堆区):该区由程序员申请后使用,需要手动释放否则会造成内存泄漏。如果程序员没有手动释放,那么程序结束时可能由OS回收。3,全局/静态存储区:存放全局变量和静态变量(包括静态全局与静态局部变量),初始化的全局变量和静态局部变量放在一起,未初始化的放在另一块4,文字常量区:常量统一在运行时被创建,常量区的内存是只读的,程序结束后由系统释放。5,程序代码区:存放二进制代码,内存由系统管理可执行程序程原创 2021-10-31 13:50:07 · 1293 阅读 · 0 评论 -
C语言杂谈---指针的简明表述
来自一位知乎评论区大佬“指针是对内存区域的抽象。指针变量中存放着目标对象的内存地址,而与指针相复合的类型,则说明了相应内存区域中的内容具有哪些属性,以及能做什么事情。也就是说,在内存空间某块区域中的内容,原本可以是不可解读的;但是,如果有一个描述这块内存区域的指针存在,我们就能找到它(地址的作用),并且合理地使用它(类型的作用)。void* 只有其中一半的作用。因为没有明确与指针相复合的类型,所以不能解引用,也不能使用基于类型之上(sizeof(T))的指针运算。”...原创 2021-10-31 09:32:47 · 309 阅读 · 0 评论 -
汇编语言10---寄存器总览
寄存器是CPU非常重要的部件,可以通过改变寄存器的值来实现对程序的控制。不同CPU的寄存器个数和结构一般都不相同,下面是8086CPU寄存器的结构,8086CPU有14个寄存器,所有寄存器都是16位的。CPU在对内存中的数据进行运算时,首先将内存中的数据存储到寄存器中,然后再对寄存器的数据进行运算。...原创 2021-10-31 00:05:57 · 217 阅读 · 0 评论 -
汇编语言9---编译链接以及可执行文件
为什么需要分两步走,编译再链接(masm.exe / link.exe)编译 masm asm --> obj链接 link obj --> exe假设有100w行代码,编译需要花费一段时间(比方说5min)。如果代码有错误,修改过后要重新进行这个5min的过程,如果错误不能一次性解决,就会花费很多个这样的5min。可行的方法是:把100w行代码拆分开来,再分别编译为.obj:t1.asm — t1.objt2.asm — t2.obj…t1000.asm —t原创 2021-10-29 22:24:42 · 559 阅读 · 0 评论 -
汇编语言8---栈
直观理解仓库,弹夹,书箱…等等,太多了。总之,FIFO从内存上理解入栈出栈操作操作栈最重要的就是操作栈顶的位置:入栈时把栈顶往上提,再把数据放到栈顶指向的位置上出站时把数据拿走,再把栈顶往下压一格8086中,用SS于SP所组成的栈顶内存地址作为栈顶指向,并且确定了出入栈的数据只能是16位数据Tips:生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,他的生长方向是向下的,是向着内存地址减小的方向增长。所以入栈时SP减小push ax ;修原创 2021-10-28 01:42:50 · 1510 阅读 · 0 评论 -
汇编语言7---字型数据与字节型数据
首先要明确的8086有16根数据线和20根 地址线 ,它既能处理16位数据,也能处理8位数据。 可寻址的内存空间为1MB。字型数据与字节型数据8086cpu的数据线是16根,所以可以处理两种尺寸的数据.1. 字节型数据,byte 8bit存放到8位寄存器中。2. 字型数据, 2bytes=16bit, 存放到16寄存器中。在使用mov指令,要保证数据和寄存器之间位数的一致性。数据存放规则一个字型数据(如 1234H)存放在内存中,由2个连续的地址的内存单元组成。高地址内存单元存放字型数原创 2021-10-28 01:10:14 · 4330 阅读 · 0 评论 -
面试题---C/C++与单片机
1,(正泰抵押研究院与翼辉信息):MCU上电后 到 用户main函数运行 之间的过程?MCU上电也就想到与重启复位,引起复位的原因有很多:1,上电复位2,外部产生的手动复位信号3,执行复位指令4,看门狗复位5,and so on复位原因不同,复位过程却是一样的。==============================================================首先了解中断服务子程序是如何被执行的:单片机内部存储着一张中断向量表,它的每一个表项都存储了一个对应的中断原创 2021-10-26 20:49:01 · 1103 阅读 · 0 评论 -
汇编语言5---数据寄存器与地址寄存器以及CPU取值执行过程
AX BX CX DXAX BX CX DX是CPU内部的四个16bit的通用寄存器,常用于存储数据,也叫数据寄存器,一般用于存放参与运算的数据或运算的结果。为了兼容更古老的CPU,他们的16bit可以分为高八位和第八位,如AH,AL。这种灵活的使用方法给编程带来极大的方便,既可以处理16位数据,也能处理8位数据。这四个数据寄存器除了作为通用寄存器使用外,还有各自的特殊功能:AX 寄存器称为累加器,常用于存放算术、逻辑运算中的操作数或结果。另外,所有的I/O指令都要使用累加器与外设接口传递数据。B原创 2021-10-26 08:48:01 · 3035 阅读 · 0 评论 -
汇编语言6---DOSBox的使用
常用命令-g 执行完exe运行结果显示-a 编写汇编命令-t 单步执行-p 直接执行完不是单步执行-u 反编译-r 查看修改寄存器的值-d 查看内存单元-e 修改内存单元-? 查看指令帮助原创 2021-10-25 22:45:29 · 685 阅读 · 0 评论 -
汇编语言3---存储与传输以及硬件上的思考
计算机需要指令去执行动作,也需要数据作为计算的材料。在DOSBox中debug模式下可以看到指令与数据的存储情况,可以发现指令与数据是存放在一起的,并没有去做具体的划分。CPU是如何去区分指令和数据的呢?(挖坑,后面解释)另外,指令和数据是存放在哪里呢?一部分是放在CPU中,另一部分放在内存中,内存的一个具体载体之一就是内存条。CPU要从内存条中存取命令和读写数据应该要怎么做?如果你拆开过计算机的机箱并仔细观察,你就会发现CPU和内存条是插在同一块电路板上的,他们之间由许多印刷在电路板上的线路联结,这些通路原创 2021-10-24 22:43:27 · 114 阅读 · 0 评论 -
汇编语言2---二进制和汇编语言的关系
一段简单的思考计算机大致是如何工作的?计算机由许多部件组成,他们需要组织在一起协作运行,就需要指令去告诉他们该怎么做。这些指令叫做机器指令(010010011101 B)。那么谁来执行这一串二进制数字呢?一个叫做CPU的部件,即中央处理器,他将一串二进制数字转化为高低电平,来驱动计算机运行。深入探讨其中的联系从DOSBox的debug功能中学习,观察debug模式下的输出信息输出信息基本的格式为:十六进制数字:某种编号 一段十六进制数 英语单词的简写 + 一些数字/标识其中:第三列十原创 2021-10-24 21:19:49 · 1615 阅读 · 0 评论 -
汇编编程1----环境搭建
一,准备工具DOSBox + 编译调试工具(debug + MASM + LINK)注意事项DOSBox和编译调试工具最好不要安装在C盘,安装的路径上最好不要有空格和中文将下载好的编译调试工具放在asm文件夹下,该文件夹就是工作目录,要包含编译调试工具以及源代码,output文件也会放在里面。我DOSBox的路径位D:\DOSBox,asm的路径为D:\asm二,挂载我们需要将工作目录asm所在路径当作c盘目录(虚拟)运行DOSBox目录下的DOSBox 0.74-3 Options会打开一个原创 2021-10-23 23:31:48 · 745 阅读 · 0 评论 -
C语言基础知识
编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。C使用这种分而治之的方法方便对程序进行模块化可以独立编译单独的模块,稍后再用链接器合并已经编译的模块。这样如果只更改了某个模块,不必因此重新编译其他模块。另外,链接器还将编写的程序和预编译的库代码合并中间代码的形式很多,一般是源代码会被转换为机器语言代码,并把结果放在目标文件里面。目标文件虽然包含机器语言代码但是不可以直接运行,因为他还缺少启动代码和库函数。启动代码充当着程序和操作系统之间的接口。windows和linux原创 2021-10-22 16:50:25 · 100 阅读 · 0 评论 -
RT-Thread的内存分布
RT-Thread的内存分布MCU个人电脑RAM内存Flash硬盘编译器会将程序分为好几类,分别存储在不同的存储区中linking...Program Size: Code=48008 RO-data=5660 RW-data=604 ZI-data=2124After Build - User command \#1: fromelf --bin.\\build\\rtthread-stm32.axf--output rtthread.bin".\\build原创 2021-10-17 22:54:47 · 912 阅读 · 0 评论 -
GCC编译器 and G++编译器
完整的GCC编译过程:预处理pre-processing: -E 例如:g++ -E test.cpp -o test.i 预处理后生成.i文件编译compling -S 例如:g++ -S test.i -o test.s 编译后生成.s汇编文件汇编assembling -c 例如:g++ -c test.s -o test.o 汇编源代码编译原创 2021-02-16 22:17:02 · 311 阅读 · 0 评论 -
Cpp内存管理
从基本的Cpp内存管理构件到高级内存管理器Doug Lea自1986年起就潜心研究malloc算法零 overview 内存分配的每一个层面一 从C++ primitives介绍起1 这几种基础原件的使用// malloc and freevoid *p1 = malloc(512);free(p1);// new and deletecomplex<int>* p2 = new complex<int>;delete p2;//::operator原创 2021-02-16 14:46:50 · 567 阅读 · 0 评论 -
侯捷C++Tips
Tip1 初始化列表 initialization list使用初始化列表的原因初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作。主要是性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表,为什么呢?使用初始化列表少了一次调用默认构造函数的过程,这对于数据密集型的类来说,是非常高效的。Tip2 操作符重载和临时对象...原创 2021-02-13 21:22:40 · 182 阅读 · 0 评论 -
VSCODE+CMAKE 搭建C++环境
前沿:初来Linux世界,相比以前生活在Windows的集成编译环境下的鼠标点点,这里的确更难存活下去。不过没关系,以后工作可必须要在Linux下自己写编译规则来调试运行了。一 >介绍今天的主角CMAKEcmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。二 >搭建步骤1 安装#1sudo apt-get install cmakesudo apt-get install gccsu原创 2021-02-07 18:44:07 · 429 阅读 · 0 评论 -
HAL库的DMA发送问题
MDA发送异常今天第一次使用HAL库的串口发送DMA配置为NORMAL模式,开启DMA发送和接收,开启串口中断,遇到的问题:如果我这么写 他会发一次 char * s="asdd\r\n"; HAL_UART_Transmit_DMA(&huart2,(uint8_t *)s,5);如果我这么写 他还是只发一次 char * s="asdd\r\n"; HAL_UART_Transmit_DMA(&huart2,(uint8_t *)s,5); HAL_UART原创 2020-10-19 11:27:56 · 3125 阅读 · 1 评论 -
HAL库下串口接收中断接收OPENMV发送的信息
最小系统:STM32F103RCT6开发环境:STM32CUBEIDE实现功能:OPENMV作为上位机发送识别物体后获取的坐标信息,加上帧头帧尾表示信息结构举个例子,如果你需要发送两个坐标(x,y),发送的坐标信息之间没有间隔。那数据流应该是这个样子:xyxyxyxyxyxy单片机在接受时很容易分不清本次接收的值是x坐标还是y坐标。所以直接发送直接接收是不可行的。我们可以定义自己的数据包,定义帧头帧尾 将自定义规则的数据放在中间(不追求严谨可不考虑校验位)。代码:/* * protol.h原创 2020-10-09 15:06:55 · 1185 阅读 · 0 评论 -
2020-09-24
先是接手一块焊反稳压的板子 上电烧了 再是电机驱动电路出问题了 同时烧了三个6612 再来换了个自己打的板子 电源接头封装打错了VCC和GND反接 好 终于所有事情处理完了 发现仅有的水深传感器被收东西的扔了 我踏马直接裂开以后不再直接做这类呛死人的项目了,只提供IDEA...原创 2020-09-24 11:27:01 · 135 阅读 · 0 评论 -
HAL_UART_Transmit和Printf
上位机接收到这俩函数发送的数据 (与数据的不同进制表达无关)都会将数据转换为对应的ascill码字符显示如果使用printf时格式化字符串的结尾带上\r\n则会按十进制显示原创 2020-08-31 16:47:20 · 3558 阅读 · 0 评论 -
STM32红外遥控(HAL库源码)
以 NEC协议为例,采用PWM脉冲宽度调制,利用脉冲宽度来表示 0 和 1 。协议数据包组成:同步码头、地址码、地址反码、控制码、控制反码同步码由一个 9ms 的低电平和一个 4.5ms 的高电平组成地址码、地址反码、控制码、控制反码均是 8 位数据格式(发送时低位在前 高位在后)用反码是为了增加传输的可靠性每一帧的数据为8*4=32位数据以利用脉冲宽度表达逻辑上的0与1一个脉冲对应 560us 的连续载波一个逻辑 1 传输需要 2.25ms(560us 脉冲+1680us 低电平)一原创 2020-08-28 10:39:12 · 5555 阅读 · 2 评论 -
stm32定时器配置——编码器与PWM产生
CUBEMX配置编码器模式选择的encoderMode是 TI1和TI2模式。这种模式下,AB两相的上升沿和下降沿都会计数,所以计数值是实际值的4倍,需要做分频。也就是第一个参数,分频值设为3,实际上是3+1=4分频。HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);//开启编码器模式enc1 = (uint32_t)(__HAL_TIM_GET_COUNTER(&htim2));//获取定时器的值PWM产生prescaler的目原创 2020-08-24 13:25:58 · 2729 阅读 · 6 评论 -
串级PID_平衡小车调节历程
一开始只用单环的时候,我发现结果总是与我事与愿违,因为我希望用小车车身角度(roll)作为反馈作用于PID算法,输出值经过处理映射到PWM值上来作为电机的驱动。这个环导致的结果是,角度到达期望值时角速度还是存在的,这时参数十分难调,小车会在期望位置上左右摇摆。在读完这篇文章后:飞控算法中双环串级PID如何理解? - zinghd的回答 - 知乎https://www.zhihu.com/question/293450508/answer/1173064155我才懂得:你的期望值是什么其实完全取决于你原创 2020-08-18 15:54:54 · 2577 阅读 · 1 评论