当前位置: 首页 > news >正文

嵌入式面试/笔试C相关总结

1、存储

        单片机端编译后分为code ro rw zi几个区域,其中code是执行文件,ro(read only)只读区域,存放const修饰常量、字符串。rw(read write)存放已初始化变量。zi存放未初始化变量。编译完成后bin大小为code+ro+rw。运行时所需内存为rw+zi。

        在电脑端编译完后会分为text data bss三种,其中text为可执行程序,data为初始化过的ro+rw变量,bss为未初始化或初始化为0变量。

2、内存分配

        内存分配分为静态存储区、栈、堆三种。

可以看到静态存储区保存全局变量、常量,除此外函数内使用static修饰的变量也会储存在该区域(通常函数内变量存储在栈中,函数返回时销毁)。由此可以看到static修饰其中一个作用:使得变量存放在静态存储区,在程序运行期间均有效。虽然全局静态变量与局部静态变量在程序运行期间均存活,但局部静态变量仅在其作用域可访问。

堆由动态内存相关函数进行操作,如malloc free。栈由编译器分配,主要是调用函数时的参数、变量以及保护现场压栈使用。

3、运算符优先级

序号运算符结合方向
1(最高)() [] -> .左到右
2* & sizeof() (强转) ++ -- ! ~ -(负号)右到左
3* / %左到右
4+ - 左到右
5>> <<左到右
6>= <= < >左到右
7!= ==左到右
8&左到右
9^左到右
10|左到右
11&&左到右
12||左到右
13?:右到左
14

= += -= *= /= %= >>= <<= 

&= ^= |=

右到左
15(最低),左到右

由上表可知,将q复制到p数组可以表示为:*p++=*q++,*优先级高,先取到对应q数组的值,然后两个++都是在后面,该行运算完后执行++。可以分为*p=*q;p++,q++;两行。

4、函数调用时的参数运算

        例如:int a = 1,b=2,c=3;printf("%d,%d,%d\n",a+b+c,b+=2,c*=2);本该是不同编译器结果不同,但是尝试了g++ msvc都是先计算c,再计算b,最后得到a+b+c是经过赋值以后的b和c参与计算而不是6。

5、static

        static作用分为三种:局部变量,全局变量,函数。

修饰全部变量和函数作用一样:仅在模块/文件内使用。

修饰局部变量:将其存放到静态存储区,不会随着函数结束销毁。从而导致其值不会每次都重新初始化,而是初始化一次后续每次都是上一次的值。其他文件内函数无法访问,这是局部变量的特点。

6、大小端

        大端是常见的理解形式,高字节放在低地址,0x12345678中0x12是最高字节,0x78是最低字节。而小端中高字节在低地址。具体区分方法参考https://blog.csdn.net/qq_29144629/article/details/104986767

7、指针

        指针与数组相关参考c语言指针与数组_勿忘初心,方得始终。的博客-CSDN博客

8、结构体

        结构体定义方式:

typedfe struct _type_def{int val;struct _type_def *ptr;
}type_def;

后续可以使用type_def A;或者struct _type_def A;的形式定义变量。注意二者区别以及如果使用链表形式时需要在结构体里面使用struct _type_def去定义,这样不会报错,如果使用type_def去定义会有一些编译器报错。

        结构体大小不是简单的累加和,而是最长数据类型的整数倍,所以要尽可能把短的数据放在一起,而不是各自占用一个新空间。例如:

typedef struct{
char A;
int B;
char C;
}my_typedef;

所占用空间是int的三倍,具体取决于int的长度。而不是两个char加一个int的大小。如果定义为:

typedef struct{
char A;
char C;
int B;
}my_typedef;

只占用两倍int空间,同样,如果在C与B中间再加上一个char D;其结果还是两倍int空间。

如果想要结构体占用其数据类型对应的大小个字节需要使用attribute将其强制1字节对其。具体参考:C语言__attribute__学习记录___attribute__ (( section可以把变量放到多个段中吗_勿忘初心,方得始终。的博客-CSDN博客

9、位域

        位域用于不需要太长数据类型对象,例如1个或者几个bit。通常与结构体结合使用:(可以使用空位域)

typedef struct{unsigned int F1_Bit:2;unsigned int :1;unsigned int F2_Bit:10;
}Bit_typedef;

10、联合体

        联合体与结构体定义方式类似,形如:

typedef union _learn
{int a[7];char b;double c;
}learn;

其中所有变量共用同一块内存,在dsp配置中比较常见,可以直接配置寄存器,或者对不同功能的不同位进行配置。其占用空间对其方式与结构体类似,需要与最长数据类型对其,也就是整数倍。上例中a占用28个字节(32位系统),但是double位8字节,28不能整除所以需要往上取整,结果占用32个字节。

通过联合体与结构体加上位域可以实现对寄存器全读写或者部分读写:

typedef struct{unsigned int F1_Bit:2;unsigned int F2_Bit:10;
}Bit_typedef;typedef union _Reg_t
{unsigned int Reg;Bit_typedef Bit;}Reg_t;

可以通过Reg_t regA;regA.Reg = 0X12345678;对整个4字节赋值,或者通过regA.Bit.F1_Bit进行读写。

相关文章:

嵌入式面试/笔试C相关总结

1、存储 单片机端编译后分为code ro rw zi几个区域&#xff0c;其中code是执行文件&#xff0c;ro(read only)只读区域&#xff0c;存放const修饰常量、字符串。rw(read write)存放已初始化变量。zi存放未初始化变量。编译完成后bin大小为coderorw。运行时所需内存为rwzi。 在电…...

支付宝使用OceanBase的历史库实践分享

为解决因业务增长引发的数据库存储空间问题&#xff0c;支付宝基于 OceanBase 数据库启动了历史库项目&#xff0c;通过历史数据归档、过期数据清理、异常数据回滚&#xff0c;实现了总成本降低 80%。 历史数据归档&#xff1a;将在线库&#xff08;SSD 磁盘&#xff09;数据归…...

accelerate 分布式技巧(一)

accelerate分布式技巧 简单使用 Accelerate是一个来自Hugging Face的库&#xff0c;它简化了将单个GPU的PyTorch代码转换为单个或多台机器上的多个GPU的代码。 Accelerate精确地抽象了与多GPU/TPU/fp16相关的模板代码&#xff0c;并保持Pytorch其余代码不变。 import torchim…...

密码找回安全

文章目录 密码找回安全任意秘密重置 密码找回安全 用户提交修改密码请求;账号认证:服务器发送唯一ID (例如信验证码)只有账户所有者才能看的地方&#xff0c;完成身份验证&#xff1b;身份验证:用户提交验证码完成身份验证;修改密码:用户修改密码。 任意秘密重置 登录metinfo4…...

Spring Boot + Vue的网上商城之商品管理

Spring Boot Vue的网上商城之商品管理 在网上商城中&#xff0c;商品管理是一个非常重要的功能。它涉及到商品的添加、编辑、删除和展示等操作。本文将介绍如何使用Spring Boot和Vue来实现一个简单的商品管理系统。 下面是一个实现Spring Boot Vue的网上商城之商品管理的思路…...

B站:提高你的词汇量:如何用英语谈论驾驶

视频链接&#xff1a;提高你的词汇量:如何用英语谈论驾驶_哔哩哔哩_bilibili 英文音标中文hood/hʊd/n. 汽车的引擎盖go over仔细检查&#xff1b;认真讨论&#xff1b;用心思考There are plenty of videos go over this.有很多关于这个的视频unlockvt. 发现&#xff1b;揭开&…...

大前端面试注意要点

前端面试&#xff1a;从IT专家角度全面解析 在数字时代&#xff0c;前端开发工程师的角色变得越来越重要。随着网站和应用程序的复杂性和交互性越来越高&#xff0c;对具有专业技能的前端开发人员的需求也在不断增长。对于正在寻找前端开发职位的开发者&#xff0c;或者正在寻…...

稻盛和夫-如是说(读书笔记)

本书解答的核心问题&#xff1a; “今天&#xff0c;我们需要的不是短期有效的处方。作为人&#xff0c;何谓正确&#xff1f;作为人&#xff0c;应该如何度过人生&#xff1f;这才是一切问题的根源。 有几个要点和认知比较深的地方谈一谈。 1、利他 类似于阳明心学&#xff0…...

Jmeter是用来做什么的?

JMeter是一个开源的Java应用&#xff0c;主要用于性能测试和功能测试。它最初由Apache软件基金会设计用于测试Web应用程序&#xff0c;但现在已经扩展到其他测试功能。JMeter的主要功能如下&#xff1a; 性能测试&#xff1a;性能测试是JMeter的核心功能&#xff0c;主要分为两…...

Docker基础教程

Docker基础教程 Docker简介 Docker基本操作 Docker应用 Docker自定义镜像 Docker compose 为什么使用DockerDocker简介安装DockerDocker的中央仓库Docker镜像操作Docker容器操作准备一个web项目创建MySQL容器创建Tomcat容器将项目部署到TomcatDocker数据卷DockerfileDock…...

Linux命令200例:who用于显示当前登录到系统的用户信息

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…...

HGDB-修改分区表名称及键值

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;N/A 版本&#xff1a;4.5.7 文档用途 使用存储过程拼接SQL&#xff0c;修改分区名称、分区键值、并重新加入主表&#xff0c;适用于分区表较多场景。 详细信息 说明&#xff1a;本文档为测试过程&#xff1…...

1分钟了解音频、语音数据和自然语言处理的关系

机器学习在日常场景中的应用 音频、语音数据和自然语言处理这三者正在不断促进人工智能技术的发展&#xff0c;人机交互也逐渐渗透进生活的每个角落。在各行各业包括零售业、银行、食品配送服务商&#xff09;的多样互动中&#xff0c;我们都能通过与某种形式的AI&#xff08;…...

线性代数的学习和整理20,关于向量/矩阵和正交相关,相似矩阵等

目录 1 什么是正交 1.1 正交相关名词 1.2 正交的定义 1.3 正交向量 1.4 正交基 1.5 正交矩阵的特点 1.6 正交矩阵的用处 1 什么是正交 1.1 正交相关名词 orthogonal set 正交向量组正交变换orthogonal matrix 正交矩阵orthogonal basis 正交基orthogonal decompositio…...

OpenCV之ellipse函数

ellipse函数用来在图片中绘制椭圆、扇形&#xff0c;有两个重载函数。 函数原型1&#xff1a; void cv::ellipse( InputOutputArray img,Point center,Size axes,double angle,double startAngle,double …...

git快速查看某个文件修改的所有commit

1. git blame file git blame 可以显示历史修改的每一行记录,有时候我们只想了解某个文件一共提交几次commit,只显示commit列表,这种方式显然不满足要求。 2.git log常规使用 (1)显示整个project的所有commit (2)显示某个文件的所有commit 这是git log不添加参数的常规…...

加强版python连接飞书通知——本地电脑PC端通过网页链接打开本地已安装软件(调用注册表形式,以漏洞扫描工具AppScan为例)

前言 如果你想要通过超链接来打开本地应用,那么你首先你需要将你的应用添入windows注册表中(这样网页就可以通过指定代号来调用程序),由于安全性的原因所以网页无法直接通过输入绝对路径来调用本地文件。 一、通过创建reg文件自动配置注册表 创建文本文档,使用记事本打开…...

Jmeter进阶使用指南-使用断言

Apache JMeter是一个流行的开源负载和性能测试工具。在JMeter中&#xff0c;断言&#xff08;Assertions&#xff09;是用来验证响应数据是否符合预期的一个重要组件。它是对请求响应的一种检查&#xff0c;如果响应不符合预期&#xff0c;那么断言会标记为失败。 以下是如何在…...

44、Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示例--网上有些说法好像是错误的

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...

电脑入门: 路由器初学者完全教程

路由器初学者完全教程 本文以Cisco2620为例,讲述了路由器的初始化配置以及远程接入的配置方法,探讨了如何使用内部网络的DHCP服务功能为远程拨入的用户分配地址信息以及路由器常见故障的排除技巧。 (本文假定Cisco2620路由器为提供远…...

Pixel Couplet Gen应用场景:微信小程序开发者如何复用像素皇城UI组件

Pixel Couplet Gen应用场景&#xff1a;微信小程序开发者如何复用像素皇城UI组件 1. 项目背景与价值 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的创新应用。作为微信小程序开发者&#xff0c;您可以直接复用其UI组件库&#xff0c;快速构建具有以下特点的应…...

计算机毕业设计springboot基于Web的健身会员管理系统 基于SpringBoot的健身房智能化运营服务平台 SpringBoot框架下的健身俱乐部会员服务与课程预约系统

计算机毕业设计springboot基于Web的健身会员管理系统e7cr4n62&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着全民健身意识的提升和健康管理需求的日益增长&#xff0c;传统…...

白鲸开源架构师获邀成为 ASF Member

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

Qwen3.5-9B自动化:GitHub Actions触发模型推理+PR评论生成

Qwen3.5-9B自动化&#xff1a;GitHub Actions触发模型推理PR评论生成 1. 项目概述 Qwen3.5-9B是一个拥有90亿参数的开源大语言模型&#xff0c;具备强大的逻辑推理、代码生成和多轮对话能力。最新版本还支持多模态理解&#xff08;图文输入&#xff09;和长达128K tokens的上…...

STEP3-VL-10B实际作品集:MMBench 92.05分视觉识别能力高清图文输出示例

STEP3-VL-10B实际作品集&#xff1a;MMBench 92.05分视觉识别能力高清图文输出示例 1. 引言&#xff1a;当AI“看懂”了世界 你有没有想过&#xff0c;让AI像人一样“看懂”一张图片&#xff0c;到底有多难&#xff1f; 这不仅仅是识别出图片里有什么东西那么简单。比如给你…...

cv_unet_image-colorization音乐史料处理:黑白乐谱AI上色与音符语义关联增强

cv_unet_image-colorization音乐史料处理&#xff1a;黑白乐谱AI上色与音符语义关联增强 1. 引言&#xff1a;当黑白乐谱遇见AI色彩 想象一下&#xff0c;你是一位音乐史研究者&#xff0c;面前摊开一本泛黄的、只有黑白线条的19世纪乐谱手稿。那些音符、标记、作曲家的笔迹&…...

别再纠结选哪个了!实测对比PP-OCRv4、v3、读光等主流开源OCR模型(附完整代码与数据集)

主流开源OCR模型实战评测&#xff1a;从技术指标到业务落地的全维度解析 每次打开GitHub搜索OCR项目时&#xff0c;总会被琳琅满目的模型搞得眼花缭乱——PP-OCR系列、读光、DBNet...每个项目主页都宣称自己"精度最高"、"速度最快"。但当你真正把这些模型部…...

PyTorch内存优化实战:深入解析torch.utils.checkpoint的机制与应用

1. 为什么我们需要torch.utils.checkpoint&#xff1f; 第一次用PyTorch训练ResNet50时&#xff0c;我的16GB显存直接被撑爆了。当时怎么都想不明白——明明batch_size只设了32&#xff0c;怎么连这种经典模型都跑不动&#xff1f;后来才发现&#xff0c;问题出在前向传播时PyT…...

别再只用脚本了!用MATLAB OOP重构你的数据处理流程,效率翻倍

MATLAB面向对象编程&#xff1a;从脚本思维到工程级代码的跃迁 当你的MATLAB脚本膨胀到上千行&#xff0c;当每次修改都需要在数十个函数间跳转&#xff0c;当同事问你"这个变量在哪里定义的"而你却一时语塞——是时候告别脚本思维了。面向对象编程(OOP)不是MATLAB里…...

保姆级教程:用YOLOv5和ReID搞定跨摄像头找人(附完整代码和预训练模型)

跨摄像头人物追踪实战&#xff1a;YOLOv5与ReID技术深度整合指南 在智能安防、零售分析等场景中&#xff0c;跨摄像头追踪特定人物一直是个技术难点。传统方案要么依赖单一摄像头的目标检测&#xff0c;要么需要复杂的人工特征标注。本文将手把手带您实现一套基于YOLOv5目标检测…...