
【嵌入式 C 常用算法专栏】
文章平均质量分 71
本专栏主要介绍嵌入式中常用到的算法及C函数
主公讲 ARM
竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【ARM 嵌入式 C 入门及渐进26 -- 内敛函数和宏定义的区别】
在 C 语言中,内联函数和宏定义都可以用来减少函数调用的开销和提高代码执行效率,但它们在许多方面存在显著区别。内联函数使用inline关键字定义。宏定义使用#define预处理指令。无类型检查:宏是文本替换,没有类型检查,可能导致类型错误。调试困难:宏替换在预处理阶段完成,难以在调试器中跟踪宏的行为。全局作用域:宏在定义后全局有效,可能引起命名冲突和作用域污染。维护复杂:宏替换简单但容易出错,逻辑复杂时难以维护。性能优化:宏是简单的文本替换,不涉及编译器优化。return 0;原创 2024-09-25 10:19:07 · 1111 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 6.3 -- C 函数嵌入多条汇编语句 】
此示例说明了如何在C函数中嵌入含有多条指令的ARMv8汇编代码,以及如何通过内嵌汇编与C变量进行交互。这些操作是顺序执行的,因此无需额外的逗号或特别的分隔符来隔开它们,只需确保指令字符串是正确格式化的即可。使用GCC的内嵌汇编语法,你可以顺序地编写多个指令,并根据需要指定输入、输出和被破坏(clobbered)的寄存器。块中嵌入多条汇编语句,并说明了如何通过注释标记来引用C变量,以及如何指定指令可能会影响的寄存器。在C代码中嵌入多条ARMv8汇编语句,可以通过将这些汇编指令放置在一个。原创 2024-05-23 22:15:13 · 624 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 6.2 -- ARMv8 C 内嵌汇编读系统寄存器的函数实现】
类型的变量中,并通过函数返回这个值。这种方法允许直接访问和操作ARM架构下特定的系统寄存器,但使用时需要确保有相应的权限,并且了解直接操作系统寄存器可能带来的风险。要在ARMv8架构中通过C代码和内嵌汇编来读取系统寄存器。的值,并将其返回,可以按照以下方式实现。通过上述方式,可以把系统寄存器。原创 2024-05-23 22:09:44 · 578 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 6.1 -- ARMv8 C 内嵌汇编写系统寄存器的函数实现】
请注意,在实际的系统编程或驱动开发中,直接操作系统寄存器通常需要具备相应权限和确保与操作系统的兼容性,特别是在嵌入式系统或特定硬件平台上。确保你了解这些操作的后果,并在需要时获取相应的权限。首先,要让C代码能够直接与寄存器交互,我们需要使用内嵌汇编(inline assembly)。ARM的内嵌汇编语法可以在GCC编译器中使用,它允许直接从C代码中执行汇编指令。在ARMv8架构下,使用C语言结合内嵌汇编实现将一个值写入特定系统寄存器的函数可以按照下面的方法进行。类型的值写入到系统寄存器。原创 2024-05-23 22:06:34 · 728 阅读 · 0 评论 -
【ARM 嵌入式 C 文件操作系列 20.4 -- 打印 uint64_t 类型的数值】
通过这种方式,你可以灵活选择以大写或小写形式打印64位无符号整数的16进制表示,从而满足不同的格式化需求。这些宏确保了无论在哪个平台上,都能以正确的格式打印64位无符号整数的16进制表示。以下是一个示例代码,演示如何以16进制格式打印。并为其赋了一个16进制的初始值。宏用于打印大写的16进制数字(比如。宏用于打印小写的16进制数字(比如。的小写16进制表示,以及使用。宏打印其大写16进制表示。为了以16进制方式打印。类型的数值,可以使用。原创 2024-05-14 21:31:11 · 1125 阅读 · 0 评论 -
【ARM 嵌入式 C 文件操作系列 20.3 -- 二进制文件转为16进制数组】
在嵌入式开发的过程中经常遇到需要将二进制文件转换为十六进制数组的需求,比如需要将某个镜像文件转换为数组,然后通过写memory的方式将镜像文件加载到内存中。下面代码给出了如何使用C 代码将一个二进制文件转为十六进制数据。函数以4字节为一个单位循环读取数据,每次读取成功后,将读取到的数据以指定格式写入到。这段代码首先尝试以二进制读取模式打开文件,然后以写模式打开。第一列为地址,第二例为数据。原创 2024-05-14 19:27:55 · 345 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 16.1 -- C 代码实现CRC32校验函数】
在C语言中,实现CRC32计算的函数需要一个CRC算法的实现。以下是一个使用查表法实现CRC32的简单例子。这种方法通过预先计算好的CRC表来快速计算CRC值,适用于通用的CRC32算法。原创 2024-05-12 11:36:31 · 328 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 1.2 -- 是否为 n 字节对齐】
在C语言中,你可以定义一个宏来检查一个给定地址是否是n字节对齐的。这里的n应该是2的幂(例如,2、4、8、16等)。要做到这一点,可以利用位操作的特性。具体地,如果一个地址与n-1进行位与操作的结果为0,则该地址是n字节对齐的。这个宏非常通用,可以用于检查任何地址是否为2的幂字节对齐。原创 2024-05-11 23:22:28 · 459 阅读 · 0 评论 -
【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 · 315 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 12.3 -- 将数值的第 s 位到 e 位清零】
,其余位的值保持不变,我们可以使用位操作来实现这一目标。,即第4位到第7位被清零。原创 2024-05-11 23:16:21 · 312 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 12.2 -- 将数值的第 0 位到 n 位清零】
位),其余位的值保持不变,我们可以使用位操作来实现这个功能。,即第0位到第3位被清零。原创 2024-05-11 23:14:26 · 408 阅读 · 0 评论 -
【ARM 嵌入式 C 字符串系列 23.9 -- strcmp 与 strncmp 在使用上的区别以及注意事项】
strcmp和strncmp都是 C 语言标准库中用于比较两个字符串的函数,它们定义在头文件中。这两个函数在功能上相似,但在使用方式和应用场景上有一些区别。原创 2024-05-11 23:01:21 · 631 阅读 · 0 评论 -
【ARM 嵌入式 C 字符串系列 23.8 -- 判断一个字符串是否是数值字符串】
该函数通过检查字符串中的每个字符来确定它是否符合数值字符串的格式要求。如果字符串符合十进制或十六进制数值字符串的格式,函数返回。为了判断一个字符串是否是数值字符串,包括十进制和十六进制,可以实现一个函数。原创 2024-05-06 21:50:02 · 253 阅读 · 0 评论 -
【ARM 嵌入式 C 字符串系列 23.7 -- C 实现函数 isdigit 和 isxdigit】
函数用于检查一个字符是否分别为十进制数字或十六进制数字。以下是这两个函数的简单实现,它们依靠标准ASCII码值来判断字符。请注意,尽管我们在这里提供了简单的实现,标准C库中已经提供了这些函数的实现,通常在。在实际的应用程序中,建议直接使用标准库的函数,以保证最大的兼容性和性能。类型的参数,并检查这个字符是否为有效的十六进制数字。有效的十六进制数字包括。类型的参数(尽管它实际上应该是一个字符),并检查这个字符是否在。如果字符是其中之一,函数返回。这个示例程序展示了如何使用。原创 2024-05-06 21:43:38 · 563 阅读 · 0 评论 -
【ARM 嵌入式 C 字符串系列 23.6 -- 字符串转数值的函数实现】
实现个函数首先判断是16进制数值字符串还是10进制数值字符串,如果是16进制数值字符串就将十六进制字符串转换为数值,例如将字符串"0x12345678" 转换为数值0x12345678, 这里不使用libc中的函数。函数,它首先判断输入字符串是否为十六进制形式(检查前缀 “0x” 或 “0X”),然后根据判断结果,使用不同的基数(10或16)和字符转换逻辑(在实际应用中,可能需要增加相应的错误检查逻辑,以确保函数的健壮性。如果不是,假设它是一个十进制字符串,并以相似的方式进行转换,但这里的基数是10。原创 2024-05-01 10:54:39 · 457 阅读 · 0 评论 -
【ARM 嵌入式 C 字符串系列 23.5 -- 字符串复制函数 strdup 函数介绍】
strdup()函数提供了一种便捷的方式来复制字符串,特别是当你需要对字符串进行修改而又不想更改原始字符串时。记住在使用完复制的字符串后,要释放相应的内存,以避免内存泄漏。尽管strdup()在某些环境中可能不可用,但它在许多平台上是支持的,是处理字符串时非常有用的工具。原创 2024-04-28 20:21:14 · 511 阅读 · 0 评论 -
【ARM 嵌入式 C 字符串系列 23.4 -- 字符串分割函数 strtok 介绍 】
这个程序将会按照空格分割字符串,最多分割成3个子字符串,并将它们打印到控制台。由于我们的示例字符串中有3个空格,按照这个逻辑,它会被完全分割成4个子字符串,但由于我们的循环限制了最多处理3次,所以只会处理前3个空格分割出的子字符串。函数来按照空格将接收到的字符串分割成子字符串。下面是一个简单的示例,展示了如何将一个字符串按空格分割成3个子字符串。,以指示继续从上次停下的地方开始分割。第二个参数是一个包含分隔符的字符串,在这个例子中是一个空格字符。函数的第一个参数在首次调用时是原始字符串,之后的调用应传入。原创 2024-04-28 20:18:46 · 329 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 12.1 -- 寄存器多bit值返回宏实现】
比如,在我们想判断 MEMWIDTH 的值是多少的时候,我们需要返回 bit[10:8] 的值,如果一个一个bit去判断那就太麻烦了,那么我们如何使用宏来实现这个功能?位,这样就在对应的位置创建了一个单个的1,其余位为0。然后从这个数值中减去1,将那个单一的位以下的所有位都变为1,达到了我们想要的掩码效果。位全为1的掩码,并与移位后的寄存器进行与操作(位的值,可以使用位操作。要实现一个宏,用于返回一个32位寄存器从第。这个方法的关键在于构造掩码。从第5位开始的3位的值。),从而只保留最低的。原创 2024-04-14 11:01:19 · 643 阅读 · 0 评论 -
【ARM 嵌入式 C 常用数据结构系列 25.1 -- linux 双向链表 list_head 使用详细介绍】
在Linux内核中,双向链表是一种广泛使用的数据结构,允许从任意节点高效地进行前向或后向遍历。Linux内核提供了一套丰富的宏和函数来操作双向链表,这些链表定义在。的结构体,以及如何初始化链表、添加元素和遍历链表。的双向链表,并遍历链表打印每个人的姓名和年龄。以下示例展示了如何定义一个包含。这个例子创建了一个包含两个人。,包含姓名、年龄和一个。双向链表的基本结构由。首先,定义一个结构体。原创 2024-04-06 09:26:07 · 904 阅读 · 0 评论 -
【ARM 嵌入式 C 常用数据结构系列 25 -- container_of 宏 使用介绍】
)ptr:指向结构体成员的指针。type:包含该成员的结构体的类型。memberptr指向的成员在type中的名字。宏的核心在于offsetof宏,它计算成员相对于结构体开始位置的偏移。通过将成员的指针减去其偏移量来计算包含它的结构体的初始地址。原创 2024-04-04 17:01:01 · 494 阅读 · 0 评论 -
【ARM 嵌入式 C 文件操作系列 20.2 -- C代码修改文件扩展名】
然后生成并返回一个新的文件名。这个新文件名不包含路径,也不包含原有的扩展名,而是添加了新的扩展名。中包含路径,最后一个斜杠后面的部分将被视为文件名。函数然后根据这些位置信息来构造新文件名。分配的,因此调用方负责释放这块内存,以避免内存泄露。),你需要相应地修改函数或调用时的参数。是否以点号开始,所以调用时要确保。下面是一个函数,它接收文件名。请注意,返回的新文件名是使用。是合法的,并且新的扩展名。函数来释放分配的内存。原创 2024-04-03 21:37:10 · 319 阅读 · 0 评论 -
【ARM 嵌入式 C 字符串系列 23.3 -- snprintf 函数详细介绍并举例】
snprintf函数是 C 语言中的一个标准库函数,用于将格式化的数据写入字符串。它是printf函数族的一部分,与sprintf类似,但提供了输出缓冲的大小限制,从而增加了程序的安全性,防止了缓冲区溢出的风险。NAMESYNOPSISsnprintf是一个非常实用的函数,它通过限制写入缓冲区的字符数来防止缓冲区溢出。在处理格式化字符串时,优先使用snprintf而不是sprintf,以提高程序的安全性。原创 2024-04-03 19:59:11 · 729 阅读 · 0 评论 -
【ARM 嵌入式 C 字符串系列 23.2 -- sscanf函数详细介绍并举例】
sscanf函数是 C 语言中的一个标准库函数,用于从字符串中读取格式化的输入。它是scanf函数族的一部分,与scanf函数相似,但是sscanf从一个字符串中读取数据,而scanf从标准输入(通常是键盘)读取数据。NAMESYNOPSISsscanf是一个非常强大的函数,它允许你从字符串中按照指定格式提取数据。这对于解析来自文件、网络或其他源的复杂字符串格式特别有用。使用时需要注意正确地指定目标变量的地址,并且基于返回值来判断提取数据的成功与否。原创 2024-04-03 19:57:09 · 589 阅读 · 0 评论 -
【ARM 嵌入式 C 文件操作系列 20.1 -- 从 A文件的 n 行开始 拷贝 m行到 B文件中】
这个例子假设了每行的最大长度为 1023 字符(加上一个空终止符,总共 1024 字符)。如果预计有更长的行,需要根据需要调整。会读取换行符并将其包含在结果字符串中,因此整行内容(包括换行符)都会被写入目标文件。如果源文件的最后一行长度超过。的函数,将需要使用标准库函数来读取和写入文件。它首先尝试打开源文件和目标文件,并在无法打开时报错退出。数组作为中介存储每行的内容。可能不会一次性读取完整行,可能需要特别处理。时,它开始将内容写入目标文件,直到拷贝了。最后,函数关闭了两个打开的文件。原创 2024-04-03 19:28:07 · 346 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 19.1-- C 代码中调用shell 脚本】
函数允许执行一个命令,并且可以读取该命令的标准输出。所实现的函数接收两个参数,一个是目录路径一个是比较值。函数来调用shell脚本,并获取其输出结果。进行比较如果比较不相等打印提示,在C语言中,可以通过使用。例如使用C 语言中的。原创 2024-04-03 19:15:09 · 518 阅读 · 0 评论 -
【ARM 嵌入式 C 网络系列 24 -- Telnet 命令 使用详细介绍】
Telnet(Teletype Network)是一种网络协议,用于在互联网或局域网上提供基于文本的通信功能。它允许用户通过一个终端或终端仿真程序(称为telnet客户端)远程登录到一个服务器。Telnet是最早的互联网标准之一,定义在RFC 854中。尽管Telnet非常强大,但它传输的数据(包括密码)都是明文的,这对安全性构成了重大风险。因此,在安全要求较高的环境中,Telnet通常被SSH(Secure Shell)所取代,SSH提供加密的网络通信。原创 2024-04-03 19:14:13 · 1214 阅读 · 0 评论 -
【ARM 嵌入式 C 字符串系列 23.1 -- 字符串比较函数 strncmp 详细介绍】
返回 0,根据实现的逻辑,可以在 else 分支中添加任何需要的代码。在这个例子中,我只是简单地打印出了找到了。个字符是否相等,如果不相等打印没找到 student_name。指针指向的字符串的长度(不包括结尾的空字符)。返回非零值,并且程序将打印出相应的消息。如果这些字符不相等,函数来比较两个字符串的前。在 C 语言中,可以使用。原创 2024-04-02 22:13:44 · 382 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 14.1 -- 计算数组大小的宏实现】
在 C 语言中,可以定义一个宏来计算一个数组的大小(即数组中的元素数量)。请注意,这个宏只能用于数组,不能用于指针。操作符,它可以返回数组总大小(以字节为单位)以及数组中第一个元素的大小。通过除以第一个元素的大小,我们得到了数组中元素的数量。对于指针仅返回指针类型的大小,而不是它所指向的内存块的大小。这个宏只能用于作用域中定义的真正的数组。在这个例子中,当编译并运行程序,它将输出数组的大小,即元素的数量。这个宏可能无法正确计算动态分配的数组或指针引用的大小,因为。原创 2024-04-02 22:09:21 · 380 阅读 · 0 评论 -
【ARM 嵌入式 C 字符串系列 23 -- 返回从父字符串找到相同子字符串的个数】
在 C 语言中,可以编写一个自定义函数来计算一个父字符串(haystack)中相同子字符串(needle)出现的次数。不是标准的 ANSI C 函数,因此可能在某些平台上不可用。如果需要跨平台可移植性,最好自行实现一个不区分大小写的字符串搜索函数。返回一个非空指针时,意味着找到了一个匹配的子字符串,我们会增加计数器。函数(如果可用),或者可以将字符串转换为统一的大小写,然后使用。前移子字符串的长度,继续在接下来的字符串中搜索相同的子字符串。函数,并打印出子字符串在父字符串中出现的次数。函数来搜索子字符串。原创 2024-04-02 22:05:40 · 736 阅读 · 1 评论 -
【ARM 嵌入式 C 头文件系列 22 -- 头文件 stdint.h 介绍】
是 C99 标准的一部分,旨在提供一组明确的整数类型,其大小不受特定系统架构(32位、64位等)影响。这允许程序员编写更可移植的代码,因为他们可以明确指定所需的整数大小和有符号性。可以让代码在不同平台间更可靠地保持行为一致,因为可以根据需要选择恰当的整数类型。还定义了一组宏,这些宏用于指定整数类型的常量。在 C 语言中,头文件。原创 2024-04-02 21:53:51 · 1216 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 21 -- 内存分配相关函数malloc 与 realloc】
都是 C 语言标准库中的函数,用于动态内存分配。时,如果返回一个新的指针, 应该用新指针替换旧指针。,但原先的内存还是要通过旧指针来释放的。函数来释放,以避免内存泄漏。分配的内存都必须通过。原创 2024-04-02 21:43:33 · 742 阅读 · 0 评论 -
【ARM 嵌入式 C 文件操作系列 20 -- 文件删除函数 remove 详细介绍】
函数在不同的操作系统上可能会有不同的实现,而且需要包含正确的头文件。上面的代码示例适用于像 Linux 这样的 Unix-like 系统。如果 使用的是 Windows 系统, 可能需要包含。函数来删除一个文件,但在删除之前 可能想确认该文件是否存在。的文件的状态信息,并将结果存储在一个。请确保根据 的开发环境调整代码。,否则返回非零值,并可以使用。在 C 语言中, 可以使用。函数来检查文件是否存在。函数成功执行,它也返回。原创 2024-04-02 21:40:12 · 998 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 19 -- system 函数与shell 命令 介绍】
因此,在实际代码中,如果要执行外部程序,更安全的做法是使用。此外,命令字符串需要根据实际环境和需求进行调整,特别是需要注意 shell 命令中的引号和特殊字符可能需要转义。头文件中,它接受一个指向以 null 结尾的字符串的指针,这个字符串包含了要被 shell 执行的命令。函数执行一个外部命令,并等待该命令执行完成。系列函数,或者可以手动创建一个进程并为其设置参数来执行外部程序。函数成功执行,返回值通常是命令的退出状态;函数来调用 shell 命令,包括带参数的。参数表示打印出找到的每个文件的路径。原创 2024-04-02 21:36:38 · 443 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 18 -- 字符数字转整形函数 atoi 介绍】
函数不会报告数字字符串转换失败的情况,如果传入的字符串不是有效的数字表示,它将返回。确保你的程序能够处理非数字字符串的情况,如果需要,可以添加适当的错误检查。如果你想要接收三个参数并将它们作为数字字符串转换为整数,你可以这样写。函数能够接收命令行参数。这些参数通过两个参数传递给。函数被用来将命令行参数(字符串)转换为整数。是你传递给程序的三个数字字符串参数。如果你需要更健壮的错误检查,请使用。是你的可执行文件的名称,是命令行参数的数量,是命令行传递的参数。原创 2024-03-27 22:10:05 · 574 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 17 --字符串查找函数 strstr 介绍】
函数在父字符串中搜索第一次出现子字符串的位置,如果找到,它返回子字符串的第一个字符在父字符串中的指针;来获取子字符串的位置。如果找到了子字符串,它将打印出子字符串的开始和结束位置;实现查找一个子字符串在父字符串中的开始和结束位置的功能,可以通过使用标准库函数。下面是一个 C 语言函数,它接收两个字符串作为参数,一个是要搜索的父字符串。中从位置 5 开始,在位置 12 结束。函数查找子字符串在父字符串中的出现,并计算出它的开始和结束位置。结构来存储子字符串的开始和结束位置。,另一个是要找到的子字符串。原创 2024-03-27 22:01:28 · 304 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 16 -- 产生0/1随机数的C代码】
实现一个可以执行的文件 pattern_gen.out, 该可执行文件接收两个参数,第一个参数是文件名 filename,第二个参数是长度len, pattern_gen.out 向filename 中生成随机数,其中随机数只有0和1,其中生成的随机数的个数由命令行参数传入len 决定。,你需要编写一个 C 程序,该程序接收两个命令行参数,并生成指定长度的 0 和 1 随机数序列。文件中生成一个长度为 100 的 0 和 1 的随机数序列。将这个程序保存到一个文件中,比如命名为。为了创建一个可执行文件。原创 2024-03-27 21:57:31 · 557 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 15 -- 文件行合并C代码实现】
下面是一个用 C 语言实现的函数,它接受一个文件名、起始行号和结束行号作为输入,将这些行合并为一个字符串,并以结构体的形式返回合并后的字符串地址以及起始行和结束行的行数。有时我们需要将文件中给定的起始行和结束行合并为一行,然后使用返回结构体的方法,返回合并后字符串地址,起始行和结束行在文件中的行数。编译并运行这个程序时,请确保指定的文件存在,并且起始行号和结束行号是有效的。的结构体,它包含了合并后的字符串、起始行号和结束行号。函数,它打开文件,跳过不需要的行,然后开始合并指定的行。原创 2024-03-27 21:46:12 · 220 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 14 -- C 代码中取余与取模的使用介绍】
计算它所在的行号(假设每行有固定的32个字符)。函数将返回计算出的行号,其中行号从1开始计数。有些文件每行是固定的字符个数,那么如果任意给个字符的序号,怎么通过C 代码获取该字符所在的行呢?,然后打印出需要拷贝的行数。按照这个逻辑,对于65个字符,需要拷贝的行数将是3行,因为。按照这个逻辑,位65将位于第3行,因为。的商是2,余数是1,所以它位于第2行的下一行,即第3行。的商是2,余数是1,所以需要在第2行的基础上再加1行。检查是否有额外的位数,如果有,表明。检查是否有剩余的字符,如果有,表明。原创 2024-03-27 21:42:09 · 318 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进 12 --寄存器位清0和置位函数实现】
在 C 语言中,可以使用宏定义来创建用于清除(清零)或设置(置一)32位地址中特定位的函数。关键字确保每次访问寄存器时都会直接从内存读取,而不会使用缓存的值,这是访问硬件寄存器时的标准做法。表示无符号长整型字面量,确保移位操作是在一个32位的值上执行的,以便正确地处理位操作。创建一个只有目标位为1其余位为0的掩码,然后使用按位取反操作。假设要操作的是一个具有可读写属性的寄存器,它的地址为。是需要操作的位的索引(从0开始计数)。是指向目标32位地址的指针,在执行位清除操作时,首先使用。原创 2024-03-21 19:46:35 · 659 阅读 · 0 评论 -
【ARM 嵌入式 C 入门及渐进11 -- 确保数据写入寄存器】
关键字来防止编译器优化,并在写入后使用合适的内存障碍指令以确保操作的顺序和完成。虽然大多数现代ARM处理器支持非对齐的内存访问,但为了最佳性能和兼容性,在32位的架构中应确保写入的地址是32位对齐的,即地址是4的倍数。如果你正在写入的寄存器或内存区域可能会被CPU缓存,那么在写入之前,可能需要确保之前的任何缓存行都被刷新。这些指令确保在障碍指令之前的所有存储操作完成后,才开始执行之后的指令。写入寄存器时,通常认为这种写入是对设备的操作,而设备寄存器并不应该被缓冲。: 确保写入的地址是32位对齐的,因为。原创 2024-03-19 22:27:09 · 934 阅读 · 0 评论