自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

CodingCos的博客

且将新火试新茶,诗酒趁年华

  • 博客(599)
  • 资源 (1)
  • 收藏
  • 关注

原创 【嵌入式开发学习必备专栏】

嵌入式学习必备专栏

2023-12-30 12:25:07 2158 1

原创 【ARM Coresight | AMBA BUS | Cache | CoreLink | GCC 专栏导读】

1. ARM Coresight(SoC-400/SoC-600) 专栏2. ARMv8/v9 CPU/Cache 专栏3. Linux ARM AMBA 总线 专栏4. Trace32/DS-5 专栏。。。

2023-10-17 10:26:34 3643

原创 【ARMv8/v9 异常模型入门及渐进 10 -- WFI 与 WFE 使用详细介绍 1】

ARMv8架构提供了几个与事件相关的指令,包括等待事件(WFE)、发送事件(SEV)和本地发送事件(SEVL),这些指令有助于减少因处理器元素(PE,Processor Element)反复尝试获取自旋锁(spin-lock)而导致的功耗和总线竞争。ARMv8架构中引入了全局监视器的概念,当处理器元素(PE)的全局监视器从独占访问状态变为开放访问状态时,会自动生成一个事件。因此,当一个PE释放自旋锁时,不再需要在代码中显式包含SEV指令来唤醒等待锁的其他PE,系统会自动生成相应的事件,,而不进入等待状态。

2024-05-20 21:57:38 279

原创 【Windows 常用工具系列16 -- windows bat 脚本文件拷贝详细介绍】

检查 D:\TMP目录下是否有文件a.bin 如果没有就从 Z:\TMP中考本过来。要在Windows批处理脚本中实现这个功能,你可以使用。文件,双击运行或在命令行中执行它。如果文件不存在,使用。文件,如果没有,就会从。目录中将其复制过来。

2024-05-17 23:05:50 205

原创 【ARM Trace32(劳特巴赫) 使用介绍 2.6 -- windows bat 脚本执行 trace32脚本】

在Windows环境下,可以通过批处理(.bat)脚本来启动Trace32软件并执行特定的脚本。假设你已经安装了Trace32软件,并且有一个Trace32的脚本(假设名为。是Trace32的ARM调试器,如果你是针对特定架构(例如Power Architecture或x86),你可能需要使用不同的执行文件,如。通过使用这样的批处理脚本,你可以自动化Trace32的启动和脚本执行过程,这对于自动化测试或者日常开发中重复执行特定配置或测试非常有用。分别替换成你的Trace32安装路径和脚本文件的实际路径。

2024-05-17 23:00:09 34

原创 【ARM Trace32(劳特巴赫) 使用介绍 17 -- trace32 SoC reset 命令详细介绍】

在使用Trace32软件进行嵌入式系统调试时,与JTAG接口相关的两个重要信号是。这两个信号在物理硬件调试和系统复位中起着关键作用。从上图可以看到,执行完上面两条命令后,系统重启了。

2024-05-17 22:48:19 16

原创 ARM64 常见汇编指令学习 11.2 -- ARM 汇编宏 .macro 的学习2】

首先,定义一个宏来接收参数。在汇编语言中,宏可以用来封装重复的代码片段。// 将参数加载到x0和x1寄存器.endm这个宏接收两个参数param1和param2,然后将这些参数移动到x0和x1寄存器,这两个寄存器通常用于在ARM64架构中传递函数的前两个参数。

2024-05-16 21:17:38 133

原创 【ARMv8/v9 系统寄存器 5 -- ARMv8 Cache 控制寄存器 SCTRL_EL1 使用详细介绍】

可以看到打开指令cache和关闭指令cache两者是有一定时间差的,随着测试量的加大这个时间差将会进一步加大,所以代码中一般都会将cache打开。,这篇文章主要是介绍如果通过控制这个寄存器来 enable cache 和 disable cache的。域来打开 指令cache和数据cache。接下来以使能指令cache为例进行简单介绍。如上图所示,可以通过。

2024-05-15 23:04:13 812

原创 【ARMv8/v9 系统寄存器 6 -- EL 异常等级判定寄存器 CurrentEL 使用详细将介绍】

下面这个宏定义是用于ARMv8/v9架构下,通过汇编语言检查当前执行在哪个异常级别(Exception Level,EL)并据此跳转到不同的标签。使用这个宏可以根据当前的异常级别执行不同的代码路径。例如,如果当前是EL1、EL2或EL3,它可以执行一些特定于这些级别的安全检查或配置。

2024-05-15 22:17:11 415

原创 【ARM Cortex-M 系列 2.3 -- Cortex-M7 Debug event 详细介绍】

当一个调试事件导致处理器停滞或生成异常时,这些位被设置为1,并且之后通过写1来清除(write-one-to-clear)。在ARM Cortex-M7架构中关于调试事件行为,特别是关于HardFault和锁定(Lockup)情况的触发机制,主要涉及当处理器在以下情况下执行。在ARM Cortex-M7架构中,调试事件(Debug Event)是由于调试原因而触发的事件。:如果启用了停滞调试(Halting Debug),一个调试事件会使处理器在调试状态下停滞。一个导致进入调试状态的调试事件会将。

2024-05-14 22:23:56 922

原创 【ARM 嵌入式 C 文件操作系列 20.4 -- 打印 uint64_t 类型的数值】

通过这种方式,你可以灵活选择以大写或小写形式打印64位无符号整数的16进制表示,从而满足不同的格式化需求。这些宏确保了无论在哪个平台上,都能以正确的格式打印64位无符号整数的16进制表示。以下是一个示例代码,演示如何以16进制格式打印。并为其赋了一个16进制的初始值。宏用于打印大写的16进制数字(比如。宏用于打印小写的16进制数字(比如。的小写16进制表示,以及使用。宏打印其大写16进制表示。为了以16进制方式打印。类型的数值,可以使用。

2024-05-14 21:31:11 238

原创 【ARM Trace32(劳特巴赫) 使用介绍 16 -- trace32 cache 常用命令介绍】

将 cache中的内容写入下一级cache或者memory中,只有被指的cache被影响,比如。这条命令会将Cahce中的 dirty 行给写入下一级cache中或者是memory中。这时只有 ICache 被影响,其它cache则不受影响。将 Cache 中的内容和 memory中的内容进行比较。如果当前CPU不支持cache,使用上面命令时会报出。这条命令将会 invalidate 整个 cache.将cache中的内容保存到指定文件中。,所有内容都会被dump出来。显示所以被缓存的变量。

2024-05-14 19:53:49 636 1

原创 【ARM 嵌入式 C 文件操作系列 20.3 -- 二进制文件转为16进制数组】

在嵌入式开发的过程中经常遇到需要将二进制文件转换为十六进制数组的需求,比如需要将某个镜像文件转换为数组,然后通过写memory的方式将镜像文件加载到内存中。下面代码给出了如何使用C 代码将一个二进制文件转为十六进制数据。函数以4字节为一个单位循环读取数据,每次读取成功后,将读取到的数据以指定格式写入到。这段代码首先尝试以二进制读取模式打开文件,然后以写模式打开。第一列为地址,第二例为数据。

2024-05-14 19:27:55 232

原创 【ARM Cortex-M 系列 2.2 -- Cortex-M7 单步调试原理及实现详细介绍】

在ARMv7-M架构中,通过使用单步调试(Halting Debug Stepping),调试器能够从调试状态退出,执行单条指令,然后重新进入调试状态。这是一种在精确调试软件时十分有用的功能,它允许开发者逐条检查指令的执行情况。

2024-05-13 22:50:40 1024

原创 【ARM Cortex-M 系列 2.1 -- Cortex-M7 Debug system registers】

当处理器执行加载(load)或存储(store)指令时,可能会遇到“阻塞”(stalled)的情况。在ARMv7架构中,调试功能通过一系列的系统控制块(System Control Block, SCB)寄存器来提供。提供了一种机制,通过它调试器可以请求处理器进入调试状态,而不需要等待具体的断点触发。它在软件进行写入时将被忽略,软件不能设置或清除它。配置为1后,外部 debugger 可以通过配置该bit来屏蔽ysTick 和 外部其它中断。调试内核寄存器选择器寄存器上的寄存器读/写可用。

2024-05-13 21:54:33 862

原创 【AMBA Bus ACE 总线11 -- ACE Transactions 详细介绍】

事务确保了被移除的缓存行的数据能够被写回到内存中,同时通知其他可能包含该缓存行副本的处理器,它们持有的副本现在是陈旧的,需要在下次访问时重新从内存中读取或是通过缓存一致性协议来更新它们的本地副本。master发起的读操作或者是写操作,它不需要去snoop其它master了, 只需要发出去就可以了,不需要从其他master cache中获取数据。对 cache 的操作,比如对ICache 的clean操作,或者是invalid操作,或者是clean&invalid操作。当系统中的一个组件发出。

2024-05-12 23:11:40 37

原创 【AMBA Bus ACE 总线10 -- ACE Barrier transaction 详细介绍】

用于表明是否是一个barrier 的transaction,对于它我们只需要有个简单的了解即可,现在已经不建议在transaction的层面上还把 barrier 的 transaction发出来,因为系统是个很大的系统,当把 barrier transaction发到系统上的时候会对系统的整体performance产生影响。基本含义就是 对memory访问的顺序要保证,其它的顺序可以不管,比如先发起一个写,再发起一个读,那么读写的顺序要得到保证。和 memory的理念是相同的,

2024-05-12 22:40:11 64

原创 【AMBA Bus ACE 总线 7.1 -- ACE Domains 介绍 2】

当使用 ARM 总线的时候,以CCI 为例,它不在区分inner-shareable 和outer-shareable 了。从简化设计的角度,对于输入的transaction 无论是inner-shareable 还是 outer-shareable 统一认为是具有相同的属性。Domain 这个概念,不仅要从总线角度来看,它是总线中的两根线,其次需要考虑到什么时候需要驱动这个domain,比如什么时候驱动。对于cpu来讲,它针对所有能访问的memory地址,都会设置他们的 domain 类型。

2024-05-12 22:28:42 66

原创 【AMBA Bus ACE 总线 9.1 -- Non-cache Master 写操作 详细介绍】

这个时候 Coherency 总线,在收到 AW channel 的请求之后,分别向 master1和 master2 AC channel发起请求,请求把 master1 和 master2 对应的 Cache行给 Invalid 掉,, 如下图1-3 所示。就需要通过coherency总线去把它相同的cache行进行invalid掉,对于non-cached 的master来讲,会有一个返回的data和希望写的data 进行一个merge,merge以后进行一个写的过程。channel发起命令和数据。

2024-05-12 22:18:00 73

原创 【ARMv8/v9 系统寄存器 5 -- CPU ID 判断寄存器 MPIDR_EL1 使用详细介绍】

ARM架构中的亲和级别提供了一种识别和区分PEs的方法。亲和级别分为多个级别,从最低的亲和级别0(Aff0),代表最接近实际硬件的级别,到可能有的更高级别,如Aff1、Aff2等。每一级别代表了PEs在系统中的不同逻辑分组。例如,亲和级别0可以用来区分一个物理处理器内的不同线程或核心,而更高的亲和级别可能代表处理器簇或整个处理器。

2024-05-12 15:15:07 1099 1

原创 【嵌入式开发 Linux 常用命令系列 7.6 -- sed 替换指定字符串】

找到当前目录下所有的.h 和 .c 文件 将他们中的字符 print_log替换为 demo_log。命令在Linux环境下完成这项任务。下面是一个命令行示例,它搜索当前目录及其子目录下所有的。这将输出所有的替换结果到标准输出,而不会修改原文件。确认替换操作是所期望的之后,再运行带有。选项,它会直接修改原始文件。建议在执行替换之前对重要文件进行备份,或者先运行命令而不带。选项来检查哪些更改将被应用,选项的命令进行实际的替换。请注意,这个命令使用了。替换文件中所有出现的。

2024-05-12 14:22:53 343

原创 【ARM 嵌入式 C 入门及渐进 16.1 -- C 代码实现CRC32校验函数】

在C语言中,实现CRC32计算的函数需要一个CRC算法的实现。以下是一个使用查表法实现CRC32的简单例子。这种方法通过预先计算好的CRC表来快速计算CRC值,适用于通用的CRC32算法。

2024-05-12 11:36:31 158

原创 【ARM64 常见汇编指令学习 20.1 -- ARM 伪指令 .include】

在UEFI(统一可扩展固件接口)开发中,通常会用到汇编语言文件(.s或.S文件)。如果你想在一个汇编语言文件中包含(或者说“include”)另一个汇编语言文件,你可以使用.include指令。这种方法允许你在一个主汇编文件中引用其他汇编文件中的代码或者数据定义,方便代码的复用和模块化管理。假设你有两个汇编文件a.s和b.s,并且你想在a.s中包含b.s,你可以在a.s中添加指令。

2024-05-12 00:01:05 320

原创 【Python 常用脚本及命令系列 1.3 -- 使用Python实现串口读写】

写入值val,比如devmem 0x80000000 0x5a5a5a, read 函数是通过在串口输入命令。这个脚本提供了一个基本框架,你可能需要根据实际需求和设备特性进行调整和完善。需要实现个Python脚本打开串口19并设置波特率为115200然后实现。函数,其中write函数是通过在串口输入命令。下面的Python代码示例展示了如何实现。函数,用于通过串口发送。

2024-05-11 23:27:50 338 1

原创 【ARM 嵌入式 C 入门及渐进 1.2 -- 是否为 n 字节对齐】

在C语言中,你可以定义一个宏来检查一个给定地址是否是n字节对齐的。这里的n应该是2的幂(例如,2、4、8、16等)。要做到这一点,可以利用位操作的特性。具体地,如果一个地址与n-1进行位与操作的结果为0,则该地址是n字节对齐的。这个宏非常通用,可以用于检查任何地址是否为2的幂字节对齐。

2024-05-11 23:22:28 378

原创 【ARM 嵌入式 C 入门及渐进 1.1 -- 是否为 8 字节对齐】

在C语言中,可以通过对地址进行位操作来判断它是否为8字节对齐。8字节对齐意味着地址是8的倍数。因为8是2的3次方,所以可以通过检查地址的最后三位是否为0来判断它是否为8的倍数,也就是说,如果地址与7进行位与操作的结果为0,则该地址为8的倍数,即8字节对齐。类型,然后与7进行位与操作。如果结果不为0,则打印错误提示。类型的指针,将其转换为。

2024-05-11 23:20:19 164

原创 【ARM 嵌入式 C 入门及渐进 12.3 -- 将数值的第 s 位到 e 位清零】

,其余位的值保持不变,我们可以使用位操作来实现这一目标。,即第4位到第7位被清零。

2024-05-11 23:16:21 242

原创 【ARM 嵌入式 C 入门及渐进 12.2 -- 将数值的第 0 位到 n 位清零】

位),其余位的值保持不变,我们可以使用位操作来实现这个功能。,即第0位到第3位被清零。

2024-05-11 23:14:26 246

原创 【Python 常用脚本及命令系列 3.3 -- Python 统计程序执行时间】

函数在函数执行前后分别调用,它返回的是自纪元以来的秒数(纪元指的是1970年1月1日)。计算这两个时间点之间的差值就得到了函数执行所需的时间。模块,它提供了一个简单的方式来测量小段代码的执行时间。这在进行性能分析和基准测试时非常有用。模块来测量执行一个函数所需的时间。对于需要更精确测量函数执行时间的情况,可以使用。在Python中,可以使用。

2024-05-11 23:10:04 312 1

原创 【Python 常用脚本及命令系列 1.2 -- python 判断串口是否已经打开】

要在Python中打印串口的波特率并检查特定的串口(例如COM19)是否已经打开,你可以使用。不存在或无法以默认波特率打开,这段代码可能需要根据你的具体情况做相应调整。这个库提供了跨平台的串口通信功能。注意:串口通信特别依赖于操作系统和硬件配置,所以如果。这段代码首先定义了两个函数。

2024-05-11 23:07:19 237 1

原创 【嵌入式开发 Linux 常用命令系列 7.5 -- awk 过滤指定列的字符串】

以逗号为分隔符从test_data.h的第27409行开始找出第2列不为0x00000000的行。提供了处理此类文本数据的强大功能,包括字段分隔符的设置、特定行范围的处理,以及模式匹配。在文件中是以这种确切格式出现的。如果有空格或大小写不匹配(例如,如果文件中使用了小写字母。此命令将直接在终端中输出所有从文件第27409行开始,第二列值不为。的行(假设字段是以逗号分隔的),我们可以使用。而不是大写),可能需要相应地调整匹配条件。文件的第27409行开始,第2列不为。脚本完成,无需预先使用。

2024-05-11 23:04:37 286

原创 【ARM 嵌入式 C 字符串系列 23.9 -- strcmp 与 strncmp 在使用上的区别以及注意事项】

strcmp和strncmp都是 C 语言标准库中用于比较两个字符串的函数,它们定义在头文件中。这两个函数在功能上相似,但在使用方式和应用场景上有一些区别。

2024-05-11 23:01:21 512

原创 【AMBA Bus ACE 总线 9 -- Non-cache IO device】

当我们谈论Non-Cache I/O(非缓存I/O)设备时,指的是那些访问时绕过CPU缓存系统直接与内存或设备进行数据交换的设备。这对于I/O设备尤其重要,因为I/O设备的状态可能独立于CPU操作而改变,如果使用缓存的话,可能会导致读取到过时或不正确的数据。如果I/O操作被缓存,写操作可能只修改缓存,直到缓存行被逐出之前,设备的实际状态不会改变。在ARM系统中,通过设置页面表中的属性,或者在更简单的系统中通过内存保护单元(MPU)来管理缓存与非缓存内存访问的配置,通常是由内存管理单元(MMU)完成的。

2024-05-10 22:57:06 713

原创 【ARMv8/v9 系统寄存器 4 -- ARMv8 通用寄存器详细介绍】

在ARMv9架构中(这也适用于ARMv8,因为ARMv9是其进化版本),有31个64位的通用目的寄存器(General Purpose Registers, GPRs),编号从x0到x30。这些寄存器用于日常的数据操作和函数参数传递。在ARMv9架构中,x30(链接寄存器)和PC(程序计数器)之间的关系是核心的,特别是在函数调用和返回、以及异常处理的上下文中。x30存储调用函数或异常处理程序后应该返回的地址,而PC则随着指令的执行而递增,指向当前或下一条要执行的指令。

2024-05-10 22:51:41 380

原创 【AMBA Bus ACE 总线 8 -- ICache maintenance】

当一个OS run 多个cpu的时候,根据调度算法的不同,OS 可以根据调度算法的不同分别 run 在某个具体的CPU上,因此,它们会有一个migrate的过程,既然是migrate,所以所有cpu 具有相同的instruction cacheline, 因为每个cpu 都有自己的 L1 ICache 和 DCache, 所以要求他们每个cpu的 instruction Cache都应该保持相同,比如至少要保证code 对这几个instruction Cache 是相同的。

2024-05-10 22:32:17 177

原创 【ARM64 常见汇编指令学习 14.1 -- ARM 汇编 .align 和 .section】

段是目标文件中的一部分,它们用于组织程序的不同部分,比如代码、数据等。在编写底层嵌入式或系统级别程序时非常重要,它们控制着程序如何被组织和加载到内存中,以及如何与硬件交互。是两个常用的指令,它们在代码中扮演着重要的角色,尤其是在控制内存对齐和段(section)定义时。确保了中断向量表在128字节对齐的地址上开始,这有助于满足硬件对中断向量表地址对齐的要求。指令用于确保接下来的数据或指令在内存中的地址满足特定的对齐要求。则定义了包含这些向量的段,并设置了适当的属性以确保它们被正确地处理。

2024-05-09 20:10:40 405

原创 【ARM 嵌入式 C 字符串系列 23.8 -- 判断一个字符串是否是数值字符串】

该函数通过检查字符串中的每个字符来确定它是否符合数值字符串的格式要求。如果字符串符合十进制或十六进制数值字符串的格式,函数返回。为了判断一个字符串是否是数值字符串,包括十进制和十六进制,可以实现一个函数。

2024-05-06 21:50:02 191

原创 【ARM 嵌入式 C 字符串系列 23.7 -- C 实现函数 isdigit 和 isxdigit】

函数用于检查一个字符是否分别为十进制数字或十六进制数字。以下是这两个函数的简单实现,它们依靠标准ASCII码值来判断字符。请注意,尽管我们在这里提供了简单的实现,标准C库中已经提供了这些函数的实现,通常在。在实际的应用程序中,建议直接使用标准库的函数,以保证最大的兼容性和性能。类型的参数,并检查这个字符是否为有效的十六进制数字。有效的十六进制数字包括。类型的参数(尽管它实际上应该是一个字符),并检查这个字符是否在。如果字符是其中之一,函数返回。这个示例程序展示了如何使用。

2024-05-06 21:43:38 433

原创 【vim 学习系列文章 5.1 -- vim ctags 使用】

在使用cscope生成文件cscope.files之后,如何将其当做ctags 命令的输入?)读取文件列表,然后为这些文件生成标签。这样,就不需要手动按行读取和传递文件路径了。可以使用一系列的Shell命令来完成这个任务。命令,你可能需要稍微调整命令,例如循环中直接调用。然而,上述方法存在一个潜在的问题:它实际上将。处理列表中的文件路径,那么你可以直接使用。命令的输入,而不是对每一行分别调用。文件多次,仅保留对最后一行内容执行。文件中的每一行内容分别执行。文件的内容,然后使用管道。从指定的文件(此处为。

2024-05-06 21:39:57 248

原创 【BASH 常用脚本系列3 -- shell实现查找目录并进入目录】

执行很多次,用起来很麻烦,有些人就建议使用autojump来实现,但是autojump 的一个缺点是:如果本地有多套代码,只是它们的版本不同而已,这个时候要是想快速进入一个目录,使用autojump 就很容易出错,所以为了解决这个问题,我自己实现了一个脚本用来快速进入自己想要进入的目录。的目录,并在找到后进入该目录,可以按照以下步骤进行。假设你正在使用bash作为你的shell环境。在linux中终端下工作,如果要进入一个深度很深的目录的话需要。首先,创建一个新的Shell脚本文件,命名为。

2024-05-01 15:27:03 433 1

寄存器 bits 查看小工具, 可以用于查看及修改 32bit,64bit, 128bit, 256bit

寄存器 bits 查看小工具, 可以用于查看及修改 32bit,64bit, 128bit, 256bit

2023-07-05

空空如也

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

TA关注的人

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