自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 汇编语言(1)——寄存器

右边将该段分为更小的两端,大小都为80。段地址一定是16的倍数,这是因为物理地址是由段地址*16+偏移地址得到的,而偏移地址是16位的,因此一个段的最大长度为16KB。在CPU中,程序员能够用指令读写的部件只有寄存器,通过改变寄存器中的内容来控制CPU,CPU执行的指令位置是由CS、IP寄存器中的内容决定的,通过改变这两个寄存器的内容就可以控制CPU执行目标指令。如下图所示,cpu将内存进行段的划分,即将若干地址连续的内存单元看作一个段,将段地址左移4位就是定位段的起始地址,用偏移地址确定具体的内存单元。

2023-03-25 10:54:31 1970 1

原创 23届非科班选手秋招转码指南

秋招是一个长期的过程,要保持心态,工作肯定是能找到的,毕竟年年说最难就业季,年年也都这么过来了,不要渲染焦虑的情绪,吓到的只有自己。最后留一个联系方式VX:yg1278471368。祝愿大家秋招顺利!

2023-03-10 16:01:11 998

原创 C语言指针及双重指针特例理解

接下来在栈中给变量分配空间,假设给指针a分配的空间为0x10,0x10中存放的数据为main函数中a的地址0x01,同理,指针b地址为0x11,存放的数据为main函数中b的地址0x02,而双重指针c的地址为0x12,其中存放的是指针p的地址0x04,这里用一个图来说明双重指针c的情况。main函数中有int型变量a、b、c以及指针p,这些是全局变量,是在静态存储区分配空间储存的,假设它们的地址空间为0x01,0x02,0x03,0x04。d = 101,即是让0x01中的内容变为101。...

2022-08-10 16:22:25 672

原创 操作系统全景视图

整个视图搭建是基于哈工大《操作系统原理与实践》,文件视图部分参考的《Linux内核源代码情景分析》。最近在回顾操作系统的知识,在脑海中搭建起来了操作系统的大概框架。

2022-07-27 14:56:06 416

原创 Linux下LCD驱动的编写

    LCD即液晶显示器,显示原理如下:    LCD显示器是由一个一个像素点组成的,像素点类似一个灯,就是RGB灯,由红色、绿色和蓝色三种颜色组成。1080P就是像素数量是1920*1080个。    如何控制RGB三种颜色的显示亮度?一般一个R、G、B这三部分分别使用8bit的数据,一个像素点就是24bit,一个像素点是3个字节,称为RGB888。,再加入8bit的Alpha通道的话一个像素就是4个字节,称为RGB8888。    可以把显示的过程想象成用一根笔在不同的像素点画上不同的颜色,按照从

2022-07-20 20:39:15 491

原创 Linux设备树

    设备树就是“设备”和“树”,描述设备树的文件叫做DTS,DTS文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU数量、内存基地址、IIC接口设备、SPI接口设备等等。    树的主干就是系统总线,IIC控制器、SPI控制器等等就是主线的分支,各种设备就是树上分支的节点。    在没有设备树的时候,Linux内核源码中有大量的arch/arm/mach-xxx和arch/arm/plat-xxx文件夹,这些文件夹里面的文件就是对应平台下的板级信息。为了防止Linux内核虚胖、于是引

2022-07-20 15:53:26 822

原创 进程同步问题总结

    进程之间往往需要相互配合才能完成工作,进程之间的同步就需要用信号来做标识,这里模拟一个生产者和消费者进程。    这里counter代表的是使用内存的数量,这里如果counter=BUFFER_SIZE,说明内存用完了,生产者进入阻塞;而如果counter=0,说明内存中没东西,消费者进程阻塞;生产者进程执行完后,会添加一块内容,如果此时counter=1,就会唤醒被阻塞的消费者进程,同理,消费者进程执行完成后如果counter = BUFFER_SIZE - 1,就会唤醒一个被阻塞的生产者进程

2022-07-12 16:33:16 484

原创 关于线程切换问题的一些思考总结

    最近被问到一个问题,线程是如何切换的?线程本身的切换过程是可以几句话说清的,但其后是关于操作系统最核心的进程和线程的问题,我有回顾了一下操作系统,做了一些总结。2. 内核级线程的切换    操作系统的故事都是围绕多进程视图展开的,理解了进程、线程,就理解了操作系统的核心,掌握操作系统最根本的视图,才能在脑海里构建庞大的操作系统的具体图像。...

2022-07-11 15:31:12 245

原创 stoi函数使用注意事项

    写题时出现了bug,经过好多次的调试,才发现是stoi函数使用时没有注意一些事项。    类似上面的代码,s是个空字符串,或者s中不全是数字字符,就会出现运行错误。    所以stoi使用时必须参数字符串都是数字字符。这里又写出以下代码。    按照之前的stoi的使用逻辑, while(getline(is, add, ‘.’)读到的第二个字符串应该是空字符串,应该不会调用stoi,为什么还会报错,这个问题是扎回事类。...

2022-07-09 22:39:16 1656

原创 二叉树的遍历及相关知识

二叉树的递归遍历、迭代遍历,以及二叉树的种类

2022-06-21 14:56:06 267

原创 Linux驱动——platform设备驱动实验

文章目录1. 驱动的分离和分层1.1 驱动的分离1.3 驱动的分层2. platform平台驱动模型1. 驱动的分离和分层1.1 驱动的分离    假设平台A、B、C都有MPU6050这个IIC接口的六轴传感器,那么驱动框架应该如上图所示。主机驱动是必须的,但设备驱动都是相同的,没必要每个平台都写一个驱动。    那么最好的做法就是每个平台的I2C控制器都提供一个统一的接口,每个设备也只提供一个驱动程序,每个设备通过统一的I2C接口驱动来访问,这样就大大方便了。    实际的I2C驱动设备

2022-05-25 10:02:34 700 2

原创 Linux驱动——LED驱动的编写与实验

文章目录1. LED驱动的原理分析1.1 地址映射1.1.1 ioremap函数1.1.2 iounmap函数1.2 I/O内存访问函数1.3 读操作函数1.4写操作函数2. 硬件原理图分析3. 驱动程序编写3.1 定义file_operations结构体3.2 编写init函数3.3 编写exit函数3.4 总结4.编写测试APP1. LED驱动的原理分析1.1 地址映射    裸机LED灯实验就是操作开发板的寄存器。Linux驱动开发也可以操作寄存器,但Linux不能直接对寄存器物理地址进行读写

2022-05-24 09:36:24 1302

原创 DSP以太网通信

文章目录1. 以太网模块初始化netinit1.1 SPI串口初始化1. 以太网模块初始化netinit1.1 SPI串口初始化    我们使用的以太网协议栈管理芯片是CH395L,芯片是通过SPI串口与DSP连接的。void CH395_PORT_INIT(void){ SpiaRegs.SPIBRR=0x0005; SpiaRegs.SPISTS.all=0x0000; // Baud rate 3.75M SpiaRegs.SPIP

2022-04-07 14:22:33 1904

原创 CAN通信程序代码阅读总结

文章目录1. eCAN模块GPIO初始化2. 初始化eCanb模块:InitEcanb1. eCAN模块GPIO初始化void InitECanbGpio(void){ EALLOW;//配置GPIO引脚工作在eCAN功能 GpioCtrlRegs.GPAPUD.bit.GPIO16 = 1; // Disable pull-up for GPIO16 (CANTXB) GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // Enable pull-up

2022-04-06 10:10:05 3867

原创 DSP的中断系统

文章目录1. 什么是中断1. 什么是中断    中断是硬件和软件驱动事件,它使得CPU暂停当前的主程序,转而去执行一个中断服务子程序。X281x的中断系统从上至下分成了三级,即CPU级中断、PIE级中断、外设中断。...

2022-04-05 15:24:47 8384

原创 增强型控制器局域网通信接口eCAN

文章目录1. CAN总线概述1.1 什么是CAN1.2 CAN的发展历史1.3 CAN的工作原理1.4 标准格式CAN和扩展格式CAN2. CAN2.0B协议2.1 CAN总线帧的格式和类型1. CAN总线概述1.1 什么是CAN    CAN是“Controller Area Network” 的缩写,意思是控制器局域网,是应用最广泛的现场总线之一。    如上图所示,SCI通信时是一对一的,SPI通信时可以组成一个网络,网络中的一个为主机,其他为从机。而CAN总线是一种多主的局域网,也就是通

2022-04-04 10:16:39 2981

原创 DSP的时钟和系统控制

1.1 振荡器OSC和锁相环PLL    为了能让DSP芯片工作起来,需要内部振荡器OSC和锁相环PLL等组成的时钟模块来提供规律的时钟脉冲。    锁相环是一种控制晶振使其相对于参考信号保持恒定的电路,主要作用是通过软件实时地配置片上外设时钟,提高系统的灵活性和可靠性。从上图可以看到,外部晶振通过了片内振荡器OSC和PLL模块,产生了时钟信号CLKIN,提供给CPU。外部晶振或外部时钟输入信号XCLKIN和送至CPU的信号CLKIN之间的关系如下:PLL模式说明SYSCLKOUT/CL

2022-03-31 15:45:01 3689 1

原创 串行外设接口SPI

文章目录1.SPI模块的通用知识2. X281x SPI模块的概述2.1 SPI模块的特点2.2 SPI的信号总结3. SPI模块工作原理1.SPI模块的通用知识    SPI是 Serial Peripheral Interface 的缩写,即串行外围设备接口,这是一种高速同步串行通信接口。SCI是一种低速异步串行通信接口,它与SPI不同,一个是同步通信,一个是异步通信。同步通信时,通信双方的设备必须拥有相同的时钟脉冲,以相同步调进行数据传输。异步通信时,通信双方的设备可以拥有各自独立的时钟脉冲,可

2022-03-30 16:18:31 3347

原创 DSP基础知识回顾

文章目录1. 什么是DSP2. DSP与其他主流芯片的区别2.1 DSP与MCU的区别2.2 DSP与ARM的区别2.3 DSP与FPGA的区别3. TI公司DSP具体型号的含义4. TMS320C28346的片内外设4.1 事件管理器4.2 模拟量转换为数字量的ADC采样模块4.3 串行通信接口SCI4.4 串行外围设备接口SPI4.5 局域网通信控制器CAN4.6 以太网通信1. 什么是DSP    DSP是Digital Signal Processing的缩写,同时也是Digital Sign

2022-03-29 15:37:54 9049

原创 uboot移植项目总结

2022-03-17 16:42:20 190

原创 uboot移植——思维导图总结

2022-03-16 10:57:34 644

原创 算法(二叉树)——路径总和

文章目录1.题目描述2.解题思路3.代码实现1.题目描述    给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。    叶子节点是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true

2022-03-16 09:53:29 586

原创 算法(二叉树)——找到树左下角的值

文章目录1.题目描述2.解题思路3.代码实现1.题目描述    给定一个二叉树的根节点 root,请找出该二叉树的最底层最左边节点的值。    假设二叉树中至少有一个节点。输入: root = [2,1,3]输出: 12.解题思路    这一题可以用层序遍历来解决。我们每次将一层结点放到队列中,然后遍历,将最左边的结点保存下来。需要注意的是结点入列的顺序应该是右结点先入列,此外循环到该层第size-1个结点时,就是最左边的节点了,注意保存数值。3.代码实现/** * Definit

2022-03-15 09:35:09 460

原创 算法(二叉树)——左叶子之和

文章目录1.题目描述2.解题思路3.代码实现1.题目描述给定二叉树的根节点 root ,返回所有左叶子之和。示例 1:输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24示例 2:输入: root = [1]输出: 0来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sum-of-left-leaves2.解题思路  

2022-03-14 10:27:09 2136

原创 算法(二叉树)——二叉树的所有路径

文章目录1.解题思路2.解题思路3.代码实现1.解题思路    给你一个二叉树的根节点 root ,按任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。示例 1:输入:root = [1,2,3,null,5]输出:["1->2->5","1->3"]示例 2:输入:root = [1]输出:["1"]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-paths

2022-03-11 10:16:10 1567

原创 算法(二叉树)——平衡二叉树

文章目录1.题目描述2.解题思路3.代码实现1.题目描述    给定一个二叉树,判断它是否是高度平衡的二叉树。    本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。输入:root = [3,9,20,null,null,15,7]输出:true2.解题思路    这一题用递归法解决比较简单,那么我们要明确递归的三个重要条件:递归函数的参数和返回值:参数即当前要传入的结点。返回值应当为以当前结点为根节点的树的高度。而如果当前传入结点为

2022-03-10 10:55:13 775

原创 算法(二叉树)——对称二叉树

文章目录1.题目描述2.解题思路3.代码实现1.题目描述    给你一个二叉树的根节点root,检查它是否轴对称。输入:root = [1,2,2,3,4,4,3]输出:true2.解题思路    如图所示,要看是不是对称二叉树,要沿中线对称的每一对结点是相同的,那么,我们可以建立一个队列,每次按顺序将一对需要比较的结点放进去,比较完之后再出列,再进行下一对的比较。3.代码实现/** * Definition for a binary tree node. * struct Tre

2022-03-10 09:45:08 896

原创 算法(二叉树)——翻转二叉树

文章目录1.题目描述2.解题思路3.代码实现1.题目描述    给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]2.解题思路    如上图所示,我们只需要将结点的左右字数对换以下就可以了,那么三种遍历顺序,选用前序和后序是比较方便的,我们可以用迭代法来完成前序遍历。3.代码实现/** * Definition for a binary tree node. * struct

2022-03-10 09:37:19 147

原创 uboot移植——uboot的硬件驱动部分

文章目录1. uboot与linux驱动1.1 uboot本身是裸机程序1.2 uboot的虚拟地址对硬件操作的影响1.3 uboot借用(移植)了linux驱动1. uboot与linux驱动1.1 uboot本身是裸机程序(1)裸机本来是没有驱动的概念的(狭义的驱动的概念就是操作系统中用来具体操控硬件的那部分代码叫驱动)(2)裸机程序中是直接操控硬件的,操作系统中必须通过驱动来操控硬件。这两个有什么区别?本质区别就是分层。1.2 uboot的虚拟地址对硬件操作的影响(1)操作系统(指的是l

2022-03-08 15:40:08 791

原创 算法(二叉树)——二叉树的层序遍历

文章目录1.题目描述2.解题思路3.代码实现1.题目描述    给你二叉树的根节点 root ,返回其节点值的层序遍历 。(即逐层地,从左到右访问所有节点)。示例 1:输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例 2:输入:root = [1]输出:[[1]]示例 3:输入:root = []输出:[]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/

2022-03-08 10:11:31 277

原创 算法(二叉树)——二叉树的迭代遍历

文章目录1.前序遍历2.中序遍历3.后序遍历1.前序遍历    之前我们在迭代法中已经介绍了,每一次调用函数就是将相关的参数、场景保存到栈中,返回时再重新调用。那么我们可以自己定义一个栈,将元素按一定的顺序入栈,让他们按规则出栈,以达到前序遍历的目的。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;

2022-03-07 10:53:03 157

原创 uboot移植——环境变量

文章目录1. uboot的环境变量基础1.1环境变量的作用1.2环境变量的优先级1.3环境变量在uboot中工作方式1. uboot的环境变量基础1.1环境变量的作用(1)让我们可以不用修改uboot的源代码,而是通过修改环境变量来影响uboot运行时的一些数据和特性。譬如说通过修改bootdelay环境变量就可以更改系统开机自动启动时倒数的秒数。1.2环境变量的优先级(1)uboot代码当中有一个值,环境变量中也有一个值。uboot程序实际运行时规则是:如果环境变量为空则使用代码中的值;如果环

2022-03-04 16:13:54 851

原创 算法(二叉树)——二叉树的递归遍历

文章目录1.题目描述2.解题思路3.代码实现1.题目描述    给你二叉树的根节点 root ,返回它节点值的前序遍历。示例 1:输入:root = [1,null,2,3]输出:[1,2,3]示例 2:输入:root = []输出:[]示例 3:输入:root = [1]输出:[1]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal2.解题思路    二叉

2022-03-04 15:09:00 107

原创 算法(栈与队列)——前K个高频元素

文章目录1.题目描述2.解题思路1.题目描述    给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/top-k-frequent-elements2.解题思路 

2022-03-04 09:34:53 621

原创 算法(栈与队列)——滑动窗口的最大值

文章目录1.题目描述2.解题思路3.代码实现1.题目描述    给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值 。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值--------------- -----[

2022-03-03 09:37:30 92

原创 算法(栈与队列)——逆波兰表达式求值

文章目录1.题目描述2. 解题思路3.代码实现1.题目描述    根据逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。注意两个整数之间的除法只保留整数部分。可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入:tokens = ["2","1","+","3","*"]输出:9解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9示例 2:输

2022-03-02 10:07:19 183

原创 算法(栈与队列)——删除字符串中的所有相邻重复项

文章目录1.题目描述2.解题思路3.代码实现1.题目描述    给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例:输入:"abbaca"输出:"ca"解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删

2022-03-01 10:28:29 382

原创 算法(栈与队列)——有效的括号

文章目录1.题目描述2.解题思路3.代码实现1.题目描述    给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = "()"输出:true示例 2:输入:s = "()[]{}"输出:true示例 3:输入:s = "(]"输出:false示例 4:输入:s = "([)]"输出:false示例 5:输入:s

2022-03-01 09:46:55 81

原创 uboot移植——命令体系

文章目录1. uboot命令体系基础1.1使用uboot命令1.2每个命令对应一个函数1.3命令参数以argc&argv传给函数2. uboot命令解析和执行过程分析2.1从main_loop说起3. run_command函数详解3.1关键点分析4. uboot如何处理命令集14.1可能的管理方式4.2命令结构体cmd_tbl_t4.3 uboot实现命令管理的思路5. uboot如何处理命令集25.1 uboot命令定义具体实现分析5.2 find_cmd函数详解5.4 U_BOOT_CMD宏详

2022-02-28 16:34:47 285

原创 算法(栈与队列)——用队列实现栈

文章目录1.题目描述2.解题思路3.代码实现1.题目描述    请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。注意:你只能使用队列的基本操作 —— 也就是 push t

2022-02-28 10:56:36 156

空空如也

空空如也

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

TA关注的人

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