【嵌入式软件开发实习】个人面试记录及其总结(一)

2023-05-16

文章目录

    • 问题一:使用宏定义完成两个数据的交换
    • 问题二:制作一个函数接口判断函数参数输入是否符合要求,如果符合要求就返回部分输入,如果不符合就返回no result
    • 问题三:什么是结构体对齐
    • 问题四:大端小端的数据存储
    • 问题五:STM32F103烧入时ROM的起始地址
    • 其他问题

问题一:使用宏定义完成两个数据的交换

  一开始,由于小编过于紧张+想多了😅😅😅,然后给技术官的结果就是这样子的:

#define swap(a,b)  \
        int c = a;  \
        a = b;   \
        b = c;   \

  咋一看是不是没啥毛病🤣🤣🤣。但是呢,习惯上后面那三句话是需要括号的,就像这样子:

#define swap(a,b)  \
    {              \
        int c = a;  \
        a = b;   \
        b = c;   \
    }

个人点评
  上面的交换还借助了临时变量,一般情况在函数中看起来很正常,但在宏定义中看起来是不是奇奇怪怪的呢?🤔🤔🤔于是乎,在面试结束后,小编又使用另外的方法实现了交换功能。(其实在面试过程中,小编也想到这种方式,但是由于很久没有使用过了,因此不敢确定不敢写😂😂😂)

使用异或实现数据交换:

#define swap(a,b)  \
    {              \
        a = a^b;   \
        b = a^b;   \
        a = a^b;   \
    }

  假如使用该宏定义实现整型数据5、6的交换,那么其过程如下:
在这里插入图片描述
使用加法减法实现数据交换:
 &esmp;使用加减法实现数据交换类似上面的使用三次异或实现数据交换,其实现过程中含有一次加法、两次减法,具体宏定义实现如下:

#define swap2(a,b)  \
    {              \
        a = a+b;   \
        b = a-b;   \
        a = a-b;   \
    }

  实现过程图解如下:
在这里插入图片描述

问题二:制作一个函数接口判断函数参数输入是否符合要求,如果符合要求就返回部分输入,如果不符合就返回no result

详细问题描述
  使用C语言实现一个接口,接口的输入数据是函数的参数,函数需要实现如果这个输入符合xxxxx.bin的格式,那么就返回xxxx(也就是.bin前面的数据),否则返回"no result".

解决方案:
  在将述正式解决方案之前,小编需要先讲述一个向main函数中传参的方法,该方法主要运用于终端运行编译后可执行文件。
  话不多说,先给大家看函数吧!

#include <stdio.h>

int main(int arc,char*arg[])
{
	for(int i=0;i<arc;++i)
		printf("%s ",arg[i]);
	printf("\n");
	return 0;
}

  该函数是一个典型的主函数传参函数,而且函数实现的功能是打印主函数的所有参数,如果我们使用 .\ target.exe “hello word!”(假设编译后生成的文件为target.exe),那么其结果就会打印 绝对路径+.\ target.exe 以及 “hello word!”。如下图:
在这里插入图片描述
  这里也就是说从执行命令开始算第一个输入参数(包括执行命令),那么大家可能会想,如果我们需要获取某一个参数怎么办?🤔🤔🤔
  当然也是有方法的啦!主函数的参数int arc表示参数的个数,char*arg[]是一个数组,里面包含了所有参数。也就是说,如果我们想要获取第i个参数,那么我们可以使用 arg[i] 来获取。

  在讲述正式题解之前,小编还想给大家介绍一个函数——字符串复制函数void *memcpy(void *str1, const void *str2, size_t n);(今天面试的时候一直想用,但是忘记咋用的了😂😂😂)
  void *memcpy(void *str1, const void *str2, size_t len),是一个字符串复制函数,参数1:str1表示结果字符串,参数2:str2表示源字符串,参数2:len表示复制长度。虽然这个简单,但是请大家在函数调用完成后别忘记最好还是手动加上一个字符串结束符’\0’,当然了,如果是整个字符串完全复制就大可不必了。使用示例如下:

#include <stdio.h>
#icnlude <string.h>

int main(void)
{
    char src[50] = "123456789",dest[10];
    int len = strlen(src);
    // 从起始位置开始复制 (len-4)个字符
    memcpy(dest, src, len-4);
    dest[len-4] = '\0';
    printf("dest = %s\n", dest);

    // 从2号位开始复制 (len-4)个字符
    memcpy(dest, src+2*sizeof(char), len-4); // 注意这里的*sizeof(char)可省略
    dest[len-4] = '\0';
    printf("dest = %s\n", dest);
	return 0;
}

  其结果如下:
在这里插入图片描述
  好了好了,现在咱来说说正式题解吧!🤣🤣🤣
  先上代码:

#include <stdio.h>
#include <string.h>

char *check(char str[])
{
    int len = strlen(str);
    if(len < 4) return (char*)"no result";
    char*res = (char*)malloc(sizeof(char)*(len-4));
    // 判断数据后缀是否符合规则
    if(str[len-1]=='n' && str[len-2]=='i' && str[len-3]=='b' && str[len-4]=='.')
    {
        // 赋值数组str中前len-4个字符到res
        memcpy(res, str, len-4);
        // 给res数组添加一个结束符
        res[len-4] = '\0';
        return res;
    }
    else
        return (char*)"no result";
}

// 主函数
int main(int arc,char*arg[])
{
	printf("%s\n%s\n",check(arg[1]),check(arg[2]));
	return 0;
}

  其运行结果如下:
在这里插入图片描述
  这个题解感觉上是不是很整洁、简约,🤣🤣🤣但是呢,小编在现场写的代码超级烂,因为当时我给懵了,思维跟不上了 😅😅😅 。写的代码如下:

#include <stdio.h>
#include <string.h>

int main(char str[])
{
	int count = 0,i = 0,j = 0,len = strlen(str);
	char table[] = "nib.",*res = (char*)malloc(sizeof(char)*(len-4));
	for(i=len-4,j=0;i<len,j<4;++i,++j)
		if(table[j] != str[i])
			break;
	if(i == len-4)
	{
		for(i=0;i<len-4;++i)
			printf("%s",str[i]);
		printf("\n");
	}
	else
		printf("no result\n");
}

  大家看这个是不是很无语,面试官直接跟我说“我想要的是一个接口,而不是这个,应该有返回值的”。😢😢😢

问题三:什么是结构体对齐

  在讲述字节对齐前,大家需要知道变量的字节数及其取值范围:

类型字节数取值范围
int(基础类型)4字节-232 - 231-1
unsigned int(无符号整型数据)4字节0 - 232 -1
short(短整型)2字节-215 - 215-1
unsigned short(无符号短整型)2字节0 - 216-1
long(长整型)4字节-231 - 231-1
unsigend long(无符号长整型)4字节0 - 232-1
long long(双长整型)8字节-264 - 263-1
unsigned long long(无符号双长整型)8字节0 - 264-1
(singed) char(有符号字符型)1字节-27 - 27-1
unsigned char(无符号字符型)1字节0 - 28-1
float (单精度浮点型)4字节0、-3.4*10-38 - 3.4*1038
double(双精度浮点型)8字节0、2.3*10-308 - 1.7*10308
long double (Visual C++中的长双精度浮点型)8字节0、2.3*10-308 - 1.7*10308
long double(Turbo C 中的长双精度浮点型)16字节0、3.4*10-4932 - 1.1*104932

字节对齐:

  • 字节对齐的要求: 结构体成员变量对齐 结构体总体对齐
  • 结构体对齐的规则:
  • 一、结构体变量的首地址是最长成员长度的整数倍。
  • 二、每个成员相对结构体首地址的偏移量,一定是该成员长度的整数倍。
  • 三、结构体的总长度是最长成员长度的整数倍。
  • 四、如果结构体内有成员长度大于处理器的位数,那么就助处理器的位数作为对齐单位。

示例:
  先给大家看看小编定义的两个结构体:

struct data1
{
    char a;
    int b;
    short c;
};

struct data2
{
    char a;
    short c;
    int b;
};

  大家咋一看是不是认为这两个结构体没有任何区别呢?🤔🤔🤔不瞒大家,一开始,小编也是认为这两个结构体在存储上是没有任何区别的,但是在认真学习后,就明白了这两个结构体的区别,宏观上看就是sizeof(struct data1)sizeof(struct data2)是不一样的,在实际的存储中他们两者的存储类似下图(下图中的黄色部分是填充):
在这里插入图片描述
  也就是说结构体struct data1的第二个成员变量int b需要遵循上述规则的第二条(变量存储的起始地址需要时变量大小的整数倍),而导致数据在存储时发生了偏移。
  但是结构体struct data2的第二个成员变量short c其大小刚好是2个字节,也就是说在填充一个字节数据后刚好能够存储。
  那么再使用printf函数打印成员变量的首地址看看其存储结果:

	struct data1 data1;
	struct data2 data2;
	printf("sizeof(data1):%d  sizeof(data2):%d\n",sizeof(struct data1),sizeof(struct data2));
	printf("data1_a:%lld data1_b:%lld data1_c:%lld\n",&data1.a,&data1.b,&data1.c);
	printf("data2_a:%lld data2_c:%lld data2_b:%lld\n",&data2.a,&data2.c,&data2.b);

在这里插入图片描述
 &esmp;因为这个是一个首地址,将其放入我们上述分析的图片中,每个变量的首地址刚好对上。😁😁😁

  结构体对齐,好处:能够加快CPU数据取出的效率;坏处:很显然会浪费一定的空间。

问题四:大端小端的数据存储

  讲解前,大家需要知道一个概念:读数据永远是从低地址开始的!!!
大端小端的概念

  • 大端存储:大端模式,将数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中;
  • 小端存储:小端模式,将数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

  如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示:

地址偏移量大端模式小端模式
0x001278
0x0134 56
0x025634
0x037812

  那么,我们如何判断某个系统是采用小端模式存储还是大端模式存储呢?
  一个简单的方法:我们可以先定义一个数据0x0001存储在一个变量中,那么这个变量最终在系统中存储时,如果系统采用大端模式存储,则最低位就会是0;如果系统采用小端模式存储,那么低位就会是1。因此,我们就可以通过判断一个数据的最低位来判系统的存储方式。
 &esmp;其测试程序的核心代码如下:

    int a = 0x0001;
    int b = a&1;
    if(b == 1)
        printf("系统采用小端模式存储\n");
    else
        printf("系统采用大端模式存储\n");

  这里小编在vscode、dev C++、ubuntu中运行了,其结果都一样:
在这里插入图片描述

问题五:STM32F103烧入时ROM的起始地址

  STM32F103ZET6的ROM与RAM的起始地址及其大小如下:

  • ROM:起始地址为0x0800 0000,大小为0x0008 0000;
  • RAM:起始地址为0x2000 0000,大小为0x0001 0000。

其他问题

  • 以后的职业规划;
  • 自己理想的生活与工作;
  • 家里人对自己找工作有啥想法或建议;
  • 为什么要打比赛;
  • 为什么要加入实验室;
  • 在你简历的项目中,你最想分享的项目是哪个;
  • C语言学的咋样以及你最想与我(hr)探讨的是哪个部分;(这里小编选的是结构体😅😅😅)
  • C语言能够实现面向对象开发嘛;
  • 移植FreeRTOS时碰到的问题以及解决方案;
  • 你为什么会想到这个项目以及一些项目的细节,如项目中使用WiFi的作用;

  好了,小编本次的面试分享就到这里了,如果大家对上述问题有啥更好的建议与解决方案,欢迎大家留言或私信哟!🤤🤤🤤

  最后,小编再分享一个小编自己创建的QQ交流群 338366010,在里面会有嵌入式相关知识的分享,欢迎各位加入哟!😉😉😉

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【嵌入式软件开发实习】个人面试记录及其总结(一) 的相关文章

  • 串行通信协议小结(Serial Protocols)(1)

    通信关键点 同步通信 xff08 例如SPI xff09 双方之间的数据传输使用公共时钟信号进行同步 xff0c 数据以稳定的流传输 不需要额外的比特来标记传输的每个数据块的开始 结束 xff0c 因此速度更快 异步通信 xff08 例如U
  • MATLAB课程笔记(二)——MATLAB基础知识

    MATLAB系统环境 MATLAB操作界面的组成 采用与office 2010相同风格的操作界面 gt gt 命令提示符表示MATLAB处于准备状态 xff1a 续行符 MATLAB的搜索路径 gt gt clear 清除工作区的全部变量
  • SVN的日常使用

    1 已经加入ignore的文件夹 xff0c 解除方法 xff1a 直接到被ignore的位置 xff0c 执行 xff1a svn add lt 你被ignore的文件名 gt no ignore no ignore是取消忽略 如果是ad
  • RM遥控器接收程序的分析

    由遥控器接收分析串口与DMA RM的遥控器在使用的过程中在大体上可以分成两个部分 xff1a 信息的接收 与 信息的解析 xff0c 在信息的接收中主要用到了串口的空闲中断和DMA双缓冲区接收在本篇的信息接收部分主要根据RM官方给出的代码来
  • robomaster麦轮运动解算

    1 资源与代码 1 1 参考文章 本文主要参考的三篇文章如下 xff1a 麦轮运动特性分析 xff1a https mp weixin qq com s biz 61 MzI3MTIyMjQwNQ 61 61 amp mid 61 2247
  • FreeRTOS内核——任务与任务切换

    2 任务 相关函数 1 xTaskCreateStatic 2 prvInitialiseNewTask 3 prvInitialiseTaskLists 4 vTaskStartScheduler 5 xPortStartSchedule
  • FreeRTOS应用——任务

    12 任务 12 1 相关函数 12 1 1 任务创建函数与启动调度 12 1 1 1 xTaskCreateStatic 静态创建任务 if configSUPPORT STATIC ALLOCATION 61 61 1 TaskHand
  • FreeRTOS应用——消息队列

    13 消息队列 消息队列是一种常用于任务键通信的数据结构 xff0c 队列可以在任务与任务间 中断与任务间传递信息 xff0c 实现了任务接收来自其他任务或者中断的不定长数据 任务能从队列中读取信息 xff0c 当队列中的消息为空时 xff
  • RoboMaster电机驱动

    1 硬件 1 1 电机 RM有很多不同型号的电机 xff0c 不同型号的电机有它不同的用途 xff0c 但是以用途分类的话主要是分成两种电机 xff1a 用来精准控制位置的电机 xff0c 在RM中的主要是云台电机 RM官网上的云台电机只有
  • 数据结构——校园导游系统

    校园导游系统 1 要求 大二下学期修了数据结构这门课 xff0c 课设的要求是做一个校园导航系统 详细的要求如下 问题描述 xff1a 当我们参观校园时 xff0c 会遇到如下问题 xff1a 从当前所处位置去校园另外一个位置 xff0c
  • 平衡小车实现

    平衡小车 1 前期准备 1 1 I2C通讯协议 在与MPU6050进行数据的读取时需要用到I2C通讯协议来进行通信 物理层 IIC一共有只有两个总线 xff1a 一条是双向的串行数据线SDA xff0c 一条是串行时钟线SCL SDA Se
  • 关于STM32CubeMX生成不了Keil代码的解决办法

    关于STM32CubeMX生成Keil代码时弹出but MDK ARM project generation have a problem的问题 有两种可能 xff1a 1 输出路径或文件名包含中文 2 Java环境版本不匹配 下载 xff
  • 2020电赛D题绕组飞行器

    在准备电赛的过程中 xff0c 做了一下去年的题 xff0c 本文将介绍我的方案及部分代码 xff0c 希望可以帮助到大家 一 我的装备 由于初学飞控所以主控用的是匿名的拓空者 xff0c 还有匿名的光流传感器 xff0c 北醒的激光雷达
  • nuxtjs常见问题

    1 在服务器端部署 xff0c 需要再服务器端安装node modules 2 本地忽略 nuxt文件夹 xff0c 这个需要在服务器端上执行npm run build生成 xff0c 然后执行 pm2 start npm name 34
  • Ubuntu学习笔记:sudo:vim:command not found

    Ubuntu学习笔记 xff1a sudo xff1a vim xff1a command not found 完成 xff01
  • Ubuntu学习笔记:查看所有用户

    Ubuntu学习笔记 xff1a 查看所有用户 输入 cat etc passwd cut f 1 d 注意 xff01 结尾有一个 xff1a 效果如下 xff1a
  • Ubuntu学习笔记:cd命令

    Ubuntu学习笔记 xff1a cd命令 命令顺序 xff1a 创建一个名为aaa的文件夹 进入指定文件夹 返回上一级文件夹 进入指定文件夹 返回上一级文件夹 退回上一次操作的文件夹 显示上一次操作的文件夹所在的路径 退回多级文件夹 退回
  • Ubuntu学习笔记:swapon 失败:设备或资源忙

    swapon 失败 xff1a 设备或资源忙 用命令swapoff xff0f 交换分区 将交换分区停止 然后再用swapon命令重新加载即可
  • Ubuntu学习笔记:使用命令查看当前登录系统的用户信息

    Ubuntu学习笔记 xff1a 使用命令查看当前登录系统的用户信息 1 查看当前登录的用户名 2 查看当前登录的用户名 终端类型 时间 IP地址 3 服务器连接的所有用户及正在使用的进程 4 显示系统中有哪些使用者正在上面 xff0c 显
  • Ubuntu学习笔记:使用命令查看系统资源,内存使用情况

    Ubuntu学习笔记 xff1a 使用命令查看系统资源 xff0c 内存使用情况 方法1 打开资源管理器 资源 gnome system monitor 方法2 top命令 方法3 下载htop apt get install htop h

随机推荐

  • Ubuntu学习笔记:使用命令修改 root 用户的密码

    Ubuntu学习笔记 xff1a 使用命令修改 root 用户的密码 Ubuntu 每次开机都有一个随机的新的 root 密码 在不知道密码的情况下 xff0c 要重新修改root密码 方法 xff1a sudo passwd 输入用户登录
  • C语言的特点

    1 语言简洁 紧凑 xff0c 使用方便 灵活 xff1b 2 运算符丰富 xff1b 3 数据类型丰富 xff1b 4 具有结构化的控制语句 xff08 例如if else语句 while语句 do while语句 switch语句和fo
  • Win11 更新绕过TPM2.0 方法 最新最简单 亲测有效 Win11系统更新 DEV方式

    最新的win11内测把不符合硬件规定的人都排除出去了 xff0c 虽然有注册表导入可以挤到DEV通道 xff0c 不过在更新到8 会弹出显示设备不支持提示 xff0c 关闭窗口后升级被取消 因此特在实践后教大家如何绕过TPM2 0 更新的方
  • iview常见问题

    1 radio组 label如果为字符串可以默认选中 xff0c 如果为数字 xff0c 却没有反应 答 xff1a label为数字时 xff0c 需要在label前加 xff1a 来绑定 xff0c 这样就可以实现默认选中了
  • 【通信协议】IIC通信协议详解

    IIC的基本介绍 IIC总线的发展 xff1a 芯片间总线 xff08 Inter Interface Circuit xff0c IIC xff09 xff0c 是应用广泛的芯片间串行扩展总线 目前世界上采用的IIC总线一共有两个规范 x
  • 【通信协议】单总线协议详解——以DHT11为例

    单总线概述 1 单总线的介绍 xff08 1 xff09 单总线也称为1 Wire bus xff0c 它是由美国DALLAS xff08 达尔斯 xff09 公司推出的外围串行扩展总线 单总线系统中配置的各种器件 xff0c 由DALLA
  • 【STM32学习笔记】(4)—— STM32工程文件详解

    STM32工程文件构成 从下图可以看出我们的工程目录是由CORE OBJ STM32F10x FWLib USER SYSTEM以及HARDWARE文件夹组成的 此外还有一个文本文档README TXT 以及一个Windows 批处理文件
  • 【STM32学习笔记】(6)—— 跑马灯实验详解

    跑马灯实验 在前面五篇STM32学习笔记中 xff0c 我们已经初步认识了STM32芯片 xff0c 并且了解STM32的常用寄存器 xff0c 介绍了STM32的GPIO模式 xff0c STM32工程文件 xff0c 以及最终讲解了如何
  • 【STM32学习笔记】(9)——串口通讯(USART)详解

    本文主要参考了野火的零死角玩转STM32和正点原子的STM32F1 开发指南 V1 1 xff08 精英板 库函数版本 xff09 xff0c 文章中大部分知识都是从两本书中提取出来 xff0c 串口通信协议的知识主要参考野火的书籍 xff
  • 【STM32学习笔记】(12)——NVIC(嵌套向量中断控制器)详解

    NVIC xff08 嵌套向量中断控制器 xff09 简介 在讲如何配置中断优先级之前 xff0c 我们需要先了解下 NVIC NVIC 是嵌套向量中断控制器 xff0c 控制着整个STM32芯片中断相关的功能 xff0c 它跟Cortex
  • 【STM32学习笔记】(15)——窗口看门狗(WWDG)详解

    窗口看门狗 WWDG 概述 窗口看门狗通常被用来监测 xff0c 由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障 除非递减计数器的值在T6位变成0前被刷新 xff0c 否则看门狗电路在达到预置的时间周期时 x
  • 【元器件学习笔记—电阻】(6)——电阻并联电路

    电阻串联和并联电路 任何复杂的电路经过各种等效和简化后都可以归纳为两种电路 xff1a 一是串联电路 xff0c 二是并联电路 电阻并联电路 并联电路与串联电路是完全不同的电路 xff0c 它们之间不能相互等效 xff0c 并联电路的一些特
  • 【元器件学习笔记—电阻】(7)——电阻串并联电路

    电阻串并联电路 电阻串并联电路是电阻串联电路与电阻并联电路的组合电路 下图所示是由 3 只电阻器构成的电阻器串并联电路 电路中的电阻 R1 和 R2 并联 xff0c 然后再与电阻 R3 串联 xff0c 这就是纯电阻的串并联电路 纯电阻器
  • 【元器件学习笔记—电阻】(8)——电阻分压电路

    电阻分压电路 电阻分压电路工作原理 下图所示是典型的电阻分压电路 xff08 没有接入负载电路 xff09 xff0c 电阻分压电路由 和 两只电阻构成 电路中有电压输入端和电压输出端 1 电路结构 输入电压 加在电阻 和 上 xff0c
  • 小程序验证手机号和身份证号码

    if isPhone params mobile Toast content 39 请填写正确的手机号 39 type 39 error 39 return false var idCardMsg 61 identityIDCard par
  • 神州战神笔记本清灰+换硅脂-记录

    文章目录 Introduction拆清灰涂抹硅脂安装开机测试 Introduction 笔记本购买于2020年4月份左右 xff0c 至今已使用2年半时间 CPU是i7 9750H xff0c 基准频率是2 6GHz 用control ce
  • 【PADS VX2.4下载与安装】

    PADS VX2 4下载与安装 电脑 xff1a Windows10 64bit 一 下载地址 链接 xff1a https pan baidu com s 1yTAU5Hymrc1i8MhALwbsrA 提取码 xff1a hljd 二
  • 【FreeRTOS】详细讲解FreeRTOS中消息队列并通过示例讲述其用法

    讲解FreeRTOS中消息队列及其用法 使用消息队列的原因消息队列函数解析示例遇到的问题 使用消息队列的原因 在裸机系统中 xff0c 两个程序间需要共享某个资源通常使用全局变量来实现 xff1b 但在含操作系统 下文就拿FreeRTOS举
  • 【FreeRTOS】详细讲解FreeRTOS里中断管理并通过示例讲述其用法

    文章目录 中断函数解析FreeRTOS中断使用示例 中断 大家看到中断后 xff0c 有没有想到一个名词 异常呢 xff1f 若大家想到了 xff0c 但是记不起相关概念 xff1b 或者是 xff0c 大家没想到这个名词 xff0c 没关
  • 【嵌入式软件开发实习】个人面试记录及其总结(一)

    文章目录 问题一 xff1a 使用宏定义完成两个数据的交换问题二 xff1a 制作一个函数接口判断函数参数输入是否符合要求 xff0c 如果符合要求就返回部分输入 xff0c 如果不符合就返回no result问题三 xff1a 什么是结构