隋边边
码龄7年
  • 347,803
    被访问
  • 85
    原创
  • 36,129
    排名
  • 188
    粉丝
  • 10
    铁粉
关注
提问 私信
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:湖北省
  • 加入CSDN时间: 2016-01-31
博客简介:

Setul

博客描述:
New_Start
查看详细资料
  • 3
    领奖
    总分 467 当月 4
个人成就
  • 获得235次点赞
  • 内容获得40次评论
  • 获得1,226次收藏
创作历程
  • 6篇
    2022年
  • 16篇
    2021年
  • 13篇
    2020年
  • 10篇
    2019年
  • 22篇
    2018年
  • 1篇
    2017年
  • 24篇
    2016年
成就勋章
TA的专栏
  • 算法
    2篇
  • 嵌入式操作系统
    2篇
  • RISC-V
    4篇
  • 系统架构设计
    1篇
  • 图像处理
    4篇
  • 嵌入式开发案例总结
    1篇
  • ASPICE
    3篇
  • 功能安全
    1篇
  • 网络编程入门讲解
    3篇
  • python
    16篇
  • FPGA
    12篇
  • 杂谈
    5篇
  • Git
    2篇
  • C++
    7篇
  • linux
    4篇
  • ARM裸机
    13篇
  • uboot与内核移植
    2篇
  • Shell
    1篇
  • PHP
    1篇
  • VCS/Verdi
    1篇
  • Vivado
    2篇
  • FPGA与神经网络加速
    3篇
  • 卷积神经网络
    6篇
兴趣领域 设置
  • 数据结构与算法
    排序算法
  • 人工智能
    opencvtensorflow聚类分类回归
  • 最近
  • 文章
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

liteOS中双向循环链表的一些设计思想

1. 问题提出看liteOS的源码,发现这些伙计们的水平还是高的。对于一个双向链表,一般我们的写法都是:typedef struct Node { int data; struct Node *prev; struct Node *next;} NODE但是这就诞生了一个问题,节点Node中的数据类型是int时我们定义了一个链表类型NODE0,如果是float data又定义了一种链表类型NODE1,或者有多个业务变量时我们又定义了NODE2,这时候如果我们想写一个链表遍历函数,希望能够对所
原创
发布博客 2022.03.05 ·
254 阅读 ·
1 点赞 ·
0 评论

内存管理01——链接脚本

新年的第一篇博文,先祝我工作顺利,万事如意!祝福大家的话就不赘述了。在开始操作系统的内存管理相关内容前,首先来关注链接脚本,因为动态内存即堆区的地址是在链接脚本中分配的,知道了堆的起始地址和长度才能进行内存的分配和管理。1. 链接脚本的作用是什么?链接的作用就是把编译生成的多个目标文件(.o)合并起来,生成最后的可执行文件(.elf)。如上图中间的就是.o目标文件,最右的则是链接生成的.elf文件。除此之外,链接脚本还关注一个问题,就是生成的各个段被加载在内存的什么位置。举个例子很容易就明白,下面
原创
发布博客 2022.02.12 ·
686 阅读 ·
0 点赞 ·
0 评论

变量究竟是存在寄存器还是堆栈?

1. 变量是放在寄存器里还是堆栈里?堆栈对于处理器来说就是一块内存区域,而寄存器是处理器触手可及的存储,对于RISC 处理器而言,堆栈中的数据CPU并不能直接进行运算,还是要先加载到寄存器中才行。对于编译器而言,我猜测还是优先会选择将变量用寄存器保存。那什么时候需要用到堆栈呢?什么东西需要保存到堆栈呢?一种是需要切换上下文的地方,另一种是需要传参的地方。函数调用就是一种典型应用。2. 函数调用时的栈与寄存器一个典型的函数调用流程如上图所示,关键的涉及栈和寄存器的步骤如下:首先,在调用其他函数前,
原创
发布博客 2022.01.18 ·
671 阅读 ·
0 点赞 ·
0 评论

编程与人生

我们都知道,一个函数返回成功的时候,我们一般都是return 0;失败的时候则return 非零的值,究其原因呢,因为成功的时候只有一种情况,就是按照我们预定的功能运行了;而失败的情况则各不相同,可能是输入参数错误了,可能是执行失败了,可能是出异常了等等。于是零和非零很自然地,选择零作为执行成功的输出;非零作为失败的各种情况。这让我想起那句话怎么说来着,“幸福的家庭都是相似的,不幸的家庭各有各的不幸。”所以,运行成功的代码都是相似的,不成功的代码各有各有的BUG。哈哈哈,写这个小段子的时候突然又想起.
原创
发布博客 2022.01.15 ·
76 阅读 ·
0 点赞 ·
0 评论

RISC-V汇编学习中的一些思考

1. 立即数立即操作数,immediate operand,是我觉得在汇编中比较难理解的概念之一了。立即数简单理解就是被编译在指令中的,能被处理器立即使用的常数。在CPU的算数逻辑计算单元 (ALU) 中,能接触到的值只能是来自寄存器的值或者是立即数,他没法儿直接去内存中获取值,内存中的数值必须先被取到寄存器中,然后才能被运算。比如下面这几句C代码:int a , b;a = 5;b = b + a;ALU要处理a和b的值,就必须先把他们的值取到寄存器中,因为a和b都是变量,他们在内存中都有自己
原创
发布博客 2022.01.11 ·
363 阅读 ·
1 点赞 ·
0 评论

为什么CPU需要不同的特权等级?

如下图是一个经典的x86的特权等级示意图,x86有0~3共4级特权等级,但一般只有0级和3级常用。操作系统/内核工作于特权等级0,用户则工作于最低的特权等级3。1. 特权等级是谁实现的?当我们描述特权等级的时候,一定要区分的一个概念是:特权等级是CPU实现的,还是操作系统实现的?答案是CPU实现的。操作系统的不同模式是在CPU实现的基础上进行对应的。2. 特权等级怎么实现的?这里举一个RISC-V处理器的例子如下,RISC-V处理器定义了三种不同的特权等级,M,S,U三种,其中M是最高的等级,可以
原创
发布博客 2022.01.04 ·
320 阅读 ·
0 点赞 ·
0 评论

STM32的完整启动流程分析

关于STM32的启动流程,网上有的资料在讨论几种boot模式,有的在回答启动文件的内容,在查阅了很多资料后,本文给出一个比较全面的总结和回答。1. 根据boot引脚决定三种启动模式复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于其它用途。BOOT0与BOOT1引脚的不同值指向了三种启动方式:从主Flash启动。主Flash指的是STM32的内
原创
发布博客 2021.12.03 ·
3224 阅读 ·
11 点赞 ·
1 评论

STM32 HAL库IIC驱动

关于STM32的IIC驱动,网上有很多争论,究竟是使用STM32自带的硬件IIC还是用IO口和软件模拟IIC呢?下面这个图形象展示了这些争论。总结一些:ST为了规避IIC硬件的专利问题,将其设计地有点复杂,但是其提供的标准驱动库并没有很好地适配,导致出现一些BUG。但是下图中那位叫theuit的网友指出了:**“难道ST不知道吗?到底有没有改呢?”**目前,至少从我测试的结果来看,可以得到结论:用HAL库来驱动ST的IIC没问题!首先,我们给出两种IIC器件。第一种是带器件中带有寄存器的一类,对这
原创
发布博客 2021.12.02 ·
1462 阅读 ·
1 点赞 ·
0 评论

STM32F4定时器介绍

1. 定时器的种类从下面这个这个图看出,高级定时器相比于通用定时器,高级在其有“带可编程死区的互补输出”。这在H桥等电机控制场景中十分重要。如何理解死区?通常,大功率电机、变频器等,末端都是由大功率管、IGBT等元件组成的H桥或3相桥。每个桥的上半桥和下半桥是是绝对不能同时导通的,但高速的PWM驱动信号在达到功率元件的控制极时,往往会由于各种各样的原因产生延迟的效果,造成某个半桥元件在应该关断时没有关断,造成功率元件烧毁。死区就是在上半桥关断后,延迟一段时间再打开下半桥或在下半桥关断后,延迟一段时间再
原创
发布博客 2021.11.30 ·
926 阅读 ·
0 点赞 ·
0 评论

基于深度图像的多人姿态检测

本文主要是对"Efficient Convolutional Neural Networks for Depth-Based Multi-Person Pose Estimation"论文的一个介绍,2019年发表,作者是ANMG等,很优秀的一篇论文。链接:https://arxiv.org/pdf/1912.00711.pdf概述首先,本文的目标是在一副深度图像中获取出人体的关键点坐标,本文中认为有17个,结果实例如下图所示。本文采用的架构如下:包含两个大的阶段,前一阶段使用CNN进行特征提
原创
发布博客 2021.11.16 ·
3903 阅读 ·
2 点赞 ·
1 评论

YOLOv1——YOLOv3的一些理解和总结

每一代YOLO中最亮的亮点。1.1 YOLOv1YOLOv1最值得说的当然是YOLO网络提出本身,使用回归的方法端到端解决了目标检测问题。一个值得一提的细节就是,YOLOv1采用了将一副图片划分为多个grid cell的方法,每个grid cell仅预测出两个框,最终的输出张亮大小为:S x S x (B x 5 + C),其中S是grid cell在某一维的数目,B是每个grid cell预测出的框的数目,5代表了框的中心x,y坐标和框的宽w、高h,以及框的IOU值,C代表了每个物体类别的概率.
原创
发布博客 2021.11.11 ·
2368 阅读 ·
0 点赞 ·
0 评论

做好系统工程师(SE)一——如何进行方案分析

如何做好SE!
原创
发布博客 2021.08.18 ·
418 阅读 ·
0 点赞 ·
0 评论

Xilinx SDK如何将Console的内容复制出来?

整理自:https://www.amobbs.com/thread-5738341-1-1.html上图界面处,无法ctrl+C,也无法右键。有两种方法将内容复制出来:按住ctrl+shift+c就可以复制啦!debug configuration - common - standard input and output - output file第一种方法亲测可用,第二种没试过。...
原创
发布博客 2021.07.05 ·
201 阅读 ·
0 点赞 ·
0 评论

ZYNQ7020确定EMIO的引脚编号的方法

有一段时间没有使用ZYNQ7020了,突然捡起来用一下,发现我找不到EMIO的引脚号应该是多少了!在此简单记录下。从UG585中可以看到,7020的GPIO分为了4组,其中BANK0和BANK1是MIO,共有54个,编号为0 ~ 53;BANK2和BANK3是EMIO,共有64个,编号为54 ~ 117。当我们在vivado中配置EMIO的时候,也并没有指定其编号,只是指定了需要的EMIO的数目。当在SDK中编程使用时,EMIO的编号永远就是从54开始数。如果上面指定的位宽是2,则编号是54, 5
原创
发布博客 2021.06.01 ·
941 阅读 ·
2 点赞 ·
0 评论

使用JTAG是如何烧写SPI/BPI Flash的?

这天突然琢磨了下这个问题,就搜索了一下答案,转载如下:Xilinx的JTAG电缆可以通过FPGA“直接”烧写SPI/BPI。很多对xilinx开发环境不熟悉的用户,如果第一次接触这种烧写模式可能会有疑惑,FPGA是如何做到JTAG和Flash之间的桥接的,难道FPGA内部有专用的电路去实现这一功能吗?其实不是的。FPGA内部并没有设计(预留)专用的电路去实现JTAG到Flash的转换,在我们通过JTAG烧写Flash时,电脑其实是先要预下载一个bit文件到FPGA的,就是这个临时bit文件起到了一个桥接
转载
发布博客 2021.05.26 ·
1622 阅读 ·
3 点赞 ·
0 评论

opencv中Size与Rect的宽高顺序

opencv中关于Rect和Size的宽高顺序折磨了我很久,略作记录。Size_(_Tp _width, _Tp _height)Size是先宽后高,这一点如果不记得可以随时查看Size定义来确认;Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height)在opencv中x方向指的都是水平方向;y方向指的都是y方向,这一点在各处都是一样的。其实对于Size也是按照先x后y的顺序的。matrix.at<char>(row, col)数组的访问当然还是按照先
原创
发布博客 2021.05.18 ·
263 阅读 ·
0 点赞 ·
0 评论

numpy数组运算时的数据类型

今天在进行numpy运算的时候碰上了一个数据类型转换的坑,记录一下。问题:假设n1是uint8类型的,n2是float64类型的,请问n1 = n1 + n2得到的n1是什么类型呢?n1[1:5] = n1[1:5] + n2[1:5](数组的大小不止6个,取部分运算)得到的n1的数据类型呢?答:n1 = n1 + n2将会得到一个float64的数组;而n1[1:5] = n1[1:5] + n2[1:5]依旧是一个uint8的数组。如果n1[1:5]中有负数如-4,则会被转换为252,我就是在这翻车
原创
发布博客 2021.04.15 ·
93 阅读 ·
0 点赞 ·
0 评论

PyQt的代码之道

addwidget()方法用于向布局中添加控件;addLayout()方法用于向布局中添加子布局;QSplitter需要添加到QBoxLayout中进行配合使用,两者的布局方向要保持一致。hbox.addWidget(splitter1)QFrame, QSplitter与QBoxLayout之间的相互关系:来自https://www.cnblogs.com/lipx9527/p/14020423.html,总结得很好。可使用QSplitter进行动态布局,通过拉动网格线改变大小;QHBoxL.
原创
发布博客 2021.04.09 ·
107 阅读 ·
0 点赞 ·
0 评论

C++ Opencv中Mat的操作

Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。OpenCV使用引用计数机制。其思路是让每个 Mat 对象有自己的信息头,但共享同一个矩阵。这通过让矩阵指针指向同一地址而实现。而拷贝构造函数则 只拷贝信息头和矩阵指针 ,而不拷贝矩阵。初始化拷贝构造函数初始化:Mat A, C; // 只创建信息头部分A = im
原创
发布博客 2021.03.15 ·
1290 阅读 ·
1 点赞 ·
1 评论

给opencv函数写一个python装饰器

今天这个话题很有意思,能够帮助理解python装饰器的含义。使用过VS做图像处理的同学可能接触过Image Watch这个调试工具,其界面如下图所示。可参见如下链接:https://blog.csdn.net/iracer/article/details/83413877今天,在python下找到了一个类似的工具,叫pyimagewatch. 虽然没有完全理解其使用,但其思路可以参考一下:实现相关功能的方式就是给相应的opencv函数写一个装饰器。比如想查看一个opencv函数的执行结果(Watcher
原创
发布博客 2021.02.02 ·
88 阅读 ·
0 点赞 ·
0 评论
加载更多