
C语言
文章平均质量分 56
嵌入式小宁
从事相关gd32,stm32,ch32,esp32,freertos,ucosiii,嵌入式Linux应用程序,硬件外设对接,片上协议通信,设备数据交互
展开
-
标准库memcpy()内存对齐异常引发单片机hard fault问题汇总
我们之前使用的是ARM提供的轻量级 C 库(MicroLIB),但是后面引入了一些东西改用C标准库,发现memcpy会经常引起硬件故障hard fault ,然后发现是便准库memcpy内存对齐异常引起的;确实是对齐问题,默认定义变量地址都是对其的,但是使用的时候一般都会加偏移,偏移后没有对齐,标准库的这个函数也会引起硬件故障;1.起因:相同内容使用标准库的memcpy会引起硬件故障,使用自定义内存拷贝正常运行(无内存越界和堆栈溢出)有点像标准库函数有什么性能优化不太适配ARM;发现一个奇怪的现象;原创 2025-02-14 15:00:39 · 388 阅读 · 0 评论 -
轻量级 C 标准库(如MicroLIB)
轻量级 C 标准库()是为资源受限的嵌入式系统设计的,它去除了标准 C 库中一些不常用的功能,以减小代码体积和内存占用。原创 2025-02-13 13:17:20 · 246 阅读 · 0 评论 -
C语言常见头文件及引入功能
功能:GNU libmicrohttpd 库,用于创建嵌入式 HTTP 服务器。用于创建轻量级嵌入式 HTTP 服务器,适合需要提供 Web 服务的嵌入式系统。:将点分十进制 IP 地址转换为二进制格式。:将二进制 IP 地址转换为点分十进制格式。:将主机字节序转换为网络字节序(16 位)。:将主机字节序转换为网络字节序(32 位)。:将网络字节序转换为主机字节序(16 位)。:将网络字节序转换为主机字节序(32 位)。用于网络编程中的地址转换和字节序处理。:将时间转换为本地时间结构。原创 2025-01-16 13:46:25 · 894 阅读 · 0 评论 -
pthread.h互斥锁与原子操作
原子操作是指在并发执行的环境中,某个操作要么完全执行,要么完全不执行,不会被其他线程中断。这种操作具有不可分割性和一致性。原子操作通常被实现为特定的 CPU 指令,这些指令可以在硬件层面上完成操作而不受线程切换的影响。原创 2024-12-30 11:19:09 · 624 阅读 · 0 评论 -
__attribute__((section(“RAMCODE“)))指定函数或者变量存放在特定内存段中
是一个 GCC 编译器的特性,用于指定某个函数或变量应该放置在特定的内存段中。"RAMCODE" 是分散加载文件中一个自定义的内存段名称,这里"RAMCODE"是指定在ram中的一个内存片段,用于加载高频访问的函数。以下是一个简单的例子,展示如何使用 __attribute__((section("RAMCODE"))) 将一个函数放置在特定的内存段中。在链接器脚本中,你需要确保定义了 "RAMCODE" 段,以便将其映射到 RAM 中。原创 2024-12-19 13:49:58 · 566 阅读 · 0 评论 -
浅拷贝之相同结构体变量相互赋值
在 C 语言中相同类型的结构体变量可以直接相互赋值。这种赋值会进行成员到成员的复制(浅拷贝)。在RTC_CLOCK 结构体中,所有成员都是 short 类型的基本数据类型,所以可以直接使用赋值运算符进行复制。它会将 utc 指向的结构体的所有成员值直接复制给 gmt8 指向的结构体。原创 2024-12-06 09:39:31 · 246 阅读 · 0 评论 -
#pragma pack(1)修改编译器对齐方式
默认情况下,编译器会按照特定的规则对结构体成员进行对齐,使得访问结构体成员时更加高效。对齐可以确保结构体成员被存储在内存地址的合适位置,避免因为对齐不当而导致的性能损失或者错误。此外,对齐还有助于确保结构体在不同平台上的一致性,提高了代码的可移植性。`#pragma pack(1)` 是一个用于告诉编译器如何对齐结构体成员的指令。在这个特定的情况下,`(1)` 指示编译器将结构体成员按照一个字节的边界进行对齐。这意味着结构体的成员将依次排列,不会按照默认的对齐方式进行填充。原创 2024-11-28 10:17:18 · 300 阅读 · 0 评论 -
const关键字修饰指针访问的内容只读,限制指针内存操作权限
关键字来声明指向常量的指针,这样就可以确保通过这个指针访问的内容为只读,不能被修改。通过声明指向常量的指针,可以确保通过这个指针访问的内容是只读的,从而避免对其进行修改。访问的内容是只读的,不能被修改。修改指针指向的内容,编译器会报错。在这段代码中,我们声明了一个整数变量。声明了一个指向常量的指针。在C语言中,可以使用。原创 2024-11-26 10:19:10 · 164 阅读 · 0 评论 -
【日志记录】---编译器内存对齐优化导致结构体成员引用异常
如果你想要避免这种填充(在某些情况下,比如内存使用非常关键时),你可以使用特定的编译器指令或属性来控制对齐,但这通常不是推荐的做法,除非你有明确的理由。进一步调试发现原本3个字节大小的结构体,在内存中占用了四个字节的位置,这正是导致输出数据异常的原因,多出的一个字节导致数据引用出现了错位。在一个跨线程数据处理消息的时候出现了以下内存错位现象,在结构体指针引用的时候出现了成员数据异常。2.【目标结构体】线程B知道线程A该条消息的结构体,定义了专门的结构体来套字节流中的数据。后面可能有一个填充字节,以确保。原创 2024-05-07 16:53:53 · 357 阅读 · 0 评论