自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 海康威视嵌入式软件一面(技术面)

【C语言基础】野指针与空指针_野指针和空指针-CSDN博客。

2023-11-12 10:34:25 574 1

原创 static和const的作用

值得注意的是虽然局部变量的声明周期得到了很大的提升,但他的作用域没有发生任何的改变,还是只能在那个局部的范围内使用。1.可以用来修饰变量,修饰函数参数,修饰函数返回值,且被const修饰的东西,都受到强制保护,可以预防其它代码无意识的进行修改,从而提高了程序的健壮性(是指系统对于规范要求以外的输入能够判断这个输入不符合规范要求,并能有合理的处理方式。4.编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

2023-11-10 10:22:40 171

原创 编写strcpy函数(C++)

char*

2023-11-09 17:10:49 145

原创 嵌入式软件面试常考问题汇总(持续更新)

2.static和const。

2023-11-03 16:06:04 120

原创 浙江杭州华诺康笔试(嵌入式软件)【C++】

一、选择题1.2.输出结果为123.3.以下错误的行为是DA. std:cout

2023-10-29 16:16:41 81

原创 牧原二面(技术面)【C语言问题偏多】

牧原共三面,二面为技术面,应聘的岗位为屠宰事业部嵌入式软件方向,主要问到项目经历和C语言基础知识偏多。

2023-10-17 16:20:14 568 6

原创 一道快速排序结合二分法查找的算法题(综合易考)

在校招笔试时曾看见一道题目比较综合的关于排序的编程题,从动态分配数组到使用快速排序对数组进行排序再到使用二分法查找给定数字,到最后释放数组内存。感觉全方面考察了创建数组、排序、查找的相关知识点,遂记录下来。

2023-10-15 11:56:32 66

原创 一文吃透常见通讯协议(SPI、IIC、UART、CAN)[面试重点]

主机输入,从机输出(数据来自从机);主机输出,从机输入(数据来自主机);SCLK串行时钟信号,由主机产生发送给从机;SS片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。其他制造商可能会遵循其他命名规则,但是最终他们指的相同的含义。以下是一些常用术语;MISO也可以是SIMO,DOUT,DO,SDO或SO(在主机端);MOSI也可以是SOMI,DIN,DI,SDI或SI(在主机端);NSS也可以是CE,CS或SSEL;SCLK也可以是SCK;

2023-09-27 00:07:25 7486

原创 计算机网络体系

开放式系统互联(Open System Interconnect)OIS体系结构是一个理想化7层协议。从上到下分别为7应用层、6表示层、5会话层、4运输层、3网络层、2数据链路层、1物理层。OSI实现复杂运行效率低,最终市场没用采用它。

2023-09-25 11:34:39 43

原创 C++容器

2023-09-24 12:16:35 35

原创 虚短和虚断是什么,有什么条件要求

首先我们需要了解几个概念。

2023-09-24 11:26:30 1033

原创 数据结构之——常见排序算法(面试重点)

走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。例如升序排序:首位1号数据与2号数据比较,若1号数据比2号数据大则调换两数据位置,否则位置不变。再比较2号数据与3号数据的大小,若2号数据比3号数据大则调换两数据位置,否则位置不变。这个算法的名字由来是因为越小(大)的元素会经由交换慢慢“浮”到数列的顶端。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

2023-09-22 01:24:11 90

原创 FreeRTOS中的队列特点

如果使用全局变量,兔子(任务 1 )修改了变量 a ,等待树獭(任务 3 )处理,但树獭处理速度很慢,在处理数据的过程中,狐狸(任务 2 )有可能又修改了变量 a ,导致树獭有可能得到的不是正确的数据。队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任务间传递信息。队列中可以存储有限的、大小固定的数据项目。采用实际值传递,即将数据拷贝到队列中进行传递,也可以传递指针,在传递较大的数据的时候。数量叫做队列的长度,创建队列的时候会指定数据项目的大小和队列的长度。

2023-09-19 11:49:59 51 1

原创 场效应管和MOS管的区别

当金属电极施加电压时,可以改变绝缘层内的电场分布,从而改变半导体通道内的电荷密度,最终影响到通道内的电流大小。NMOS的半导体通道为N型半导体,绝缘层为氧化物,金属电极为N型半导体的源极和漏极,当金属电极施加正电压时,绝缘层内的电场会吸引N型半导体通道内的电子向漏极方向移动,形成电流;PMOS的半导体通道为P型半导体,绝缘层为氧化物,金属电极为P型半导体的源极和漏极,当金属电极施加负电压时,绝缘层内的电场会吸引P型半导体通道内的空穴向漏极方向移动,形成电流。1.场效应管的主要部分由通道、源极和漏极组成。

2023-09-19 10:46:21 2678

原创 三极管和场效应管的区别

总结了三极管和场效应管的区别

2023-09-19 10:29:19 523

原创 二极管常见作用总结

总结了二极管的基本类别和常见作用

2023-09-19 10:26:44 417

原创 字节对齐(内存对齐)

现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但是实际的计算机系统对基本类型数据在内存中存放的位置有限制,计算机并非逐个字节读取,而是以2、4、8的倍数字节块读取内存,它们会要求这些数据的首地址的值是某个数是k(通常是4或8)的倍数 ,这就是所谓的内存对齐。3、减少 cpu 访问数据的出错性(有些 cpu 必须内存对齐,否则指针访问会出错),不同硬件平台进行数据通信,数据对齐可能会不一致,需要加入伪指令进行操作,防止灾难性性bug。为什么需要字节对齐?

2023-09-18 21:14:14 56

原创 数据结构之链表(定义、作用、分类、代码实现、优缺点)

链表主要分为单链表、双链表、循环链表、静态链表。

2023-09-18 14:51:10 606

原创 静态变量和全局变量区别

(4)静态全局变量也具有全局作用域,他与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。它只被初始化一次,自从第一次初始化直到程序与你新内阁结束都一直存在,他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。(3)局部变量也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用结束后,变量就被撤销,其所占用的内存也被收回。

2023-09-16 16:29:11 298

原创 9.16长川科技(二面技术面)

自我介绍(balabala)

2023-09-16 14:38:45 350 4

原创 原、反、补码

1-1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]补+ [1111 1111]补= [1 0000 0000]补=[0000 0000]补=[0000 0000]原注意:进位1不在计算机字长里。1 - 1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]反+ [1111 1110]反= [1111 1111]反= [1000 0000]原= -0。计算十进制的表达式: 1 - 1 = 0。

2023-09-12 10:02:46 182 1

原创 一文吃透IIC通信协议

5、当主机收到应答信号后,主机要改变通信模式(主机将由发送变为接收,从机将由接收变为发送)所以主机重新发送一个开始start信号,然后紧跟着发送一个从机地址,注意此时该地址的第8位为1,表明将主机设置成接收模式开始读取数据;2、然后发送一个从机地址,这个地址共有7位,紧接着的第8位是数据方向位(R/W),“0”表示主机向从机发送数据(写),“1”表示主机从从机接收数据(读);6、这时候主机等待从机的应答信号,当主机收到应答信号时,就可以接收1个字节的数据,当接收完成后,主机发送非应答信号(

2023-09-12 09:42:02 552 2

原创 堆与栈的区别

堆则是C函数库提供的,它的机制很复杂,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大的空间,如果没有足够大的空间(可能是由于内存碎片太多),就有需要操作系统来重新整理内存空间,这样就有机会分到足够大小的内存,然后返回。栈的分配和释放是由编译器完成的,栈的动态分配由alloca()函数完成,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行申请和释放的,无需手工实现。栈的增长方向是向下的,即向着内存地址减小的方向。(1)管理方式不同。

2023-09-02 10:21:32 81

原创 C语言中内存分配的几种方式

由编译器自动分配和释放,在程序编译的时候就已经分配好内存,这块内存在程序的整个运行期间都存在,直到整个程序运行结束时才被释放,如全局变量与静态变量。从栈上分配,其作用域只是在局部函数内,在定义该变量的函数内,只要出了该函数,该局部变量就不再起作用,也即该变量的生命周期和该函数同在。同样由编译器自动分配和释放,在函数执行时,函数内部的局部变量都可以在栈上创建,函数执行结束时,这些存储单元将被自动释放。(需要注意的是,栈内存分配运算内置于处理器的指令集中,它的运行效率一般很高,但是分配的内存容量有限。

2023-09-02 09:51:45 447

原创 那一夜,内存分区知识永远进入了我的脑子

静态变量是在程序运行期间始终存在的变量,其内存空间在程序开始时就被分配好了,直到程序结束时才被释放。已初始化且不为零的全局变量是指在定义时已经赋值的全局变量,而不是在程序运行时才赋值的变量。堆空间是向上增长的,也就是说,堆顶的地址是越来越大的。因此,常量段的数据是只读的,不能在程序运行期间修改它们的值。栈空间是由操作系统自动分配和回收的,它的大小通常是固定的,不能随意增加。栈空间是向下增长的,也就是说,栈顶的地址是越来越小的。需要注意的是即使是初始化了,但初始化的是0,还是放在BSS区!

2023-08-04 17:22:29 143 1

原创 使用sizeof计算数组相关大小

sizeof(数组名):数组名表示整个数组,所以计算的是整个数组的大小sizeof(&数组名):取出的是整个数组的地址,所以计算的是地址大小除上述两种情况外,所有数组名都是数组首元素的地址

2023-07-07 09:41:44 2662 1

原创 关于int (*cmp)(const void* e1, const void* e2)中的(char*)base+j*width

通过(char*)base+j*width的形式可以很好找到两个内容的地址,转换成char*是因为其偏移大小为1所以代码的兼容性更好,如果要比较的是char类型那么width是1,如果是int类型那么width是4,如果要是doule类型那么width是8。但是强制转换成int*的话,如果要比较的是char类型那么width需要是1/4,如果是int类型那么width需要是1,如果要是doule类型那么width需要是2。在不知道这两个指针的类型的前提下如何找到实现两个地址中内容的比较。

2023-06-30 11:57:58 75

原创 stm32f103zet6移植c8t6

stm32F103ZET6移植到stm32F103C8T6的步骤_stm32f103zet6程序移植c8t6_小杰的电信日常的博客-CSDN博客

2023-06-27 17:02:32 269 1

原创 一文搞定函数指针数组和函数数组指针

函数指针数组和函数数组指针。

2023-06-26 16:55:55 57 1

原创 关于void (* signal ( int, void ( * ) ( int ) ) ) ( int )

signal先和()结合,说明signal是一个函数名 signal函数有两个参数,第一个参数的类型是int,第二个参数的类型是函数指针(该函数指针指向一个参数是int,返回值是void的函数) signal函数的返回类型也是一个函数指针(该函数指针指向一个参数是int,返回值是void的函数) 综上所述,signal是一个函数的声明

2023-06-26 10:58:09 189 1

原创 关于(* ( void ( * ) ( ) ) 0 ) ( )

2.( void ( * ) ( ) ) 0 :对0进行强制类型转换,被解释为一个函数地址。4.( * ( void ( * ) ( ) ) 0 ) ( ) :调用0地址处的函数。3.*( void ( * ) ( ) ) 0 :对0地址进行解引用操作。1.void ( * ) ( ) :是函数指针类型。此代码的意义是调用0地址处的函数。该函数无参,返回类型是void。

2023-06-26 10:16:59 91 1

原创 算法的时间复杂度

常对幂指阶。

2023-06-21 20:29:21 37 1

原创 关于%d,%02d的输出问题

原文链接:https://blog.csdn.net/weixin_64634186/article/details/123459291。总结:无论哪种表示方法如果我们定义的整数的位数大于我们想输出的数字的位数,输出时仍然 是我们定义的数字。4. %m.n表示我们输出的数字一共占m个位数,小数点后占n个。

2023-06-17 17:20:51 70 1

原创 对STM32所用位带操作宏的详细剖析

所以展开成为如下的语句,不要晕倒哦,*((volatile unsigned long *)((GPIOA_ODR_Addr & 0xF0000000)+0x2000000+((GPIOA_ODR_Addr &0xFFFFF)

2023-06-17 15:49:40 149 1

原创 指针数组和数组指针

C语言—指针数组与数组指针_指针数组和数组指针_竹北1998的博客-CSDN博客

2023-06-09 20:17:51 41 1

原创 const在不同的位置

对于1和2来说,对于const在*左边,表示的是a指向的内容是不能改变的,但是指针是可以改变的。对于3来说,const在*右边,表示的a的指针是不能变的,但是指针的内容是可以变的。第二个表示这个函数是只读的函数,函数里面的成员数据不能改变,只能读取。对于4来说,指针指向的地址不能变,并且地址里面装的东西也不能够变化。第一个const表示的是函数返回值是const类型的,返回的是常量。

2023-06-09 15:26:08 169 1

原创 字符串常量与字符数组的区别

总结:C语言有两种表示字符串的方法,一种是字符数组,另一种是字符串常量,它们在内存中的存储位置不同,使得字符数组可以读取和修改,而字符串常量只能读取不能修改。原文链接:https://blog.csdn.net/qq_43353179/article/details/109353528。

2023-06-08 20:23:25 114 1

原创 new/delete与malloc/free的区别

new做两件事,一是分配内存,二是调用类的构造函数;new建立的对象可以用成员函数访问,不要直接访问它的地址空间;malloc分配的是一块内存区域,用指针访问,可以在里面移动指针。malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常。new、delete是C++中的操作符,malloc和free是标准库函数。,并且可以自动计算所申请内存的大小。new建立的是一个对象,而malloc分配的是一块内存。new申请的空间会初始化,而malloc不会初始化。

2023-06-06 16:01:21 283

原创 C/C++程序内存分布情况

已初始化且不为零的全局变量是指在定义时已经赋值的全局变量,而不是在程序运行时才赋值的变量。BSS区(bss segment):存放未初始化的全局变量和静态变量的区域,该区域的值默认初始化为0。即使是初始化了,但初始化的是0,还是放在BSS段!因此,常量区的数据是只读的,不能在程序运行期间修改它们的值。这些常量的值在程序运行期间不会被改变,因此它们被存放在内存的只读区域,以保证它们的值不会被意外修改。数据区(data segment):存放已经初始化的全局变量和静态变量(包括全局和静态变量的指针)的区域。

2023-06-04 16:28:37 114 1

原创 linux嵌入式常见面试问题(持续更新)

DMA(直接内存访问)是一种通过硬件控制器直接访问内存的方式,而不需要CPU的干预。在串口通信中,采用DMA方式可以减少CPU的负担,提高数据传输的效率。为了提高吞吐量,需要对DMA传输的数据进行解析。具体来说,需要对接收到的数据进行缓存,然后在空闲时对缓存中的数据进行解析。可以采用中断机制来触发解析过程,或者使用定时器来定期解析数据。在解析数据时,可以采用多线程或者多任务的方式,将数据分成多个部分进行解析,从而提高解析的速度和效率。

2023-06-04 16:25:56 1198 1

空空如也

空空如也

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

TA关注的人

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