- 博客(58)
- 资源 (2)
- 收藏
- 关注
原创 那些没用的计算机知识六(处理器乱序执行-为什么单处理器系统没有处理器执行乱序问题)
在单处理器系统下,,它的最终执行结果都是程序员想要的结果(即使是多任务条件下)。也就是说,单处理器系统下,无须考虑由于处理器乱序而需要处理器级别的内存屏障问题,只需要考虑编译器级别的乱序问题即可。
2025-01-08 16:44:05
47
原创 那些没用的计算机知识四(乱序执行-编译器乱序)
编译器指令乱序属于编译器优化的一种,如果允许在不进行编译优化的条件下运行,直接禁止编译器优化即可(包括编译器指令乱序、可见性的问题都可以解决);如果代码需要再优化的条件下运行,那么针对编译器乱序需要显式的使用编译器屏障解决。
2024-12-29 16:08:56
759
原创 那些没用的计算机知识五(流水线技术)
在ARM体系结构中,流水线(Pipeline)是提高处理器执行指令效率的关键技术(RISC指令集均会采用流水线技术),流水线技术通过将一条指令的执行过程分解为多个操作阶段,每个阶段可以在不同的硬件单元上执行(不同阶段依赖于不同的硬件单元为基础),使得多个指令可以同时并行处于执行的不同阶段,从而显著提高处理器的吞吐量。注意流水线是针对一条汇编指令在处理器内部进行的分段执行,不要与多条汇编指令执行执行混淆。
2024-12-24 14:57:54
1070
原创 那些没用的计算机知识三(_Atomic与原子操作)
上一节通过Volatile关键字解决了并发编程的可见性问题,本节介绍并发编程的另一个问题:原子性。原子操作是指整个操作过程不可被拆分或者不会被打断,因此不需要考虑并发竞争问题,c11中增加了_Atomic关键字,用来定义原子类型变量,支持并发访问 (头文件 )
2024-12-20 16:00:34
469
原创 那些没用的计算机知识一(赋值操作)
概述:写本专题系列内容是通过将高级语言代码与汇编代码进行对比,通过了解底层逻辑来减少编写程序过程中的一些陷阱。
2024-12-08 18:46:43
247
原创 惯性导航一(基础篇:科里奥利力和哥氏定理)
本节作为惯性导航基础篇,通过推导科里奥利力、哥/科氏加速度以及哥/科氏定理,加深理解,主要涉及了物理学相关知识。
2024-12-02 16:01:51
2069
1
原创 字符编码一(编码原理讲解)
实际上从GB系列编码(GB2312、GBK、GB18030)自身的设计,其设计了字符集,字符集有对应的编号,这个编号呢并不是像ASCII一样就是最终的编码,而是称它为区位码,区位码需要加一个固定值转换为机内码(或内码),这个机内码才是最终的编码(针对GBK而言他的编号并不是编码)。而在Unicode这样现代的、复杂的字符编码系统中,则必须区分字符编号与字符编码,字符编号不一定等于字符编码,字符编号与字符编码之间不一定是一个直接映射的关系,比如UTF-8、UTF-16为间接映射,而UTF-32则为直接映射。
2024-01-03 10:03:13
1340
1
原创 字符编码二(各类编码方式的发展、半角和全角)
包括GB2312、GBK、GB18030在内的GB系列编码方案(不包括GB13000,下同,不再赘述;GB13000编码方案下文有详解介绍),每扩展一次都完全保留之前版本的编码,所以每个新版本都向下兼容。
2024-01-03 09:58:27
1359
原创 关于W5500网卡使用过程的部分问题记录
某个项目中用到了W5500这种自带网络协议栈的网卡芯片,由于该项目开发时间很紧,就临时网上买了一些模块拼凑到了一套系统,经过验证果真这种拼积木的方法只能用在学生实验开发中,真不能拿来做工程应用,硬件太不稳定很容易掉坑。
2023-10-18 17:10:24
1377
原创 Xilinx ZYNQ 7000学习笔记五(Xilinx SDK 烧写镜像文件)
前面几篇讲了ZYNQ7000的启动过程,包括BootRom和FSBL的代码逻辑,其中关于FSBL代码对启动模式为JTAG被动启动没有进行分析,本篇将通过将JTAG的功能和通过Xilinx SDK烧写镜像文件到flash来顺道把FSBL中的JTAG代码部分给讲解下。
2023-09-13 22:12:49
1416
原创 Xilinx ZYNQ 7000学习笔记四(MultiBoot多重启动)
在前面《Xilinx ZYNQ 7000学习笔记一(复位和启动)》一节中,简单介绍了BootRom的运行流程和什么是persistent registers (持续寄存器),在本节将对ZYNQ7000 MultiBoot多重启动实现进行讲解。MultiBoot多重启动实现是基于ZYNQ的MULTIBOOT_ADDR寄存器,可用用来实现加载冗余的底层镜像文件。
2023-09-13 19:49:38
2422
原创 Xilinx ZYNQ 7000学习笔记三(小结)
而我们自己如果使用flash,由于使用的IO模式,实际的操作是由我们自己写的驱动管理的,和系统的内存映射没有什么关系,当然不受32M大小的限制。注意:只有在线性模式下才有最大32M地址空间的限制,也就是说zynq 7000最大加载的fabl+bit+应用得到的boot.bin最大不能超过32M,地址映射空间就是32M。负责对所有必要的读数据管理。换句个人理解,系统默认的是线性模式,但是我们作为flash使用者,如果要擦写flash必须配置为IO模式,由我们自己写的驱动操作实际的flash。
2023-09-06 18:28:08
818
原创 浅谈操作系统调度器在单核和多核下任务的运行状态区别
对于实时操作系统调度器(这里说的是全系统只有一个调度器),在单核CPU下,操作系统保证的是最高优先级的就绪任务处于运行态;而对于多核CPU呢,多核下存在很多任务,但是调度器是只有一个 ,对于调度器来说,保证的是最高优先级的就绪任务属于运行态,但是对于其他核的正在运行的任务(也可能是很低优先级),其并未打断其运行,即多核状态下保证的是:最高优先级的就绪任务在所在核处于运行态,其他核的任务仍正常运行,这样也保证的真正的并行,而不是因为一个调度器就导致假并行了。
2023-03-06 10:17:05
572
原创 @符号的用法
代码中@符号有时候会在有些代码中遇到,其具体有什么作用呢?主要用法:限定作用,用来限定字符串,具体而言实际上就是表示字符串中的’‘字符不再认为是转义标志,而就是’'符号本身。常见的用法是如果我们写一个文件所处的路径:比如"D:\文本文件"路径下的一个test.txt文件,如果不加@符号写法如下:string file_path = “D:\文本文件\test.txt”;使用\来进行转义表示一个\符号。而使用@时就不再认为\为转义标志,表示就会简单(@在字符串前面):string file_path
2022-03-25 15:45:44
7131
原创 1553B总线介绍
一、 1553B诞生背景:1553B总线是MIL-STD-1553总线的简称,MIL-STD-1553总线是时分制命令/响应式多路复用数据总线。主要应用在海陆空等军事装备和航天领域。美国SAE A2K委员会在军方和工业界的支持下于1968年决定开发标准的信号多路传输系统,并于1973年公布了MIL-STD-1553标准,此标准的修订本于1978年公布,即MIL-STD-1553标准,1980年美国空军又对该标准作了局部修改和补充。我国于1987年颁布了相应的军标GJB289-87<<数字式时
2022-03-14 09:54:41
9161
原创 crc原理及c代码实现
一、概述关于crc的原理网上由很多了,讲的都比较详细。具体crc原理可参见https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html。看来看去,关于代码实现部分网上都是互相拷贝,没有一个完整的crc实现,因此想着把所有crc8/16/32基于查表法的实现在该博客写下来,想着说一句crc你如果只是使用,只看我的代码就够了。万一发现有bug,上一句话当我没说…1.CRC与哪些配置有关关于crc,有5个配置项决定了crc的计算方式,他们分别是
2021-07-14 23:12:29
3206
转载 套接字中的select()函数接口介绍
此文为转发:https://www.cnblogs.com/xiehy/archive/2010/11/01/1866402.html套接字中的select()函数接口介绍 Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等 待某个事件的发生,如果事件没有发...
2021-01-06 20:24:38
1316
原创 Cache-应用(第二篇)
序:在调试某芯片内部flash时,发现当执行program或者erase后,发现程序实际正确得到了执行,但是读取时仍然获取到的是操作之前的数据。经调试发现是因为开启了cache的原因。下面就该问题进行分析。1.原因分析简单叙述该MCU内部与flash之间的内部框图如下:CPU对flash的读操作直接使用AHB总线通过flash controller实现对flash数据的读写,而cpu发送对flash的cmd指令比如program或者erase操作是借助APB总线实现,而cache是无法感知到对flas
2020-12-24 18:43:55
2831
1
原创 Cache-简介(第一篇)
概述一、Cache是什么1.1 时间局部性和空间局部性1.2 统一的I/Dcache和独立I/Dcache1.3 写通(write-through)cache 和写回(write-back)cache1.4 cache与内存的一致性问题CPU的运行速度是远远高于速度的,以当前嵌入式普遍使用的mcu来说,主频也普遍在几百Mhz,但是要知道使用的主存储器使用的动态存储器(DRAM)其速度在10Mhz左右。这样,如果指令和数据都存储在主存储器中,内存的速度会严重制约整个系统的性能。因此,为了解决内存速度低下,C
2020-12-24 18:43:16
3856
1
原创 详解USB控制传输
USB 控制传输一、USB控制传输1 传输过程1)建立过程2)数据过程3)状态过程二、示例1)建立过程2)数据过程3)状态过程usb的枚举过程是通过控制端点0使用控制传输方式来实现对usb 设备信息的获取和配置的,相对于其他传输方式,控制传输过程相对麻烦些,这里进行下说明。一、USB控制传输1 传输过程usb 控制传输分为三个过程,分别为建立过程、可选的数据过程、和状态过程。1)建立过程建立过程细分为3步,分别是 host 发送sendup token ,host发送8字节的控制指令的数据包,d
2020-12-08 17:30:21
1837
原创 USB host关于收到STALL处理
前言:stall 仅仅限于device 应答,而host端是不会发送stall握手包的。关于stall 包的场景,usb2.0 spec中有详细的说明。且收到stall后,软件必须做出相应的处理才能使通信恢复正常。一级标题一、STALL包分类:参看usb2.0 spec,STALL包分为两类,一类是protocol STALL,一类是functional STALL。用通俗的话来说就是,当使用控制端点0时,对应的是使用的protocol STALL(虽然控制端点也可以作为functional STAL
2020-11-27 21:22:32
4502
原创 USB开发-USB基础知识
1.一个usb 控制器下最多挂载多少usb 设备?答:127个,这是由usb数据协议中设备地址位数决定的,地址位总共7bit,其中0地址是用来给未初始化设备使用的。2.SE0状态是如何定义的?答:se0 就是D+和D-都处于低电平的状态。注意SE0并没有要求D+/D-维持多久,是要在一个数据宽度上D+和D-都处于低电平该阶段就是SE0状态。而USB很多信号是基于SE0来实现特殊信号,比如复位信号就是SE0维持10ms以上就认定为复位信号, 在FULL/LOW speed设备上,包结束符EOP是维持大
2020-11-27 16:57:01
930
原创 USB开发-USB从启动到运行
序:最近在调USB驱动,使用的控制器是Candence USB2.0 High speed Contrller,这是一个支持otg的控制器,有感于usb庞大的知识体系,给同样陷于usb泥潭中的同学一点启发,USB在处理细节上会由于硬件和操作系统的不同,但是其大体的流程是一致的。由于个人对usb的学习也就两周,知识水平有限,难免有错欢迎拍砖交流,内容随心情更新!时间有限,这里不会涉及到一些基础概念的讲解。知识点1:就是一个支持otg的usb控制器端做host还是device除了软件支持外,是由ID线决定的
2020-11-22 00:40:23
1471
1
原创 STM32 XIP启动过程-RW和ZI数据搬移讲解
最近在RISC-V架构下基于某芯片实现XIP方式的flash代码启动,至少这部分代码对于我是可见的,联想到之前一直很困惑STM32的引导程序在哪里实现得将RW复制到RAM中,并RAM中初始化ZI的,写下自己的分享。以下仅针对stm32XIP模式,也就是flash启动进行讲解引导程序嵌入式上电后需要对需要对系统硬件和软件运行环境进行初始化,这些工作往往是由汇编语音编写的引导程序完成。引导程序是嵌入式系统上电后运行的第一段软件代码,对于嵌入式系统来说,引导程序非常关键。引导程序执行的操作依赖于开发的嵌入式系
2020-09-24 20:17:23
5879
1
原创 C语言中函数指针的主要应用场景
一个人C语言功底强不强,不是看他写的代码注释够不够全,代码逻辑够不够清晰,看下他对函数指针的理解和使用就可以了。我曾经被一家公司面试两次,两次面试的内容都有对函数指针的使用理解。函数指针的概念上很简单,无非也就是指针,专门指向函数而已。但是什么时候能用到它,用它可以带来什么好处,这就是考察个人的能力了,涉及到多方面。在哪些应用场合可以用到函数指针呢第一,软件分层设计:如果个人代码没有软件分层设计,而是一味堆砌,那么代码的扩展性、可读性、通用性必然比较差。我们上下层讲究的是"纵向依赖、横向独立",上层
2020-08-19 17:51:47
2003
1
原创 Lora SX1268使用
Lora SX1268使用1.常用命令1.1 lora模式指令:Lora/FSKcmd:SetPacketType(); //配置lora模式GetPacketType(); //返回配置模式1.2 lora模式下的参数配置:当处于lora模式下时,有四个参数需要设置,用来实现对链路预算、抗干扰、编码占用率、和数据速度的配置。参数有带宽(BW_L)、扩频因子SF、编码率(CR)、低速率优化(LDRO)cmd:SetPacketType()2.LORa帧格式Lora 使用了两种包格式
2020-08-17 15:08:10
6113
原创 Lora数据格式及部分术语说明
1.LORa帧格式Lora 使用了两种包格式,显性和隐形显示。这显性包包含了包括编码率、crc在内的一个短的头部。1.1前导码前导码,用于同步接收端信号检测。接收端周期性的检查接收前导码,所以发送端的前导码应当配置成同一的长度。如果前导码长度不知道或者是变化的,那么这前导码的最大长度接收端应该配置。1.2显性模式显性下,前导码后是头部。包括a:Payload 的长度(Byte单位)b:编码率c:针对Payload域的可选的16-bit CRC1.3隐性模式没有头部字段。在这种模式下表,
2020-08-17 14:39:50
2123
原创 无线电极限传播距离计算
我们知道,地球是圆的,假设地球半径为R,发射端天线高度为Ht,接收端天线高度为Hr,那么如下图,在理想情况下直线传播可得到传播距离为d=3.57×(√Ht+√Hr) (Km)。但是在实际应用中,超过极限距离的地方也能收到较强信号,这种现象称为超视距传播,这样现象实际上只因为大气折射造成的,即实际的无线电传播也并非完全直线传播。超视距的传播距离为d=4.12×(√Ht+√Hr) (Km)。我们实际计算理论计算主要使用的是该公式获得极限传播距离。比如发射端天线的高度为2m,接收端天线高度为1m,那么
2020-08-14 10:50:52
11010
原创 射频基础知识和传输方程
一、射频基础1.波长和频率电磁波在空中的传输方程为 c = λf。 其中λ为电磁波波长,f为频率。也就是意味着,f越高,λ越小。f越小,波长越长,衍射能力越强,传输距离越远。2.电磁波频谱划分其中,射频频率范围从300kHz~300GHz之间。3.功率单位功率的一般定义是P=UI。单位为W、mW等。我们实际应用芯片电压供电单位为V,电流为mA级别,故实际上功率的话是mW单位用的比较多。由于射频频率下,功率值的范围比较宽泛,比如0.000001mW和1000mW,这种以W为单位的功率表示称为线
2020-08-12 18:17:09
14481
原创 民用计量仪表使用lora注意事项
按照工信部从2020年1月1号开始执行的民用计量仪表规范,如果我们使用lora技术做仪表类的项目,需要注意满足规范要求,其中最主要的一点其实是针对单次发射持续时间,也就是lora数据包的空中时间。规范要求空中传输时间不超过1s,我们使用loraCalculator,如果我们使用lorawan协议,其BW为125,我们会发现,我们数据域20个字节都会超标,所以如果使用loraWan协议,我们用的SF一般都要在5-10之间,否则传输时间会超标。当然我们如果使用非loraWan协议,我们的BW使用50...
2020-08-12 11:20:01
648
原创 lora calculator的使用
lora calculator可以用来估算lora数据包在空中的传输时间,而利用空中传输时间我们有可以计算出lora的传输距离等问题。首先,semtech针对不同的芯片分别作了不同的lora calculator,比如针对126x系列,是1261calculator;针对127x系列,使用的是其相应的计算器;针对128x系列也有相应的计算器。这里我们以126x系列为例说明:首先,下载lora calculator,进入semtech官网:https://www.semtech.com/ ,依次进入.
2020-08-12 10:46:36
2820
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人