- 博客(254)
- 资源 (15)
- 收藏
- 关注
原创 GNU Assembler
0、绪言虽然现在嵌入式开发99%内容都是由 C(C++) 代码构成,但是一旦是做嵌入式,那就避免不了接触汇编代码,和汇编相关的内容,主要由汇编器、CPU 体系架构指令集构成;使用不同汇编器的情况下,具体汇编实现的语法也会有部分出入,比如使用 MDK 那一套(ARM Assembler)和 GNU 那一套(GNU Assembler),汇编代码上,会有明显的不一样,这主要取决于汇编器;本文侧重于 ARM GNU 的汇编部分;可以参考的内容:1. 网页版的内容:Using as...
2022-01-25 00:28:24
2566
1
原创 极简之道 — RISC-V
写完并发布完自己的第一款 RTOS 后《自制 RTOS》,最近打算研究一下 RISC-V,一方面是,因为以前做过一颗 RISC-V 的芯片项目,有一定的基础,但那时候并没有深入到 CPU 最底层去了解很多非常细节的东西,另一方面,RISC-V 作为今后的发展趋势,还是需要抽点时间去好好的理解;RISC-V 是最新的一种精简指令集架构,现在 ARM 已经统治了嵌入式领域,X86 统治了 PC 和服务器领域,CPU(或者 MCU)的设计需要有兼容性,对于不断发展的技术来说,对芯片的设计要求也就越来越多,比如
2022-01-06 10:42:17
1851
3
原创 自制 RTOS
目录0. 配置1. 体系架构2. 内存管理3. 任务/调度器3. IPC3.1 信号量3.2 互斥锁3.3 消息队列4. 临界区保护4.1. 全局中断4.2. 挂起调度器4.3. 互斥锁5. 软件定时器6. 支持 Log 日志分级7. Trace8. Shell9. Demo都说,不会写 RTOS 的程序员不是好厨师,那么就写点东西吧;V1.0 版本大概的组织是这样的:这个 RTOS 命名为 MxOS;项目地址为:
2021-12-30 11:13:18
4078
9
原创 SDRAM 介绍
1、名词解释SDRAM :Synchronous Dynamic Random Access Memory,同步动态随机存储器。同步是指其时钟频率和CPU前端总线的系统时钟相同,也就是双方通信,有同步时钟;内部命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据的读写。NOTES:这里需要强调一下:为了保证数据一直都在,SDRAM 需要不停的去刷新,刷新,刷新;2、SDRAM 内部结构这里以...
2021-08-24 00:20:55
10166
1
原创 树莓派 4B 本地编译内核
目录1、下载内核源码1.1、配置 proxy1.2、安装依赖2、配置内核3、编译内核4、更新内核5、重启6、问题6.1、32bit/64bits6.2、覆盖到 SD card最近打算玩玩树莓派,遂之买了一块 Raspberry 4B 的板子。板子的资源就不在多说了 BCM2711的芯片,ARM Cortex-A72 @ Qual Core;拿到板子,SD 卡中已经带有系统,所以呢,我们可以直接在树莓派上面编译 Kernel,不用在 PC 上交叉编译,只不过
2021-08-05 15:08:35
4125
1
原创 ARM64+Linux5.0 自旋锁
目录1、资源竞争2、自旋锁之前 《转载Linux 内核同步(二):自旋锁(Spinlock)》文章是 ARMv7 架构以及 Linux 4.x 的自旋锁相关的原理和实现,最近在看 ARMv8 + Linux 5.x 相关的内容,所以稍微更新一点东西;他们之间的主要区别在于处理器架构的变化,之前的独占指令有些变化,导致最后和处理器相关的调用部分有些许更新,同时也在之前的基础之上新增了部分插图,来更加清晰的说明情况;1、资源竞争首先说明导致竞争的所有情况:1、单个 CPU 上多个任.
2021-06-16 21:12:11
2426
6
原创 Zynq-PS-SDK(15) 之 OV5640-HDMI 视频通路软件配置
《Zynq-PS-SDK(13) 之 VDMA+VTC+AXI4S-VideoOut 视频通路软件配置》将硬件做好后,导出到 SDK,我们进行代码的编写,代码主要分为两部分:1、SCCB 的 I2C 对 OV5640 进行配置;2、配置 VDMA + VTC + Dynamic Clock;先 reset,完成 SCCB 的配置,然后进行 IP 核的配置,main 函数如下所示:/*****************************************************
2021-05-24 15:18:43
1923
2
原创 Zynq-PS-SDK(14) 之 OV5640-HDMI 视频通路硬件搭建
目录1、OV56401.1、OV5640 Input Signals1.2、OV5640 Output Signals2、Video In to AXI4-Stream在前面介绍了使用 VDMA + VTC + Video Out 搭建的显示通路,后端接转码 TMDS 差分信号输出到 HDMI 上;这里不再使用静态图片,使用 OV5640 摄像头作为 Video 输入,最终将视频信息输出到 HDMI 屏上;数据的输出部分,我们沿用之前的 VDMA + VTC + Dynamic C.
2021-05-24 14:59:09
4429
2
原创 Zynq-PS-SDK(13) 之 VDMA+VTC+AXI4S-VideoOut 视频通路软件配置
在《Zynq-PS-SDK(12) 之 VDMA+VTC+AXI4S-VideoOut 视频通路硬件搭建》我们已经生成了 bitStream,硬件环境已经准备 OK,接下来进行软件的配置;软件的配置主要针对的对象是下面的黄色部分,也就是 AXI4-lite 总线接入的寄存器配置,涉及到如下:1、Dynamic Clock Generator;2、VTC;3、VDMA;这里新增一个函数,叫做Steph_VideoEngineInit,用于配置 video 相关的寄存器:/*.
2021-05-09 23:22:51
5838
原创 Zynq-PS-SDK(12) 之 VDMA+VTC+AXI4S-VideoOut 视频通路硬件搭建
前面分别叙述了《Zynq-PS-SDK(9) 之 VDMA》、《Zynq-PS-SDK(10) 之 VTC》以及《Zynq-PS-SDK(11) 之 AXI4-Stream To Video Out》;搭建一个简单的视频通路(Framebuffer -> HDMI)就要用到这些个模块,总体的设计框图如下所示:视频数据的 Framebuffer 在 DDR 中,通过 Processing System 写入进去;数据通过高带宽的 AXI4 接口(这里用到了 HP AXI,即 64bits 带
2021-04-27 00:30:29
5104
原创 Zynq-PS-SDK(11) 之 AXI4-Stream To Video Out
目录1、Architecture2、Signals3、Timings4、General Design Guidelines1、Architecture前面介绍了《Zynq-PS-SDK(9) 之 VDMA》和《Zynq-PS-SDK(10) 之 VTC》,数据流和时序流;从 VDMA 出来的是 AXI-Stream 流式数据,从 VTC 出来的是像素时钟得到的 Hsync,Vsync,Hbank,Vbank等时序信号,而我们最后对应到 HDMI 的是像素和时序一起的信号,所以这里需要
2021-04-25 20:43:04
5722
原创 Zynq-PS-SDK(10) 之 VTC
在《Zynq-PS-SDK(9) 之 VDMA 》中,描述了 VDMA 的作用和用法,VDMA 可以按照我们配置的数据量(图像的宽高),从固定 FrameBuffer 地址,将主存中的数据取出(或者写入);本质上是完成了主存的数据(具体的说,是图像数据)的高带宽搬移;为了实现 PS 通过帧存操作 PL 端的 HDMI 进行输出,光有 VDMA 不够,我们还需要时序生成器,具体可以参考《Zynq-PL之HDMI显示》,在《Zynq-PL之HDMI显示》中,我是自己写了一个叫做hdmi_timing_ge.
2021-04-21 21:10:25
2958
原创 Zynq-PS-SDK(9) 之 VDMA
目录0、Prepare1、Preview2、VDMA2.1、Features2.2、Channels defines2.2.1、Write Channel(S2MM)2.2.2、Read Channel(MM2S)2.3、Performance2.3.1、Frequency2.3.2、Latency2.3.3、Throughput2.3.4、Resource Utilization2.4、Signals2.5、Timings2.5.1、Read T
2021-04-21 01:12:44
7352
原创 Zynq-PS-SDK(8) 之双核通信 (AMP)
目录0、Hardware1、SDK Configurations2、Source Code2.1、CPU 02.2、CPU 1Zynq 的 PS 端是 ARM Cortex-A9 的双核,前面的工程都是只是用了单核来跑,现在来玩玩双核,并且使用双核进行通信;在 UG585 上有如下描述:默认情况下,CPU0 作为启动 CPU,而 CPU1 处于 WFE 的状态,唤醒 CPU1 的方式是往地址 0xFFFFFFF0 写入一个地址,然后使用 SEV 指令,去唤醒 CPU.
2021-04-15 15:14:10
2341
原创 Zynq-PS-SDK(7) 之自定义 AXI-Lite IP
目录1、New AXI-Lite IP1.1、Create AXI-Lite IP1.2、Edit AXI-Lite IP2、Block Design AXI-Lite IP3、Software design前面说了 PS-PL 之间的连接《Zynq-PS-SDK 之 PS-PL 连接》以及已经使用了 Vivado 自带的 AXI GPIO 的 IP,并且在 PS 端进行访问《Zynq-PS-SDK 之 AXI GPIO》,我们依然以下面这个图为目标,来进行覆盖设计:这.
2021-04-09 11:17:04
1744
原创 Zynq-PS-SDK(6) 之 AXI GPIO
目录1、Block Design2、Generate top level3、Add constraints & Bitstream4、Export Hardware5、Software driver5.1、Datasheet5.2、Code前面说过 PS 端可以使用 EMIO 来映射 IO,进而使用到 PL 端的 IO 口,另外一种办法就是使用 AXI 总线互联,在 PL 端实现一个逻辑,通过 AXI 总线进行配置和访问,这里先以一个最简单的 IO 控制为例;.
2021-04-07 17:09:45
2037
3
原创 Zynq-PS-SDK(5) 之 PS-PL 连接
目录0、Preview1、Clocks and Resets2、Interrupt Signals3、Event Signals4、AXI Interface前面单独针对 PL 和 PS 进行了一些开发,PL 可以当做纯 FPGA 开发,PS 可以认为是纯 ARM Cortex-A9 Dual Core +外设驱动的开发;Zynq 的魅力在于可以同时定制 FPGA + Software 的定制开发,想想都刺激,这也是我为何打算玩 Zynq 的初衷,能够在一颗芯片上,同时体验 F.
2021-03-30 23:06:33
2405
原创 Zynq-PS-SDK(4) 之 GIC 配置
目录1、Configuration2、GIC SDK Architecture2.1、Structures2.1.1、GIC interruptvectortable2.1.2、GIC info2.1.3、GIC2.2、Functions2.2.1、Basic2.2.2、APIs2.3、Configure flow2.3.1、XScuGic_LookupConfig2.3.2、XScuGic_CfgInitialize2.3.3、Xil_Excepti..
2021-03-23 16:22:54
6347
2
原创 Zynq-PS-SDK(3) 之 PLL 配置
1、InitializeZynq 带 PS 的裸机启动,可以选择 SD Card、QSPI、或者 JTAG;这里以 JTAG 为例;在 Launch SDK 的 Debug 的时候,sdk 目录下会生成 ps7_init.c 这个里面就是初始化的内容;从入口开始看:ps7_init;intps7_init() { // Get the PS_VERSION on run time unsigned long si_ver = ps7GetSiliconVersion (); ...
2021-03-16 17:30:11
4489
3
原创 Zynq-PS-SDK(2) 之 EMIO 使用
目录1、Descriptions1、Usage1.1、PL 配置1.2、PS 代码1、Descriptions在前面一篇里面写了《Zynq-PS-SDK 之 MIO 使用》,MIO 可以理解为 PS 端(ARM 端)的硬连线到外部,Zynq 也提供了一种方式,从 PS 端连到 PL 端的 IO,称之为 EMIO(External 的意思);GPIO Bank 和前面的一些概念这里不再重复,直接参考《Zynq-PS-SDK 之 MIO 使用》;这里看到 EMIO 有 32.
2021-03-11 00:23:00
4809
3
原创 Zynq-PS-SDK(1) 之 MIO 使用
1、MIO 配置以及寄存器Zynq 7020 的 PS 端(ARM 端)的外设 IO(也叫 IOP)分为 MIO 和 EMIO,他们有什么区别呢?首先他们都是 PS 端的 IO 资源,MIO 有 54 个 Pin 脚,分为两个 Bank(Bank0、Bank1)是 PS 直接的管脚连接,可以接诸如 UART、SPI、IIC、GPIO 等具体的外设引脚;EMIO 也是 PS 的资源,它接到了 PL 端,由 PL 端输出信号;这里,我们可以简单的理解为,MIO 是可以通过 Pin...
2021-03-09 15:03:53
10502
转载 AACPS 和 ATPCS
目录1. 基本概念2. 寄存器使用规则3. 堆栈使用规则4. 参数传递规则4.1 参数个数可变子程序参数传递规则4.2 参数个数固定子程序参数传递规则5. 子程序结果返回规则6. 延伸部分1. 基本概念AAPCS (ARM Archtecture Procedure Call Standard)规定了一些 ARM 处理器子程序间调用的基本规则,这些规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则。有了这些规则之后,单独编译的C语.
2021-03-04 00:51:12
955
1
原创 ARMv7-A 处理器窥探(5) —— MMU/TLB
之前写过 MMU 的一些入门和基础的分析《初探 MMU》和《ARMv7-A 的 MMU 浅析》,有基于概念掌握和基本入门的一些理解,这里打算在针对 ARMv7-A 的处理器再次稍微深入一点研究一下他的 MMU 和 TLB;这一版同样基于 ARM 官方文档:ARMv7-A_and_R_Architecture_Reference_ManualDEN0013D_cortex_a_series_PG的一个是完整版的 ARMv7-A 的处理器架构文档,第二个是 Cortex-A 系列的 Prog
2021-03-03 11:11:49
5983
11
原创 ARMv7-A 处理器窥探(4) —— Cache
0、Preview缓存这个词来源于法语动词 cacher,“隐藏”。 在许多情况下,可以说 Cache 对大家是透明的,或者对大家是不可见的。 但是,虽然是“透明”,但是并不代表它不存在,咱们还是需要去了解一下。第一版ARM架构诞生时,处理器的时钟速度和内存的访问速度大致相似。发展到今日, CPU 核心要复杂得多,速度远远超过以前。然而,外部总线和存储设备的频率没有达到同样的程度。 片上SRAM的小块,它可以以与核心相同的速度工作,但是这样的RAM与标准DRAM(主存)块相比非常昂贵。主存的...
2021-03-01 21:28:20
2903
原创 ARMv7-A 处理器窥探(3) —— Memory Model
Notes:The cacheability and cache allocation hint attributes apply only to Normal memory. Device and Strongly-ordered memory regions are Non-cacheable
2021-02-25 16:59:36
3347
2
原创 ARMv7-A 处理器窥探(2) —— CP15 协处理器
ARMv7-A 处理器除了标准的 R0~R15,CPSR,SPSR 以外,由于引入了 MMU、TLB、Cache 等内容,ARMv7-A 使用协处理器来对这些扩展来进行管理,ARMv7-A 支持 16 个协处理器,编号从 CP0~CP15,其中的 CP15 协处理器称之为系统控制协处理器,CP15 协处理器下的寄存器包含了 MMU、TLB、Cache等关键组件,其余的 CP0~CP14 有的控制Debug功能,有的控制SIMD,有的控制浮点,咱们暂时...
2021-02-22 17:13:26
3827
4
原创 ARMv7-A 处理器窥探(1) —— 处理器模式
ARM 官方针对 ARMv7-A 处理器的描述再:ARMv7-A_and_R_Architecture_Reference_Manual1、处理器模式1.1、特权等级ARMv7架构支持安全扩展,如果使能了安全扩展,ARMv7-A架构分为安全模式(Secure State)和非安全模式(Non-secure State)两个世界。在非安全模式下,存在三种运行特权 PL0,PL1和 PL2(Privilege level)。(这里仅仅讨论非安全 State)特权等级 描述
2021-02-08 00:20:49
3633
原创 Zynq-PL之HDMI显示
有了 《HDMI 1.4 协议浅析》的加持,那么使用 ZYNQ 搞一个 HDMI 输出来玩玩;1、硬件原理图首先,在硬件上,HDMI Connector 信号直接从 PL 端引出来,根据 HDMI 1.4 的协议呢,传输需要以 TMDS 差分信号进行传输所以呢,在物理上,我们需要关注的管脚有:HDMI DATA[2:0] 的 TMDS 差分信号对;HDMI CLK 的 TMDS 差分信号对;...
2021-02-01 21:22:10
9313
1
原创 Zynq-PL之PWM呼吸灯
目录1、硬件原理图1.1 LED2、全局时钟3、复位2、设计2.1、LED 闪烁控制2.2、LED 的 PWM 呼吸灯2.2.1、PWM 控制器2.2.2、PWM 占空比可变2.3、顶层设计2.4、约束玩 Zynq 呢,可以有几个方面,单玩 FPGA,单玩 ARM Cortex-A9 Dual Core,ARM+FPGA 带操作系统,FreeRTOS 或者 Linux;FPGA 侧叫 PL,先以一个简单的 PWN + LED 的工程来认识和配置 .
2021-01-31 21:27:05
1805
原创 HDMI 1.4 协议
手上的 Zynq 7020 单板带 HDMI 接口,Zynq 的 PS 并没有支持 HDMI IP 外设,所以再单板上的 HDMI 接口是直接接到了 PL 的引脚上,如果要用到 HDMI 来做为显示的话,那么就要在 PL 端去做一个 HDMI 协议层出来,既然要搞,那么需要先研究一下 HDMI 的协议;总所周知,HDMI 是用来传输音频和视频的,在他之前,还有 DVI 接口,VGA 接口;HDMI 协议现在最新的 Specification 版本是 2.1,可以支持 8K@60Hz 和 4K@120
2021-01-07 21:46:05
12960
5
原创 FreeRTOS --(17)任务通知浅析
之前聊到,FreeRTOS 可以通过信号量(二值信号量和计数信号量)、队列、事件组来同步任务与任务,任务与中断;在 FreeRTOS 中,还有一个东西也可以用作任务与任务,中断与任务的同步,它叫任务通知(Task Notifications);如果我们通过信号量、队列、事件组的形式来同步,在 FreeRTOS 中,叫通过了一个Communication Object;也就是说通过了一个用于连续接收方和发送方的中间模块;FreeRTOS 的任务通知(Task Notifications),..
2020-07-21 00:03:35
6904
2
原创 FreeRTOS --(16)资源管理之临界区
临界区的概念在任何的 SoC 都存在,比如,针对一个寄存器,基本操作为:读->改->写;在不带 OS 的系统下,普通代码希望对某个寄存器进行读->改->写,此刻,一个 IRQ 打断了这个操作,也同时对这个寄存器进行读->改->写,中断返回,后,普通代码又继续进行,这样就会导致逻辑错误;在带 OS 的情况下,不光是有 IRQ,而且存在任务切换,这样,同一个资源在 ISR 和不同任务之间修改,这造成了临界区;临界区的资源需要保护起来,临界区保护的不是代码,而是数据;.
2020-07-17 11:57:53
4204
2
原创 FreeRTOS --(15)信号量之概述
FreeRTOS 中使用信号量来做同步,信号量可以在任务中使用作为任务与任务间的同步,也可以在中断中使用(带 FromISR 的版本)中断与任务间的同步;针对不同的应用场景,信号量分为两种:1、二值信号量;2、计数信号量;1、二值信号量1.1、Usage顾名思义,二值信号量只有两个值:0 和 1;它用于简单场景下的任务与任务、中断与任务之间的同步,比如:一个任务,在等待某个资源到位后,才能够继续执行,在得到这个资源之前,它处于阻塞状态,假如一个中断来了,给出了这个资源,那么.
2020-07-16 00:20:17
5886
原创 FreeRTOS --(14)队列管理之概述
在任何的 OS 中,都需要支持任务与任务,中断与任务之间的数据传输机制,在 FreeRTOS 中,这种数据传输的方式被称之为队列(Queue);队列是一个 FIFO 模型,在创建一个队列用于数据传递的时候,需要指定队列的长度,创建完队列,便可以使用它进行数据传递;一个简单的例子:有两个任务 A 和 B,任务 A 将数据传递进队列,任务 B 作为接收端,从队列中获取数据:1、下面是创建了一个长度为 5 的队列:2、此刻任务 A 写一个数据 10 到 Queue:3、任务 A 在写一
2020-07-10 18:02:35
7370
原创 FreeRTOS --(13)任务管理之空闲任务
创建完毕任务,启动调度器,任务控制,系统 SysTick 来临后判断是否需上下文切换;如果没有其他任务执行的情况下,FreeRTOS 的 Idle 任务将被调度投入运行;在启动调度器的时候,Idle 任务就被创建了,优先级为最低 0;void vTaskStartScheduler( void ){.....................xReturn = xTaskCreate( prvIdleTask, configIDLE_TAS
2020-07-07 19:24:09
3568
原创 FreeRTOS --(12)任务管理之任务切换
现在创建任务(xTaskCreate)、启动调度器(vTaskStartScheduler),都分析完成了,SysTick,PendSV 中断已经使能,接下来第一个任务便可以自由的奔跑;等待下一次 SysTick 来临(1ms 后),调度器工作;1、xPortSysTickHandlerSysTick 触发后,会调用到它的 ISR 函数xPortSysTickHandler,这个函数的实现和处理器体系架构相关,定义在 port.c:void xPortSysTickHandler( v..
2020-07-07 00:57:07
2719
1
原创 FreeRTOS --(11)任务管理之系统节拍
前面有了创建任务、启动调度器、任务控制,接下来便开始分析一个 Tick 到来之后,FreeRTOS 即将有什么行为;在启动调度器的时候,就已经配置好了 SysTick,它作为 OS 的心跳,每隔一个固定周期来一次 SysTick 中断,来驱动 OS 做事(任务调度);以 STM32 为例,定义的configTICK_RATE_HZ 为 1000,由《FreeRTOS --(9)任务管理之启动调度器》得知,系统节拍时钟周期为1ms;不同的处理器结构可能有所区别,所以他是需要移植的部分,在 p.
2020-07-06 21:16:32
2275
6
原创 FreeRTOS --(10)任务管理之任务延时
在《FreeRTOS --(7)任务管理之入门篇》中讲过,如果有几个任务同时跑,但是又都不阻塞的话,那么最高优先级的任务将会占领整个 CPU,因为每次都会调度到它,一直处于 Ready 状态,所以呢,调度器每次都要选择优先级最高的任务来让它执行;所以,不管怎么样,任务做完自己该做的事情,就应该进入阻塞状态,等待下次该自己做任务的时候,在占领 CPU,这样既可以让 Idle 线程,在系统空闲的时候跑,也可以让让任务在合理的时间占领 CPU;之前也说过,让任务进入阻塞状态的方式有两种:1、让任务延时:
2020-07-05 20:22:19
3703
1
原创 FreeRTOS --(9)任务管理之启动调度器
目录1、vTaskStartScheduler2、xPortStartScheduler3、vPortSetupTimerInterrupt4、prvStartFirstTask5、vPortSVCHandler在使用 FreeRTOS 的时候,一般的,先创建若干任务,但此刻任务并没有被调度起来,仅仅是创建了,如果想要真正的跑起来,那么还需要调用让调度器跑起来的函数:vTaskStartScheduler典型的用法是:xTaskCreate(.."task_1.
2020-07-01 16:05:08
5017
4
QT 实现的64bit十六进制与十进制相互转换工具,带 bitmap 配置显示
2019-05-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅