- 博客(64)
- 收藏
- 关注
原创 物联网嵌入式面试题集锦
目录C++语言篇 11、谈谈你对命名空间的理解 12、谈谈指针和引⽤的区别 13、谈谈你对内联函数的理解 14、谈谈函数的重载条件 15、谈谈c与c++中struct的不同点 26、如何理解c++的封装性 27、谈谈你对c++构造与析构的理解 28、构造函数的分类 29、构造函数的调⽤规则 210、谈谈你对浅拷⻉与深拷⻉的区别 311、谈谈啥叫对象成员以及对象成员的构造函数调⽤⽅式 312、谈谈你对explicit的理解 313、谈谈c中malloc.
2020-07-15 09:41:16 9508 20
原创 MM-Camera架构-ProcessCaptureRequest 流程分析
func:mm_stream_map_buf,func:mm_camera_util_s_ctrl,以及每一帧结束后的func:mm_stream_unmap_buf。mm_camera_load_shim_lib里面dlopen:libmmcamera2_mct_shimlayer.so。从日志看,每次captureRequest,mct_shimlayer_process_event会被调用两次,cmd_type分别是CAM_SHIM_REG_BUF和CAM_SHIM_SET_PARM。
2023-10-07 16:34:32 1300
原创 MM-Camera架构-Preview 流程分析
cpp_init_mem() : 其实就是获取cpp_dev->iommu_hdl,这个东西是在msm_cam_smmu设备driver中统一管理的,vfe中有记录过这里。cpp_init_hardware():设置一些硬件参数、时钟、注册中断以及buf管理接口:msm_cam_buf_mgr_register_ops()这里的是CPP_HW_CMD_SUBSCRIBE_EVENT即cpp_hardware_subcribe_v4l2_event。是将当前的文件指针挂到等待队列中。这个的原理应该一样。
2023-10-07 16:33:57 964
原创 MM-Camera架构-Open 流程分析
整个Camera Open 过程总结如下:Java APP 层调用 Frameworks 层 Camera.java 中的 open() 方法,在open camera 后,才开始调用对应的 getParameters(),setParameters(), startPreview() 等 函数,这些后续分析Frameworks 层 Camera.java 中的 open()(1) 在Camera open() 函数中,如果没有指定open 对应的camera id,则默认打开后摄。
2023-10-07 16:33:02 1561
原创 MM-Camera架构-驱动代码架构
高通的camera驱动架构设计大致的原理如此:将camera的所有功能划分为不同的模块,让模块自己来决定自己的事情(高内聚,低耦合),模块需要有统一的接口和格式。模块中有端口,通过端口把模块连接起来,又把模块挂在总线上。每一个端口的连接就是一个流,把这些流用pipeline来管理。每次启动一个camera就创建一个,由这个来管理此camera的一切事物。对于每一个,模块是共享的,它可以是camera的硬件资源也可以是其它资源(如一些软件算法等资源)。
2023-10-07 16:31:15 408
原创 Linux下的I2C工具:i2c_tools
i2cdetect命令是一个Linux下的I2C工具,用于扫描I2C总线并列出存在的I2C设备地址。它通常安装在i2c-tools软件包中。i2cdetect-l模式和-y模式。-l命令用于列出系统中所有可用的I2C总线。在Linux系统中,I2C总线通常表示为/dev/i2c-*设备节点,其中是数字,表示I2C总线的编号。该命令会列出每个I2C总线的编号和适配器类型。-y命令用于扫描指定的I2C总线,列出该总线上存在的有效I2C设备地址。其中-y选项表示以非交互方式运行I2C探测命令。
2023-06-11 21:35:20 3597
原创 STM32基于库函数新建工程模板
这里我们的 CORE 下面需要添加的文件为 core_cm3.c,startup_stm32f10x_hd.s (注意,默认添加的时候文件类型为.c,也就是添加 startup_stm32f10x_hd.s 启动文件的时候,你需要选择文件类型为 All files 才能看得到这个文件),USER 目录下面需要添加的文件为 main.c,stm32f10x_it.c,system_stm32f10x.c.这里,我们可以把两个文件夹删除,我们会在下一步骤中新建一个 OBJ 文件夹,用来存放编译中间文件。
2023-06-11 21:27:31 1220
原创 adb logcat > *txt以后,这份txt文件每行后边都会空一行
Windows系统中的每行都以两个字符结尾,即\r\n(回车符+换行符),而Linux系统中的每行只以一个字符结尾,即\n(换行符)。因此,您可以使用文本编辑器打开输出的文本文件,并将其另存为一个新文件,选择使用Linux的行结束符(即\n)即可解决该问题。在许多文本编辑器中,您可以在保存文件时选择“Unix(LF)”选项,这将在保存时将行结束符转换为Linux风格的换行符。
2023-05-11 19:03:05 273 1
原创 系统信息:uname,sysinfo,gethostname,sysconf
在应用程序当中,有时往往需要去获取到一些系统相关的信息,譬如时间、日期、以及其它一些系统相关信息,本文将向大家介绍如何通过 Linux 系统调用或 C 库函数获取系统信息,譬如获取系统时间、日期以及设置系统时间、日期等;除此之外,还会向大家介绍 Linux 系统下的/proc 虚拟文件系统,包括/proc 文件系统是什么以及如何从/proc 文件系统中读取系统、进程有关信息。
2023-04-02 11:17:27 1625
原创 C语言位域
struct 位域结构名位域列表元素描述type只能为 int(整型),unsigned int(无符号整型),signed int(有符号整型) 三种类型,决定了如何解释位域的值。位域的名称。width位域中位的数量。宽度必须小于或等于指定类型的位宽度。带有预定义宽度的变量被称为位域。上面的结构定义指示 C 编译器,age 变量将只使用 3 位来存储这个值,如果您试图使用超过 3 位,则无法完成。int a : 8;int b : 2;
2023-02-01 22:09:29 250
原创 C头文件相互包含
若hello.c文件中用到其他文件中的内容,比如yebo.h,则hello.h文件把用到的头文件yebo.h包含进来就可以了。正确的做法是:应该秉承.c文件对应的.h文件只包含头文件里用到的其它文件的头文件,任何非必须的.h文件不要包含;此时应该将其中一个头文件拆成两个头文件b1.h、b2.h,b1.h让原来的a.h包含;修改a.h、b.h两个文件,main.c文件内容不变。假若头文件a包含了头文件b、头文件b又包含了头文件a,那么在#include头文件a的时候,就可能会导致递归包含,从而导致编译出错;
2023-02-01 22:07:22 2997 1
原创 C函数指针与回调函数
实例中 populate_array() 函数定义了三个参数,其中第三个参数是函数的指针,通过该函数来设置数组的值。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。简单讲:回调函数是由别人的函数执行时调用你实现的函数。size_t 在stddef.h头文件中定义。
2023-02-01 22:07:05 319
原创 Shell从入门到...
我们已经能够熟练的在终端中输入命令来完成一些常用的操作,但是我们都是一条一条输入命令。这样会很麻烦,那么有没有一种方式可以将很多条命令放到一个文件里面,然后直接运行这个文件即可?肯定有,这个就是shell脚本!shell脚本类似windows的批处理文件,shell脚本就是将连续执行的命令写成一个文件。shell脚本提供数组、循环、条件判断的等功能。shell脚本一般是Linux运维或者系统管理员要掌握的,作为嵌入式开发人员,只需要掌握shell脚本最基础的部分即可。
2023-01-14 21:06:48 863
原创 Android Makefile文件:Android.mk写法
LOCAL_ASSET_FILES 在Android.mk文件中编译应用程序(BUILD_PACKAGE)时设置此变量,表示资源文件,通常会定义成LOCAL_ASSET_FILES += $(call find-subdir-assets)LOCAL_FORCE_STATIC_EXECUTABLE 如果编译的可执行程序要进行静态链接(执行时不依赖于任何动态库),则设置LOCAL_FORCE_STATIC_EXECUTABLE:=true。文件系统的其它部分还没有加载,所以必须进行静态链接。
2023-01-14 18:30:05 1212
原创 Makefile从入门到....
和我一起写Makefile(作者:陈皓)百度网盘链接: https://pan.baidu.com/s/14LQAHtu-GZb7pE7EI6p2VA 提取码: qwer
2023-01-14 18:20:35 3900 1
原创 004_步进电机实验
• 步距角:一个脉冲信号所对应的电机转动的角度,可以简单理解为一个脉冲信号驱动的角度,电机上都有写,一般 42 步进电机的步距角为 1.8°。上图是两相同时通电的旋转顺序,与单相激励不同的是,单相通电后被固定在了与定子正对着的绕组极性,但是双相同时激励时转子却被固定在两个绕阻的。相步进电机就是单极性的步进电机,图中的红色箭头为电流的走向,四根线的电流走向汇总到公共线,所以称之为单极性电机;中线圈的组数,其中两相步进电机步距角为 1.8°,三相的步进电机步距角为1.5°,相数越多的步进电机,其步距角就越小。
2022-11-16 21:58:33 1144
原创 003_IO 扩展(串转并)-74HC595
74HC595 是一个 8 位串行输入、并行输出的位移缓存器,其中并行输出为三态输出(即高电平、低电平和高阻抗)。芯片管脚及功能说明如下:上面两张都是 74HC595 芯片管脚图,细心的朋友就会发现左侧的 1 脚是 QB,而右侧芯片的 1 脚是 Q1,左侧芯片的 11 脚是 SCK,而右侧芯片的 11 脚是 SH_CP,还有很多其他管脚不一样,其实这个都没有什么,每个人在绘制芯片管脚图时命名可能不一样而已,看一个芯片重点是管脚功能。15 和 1 到 7 脚 QA–QH:并行数据输出。
2022-11-12 16:48:46 1284
原创 002_矩阵按键
行列扫描法检测时,先送一列为低电平,其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行哪一列的,用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平,这样即可检测完所有的按键,当有键被按下时便可判断出按下的键是哪一个键。当然我们也可以将行线置低电平,扫描列是否有低电平。然后再翻转,使所有列线都为低电平,检测所有行线的值,由于有按键按下,行线的值也会有变化,记录行线的值。
2022-11-12 14:41:56 282
原创 001_独立按键
由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间的长短由按键的机械特性决定的,一般为 5ms 到 10ms。按键稳定闭合时间的长短则由操作人员的按键动作决定的,一般为零点几秒至数秒。按键抖动会引起按键被误读多次。为了确保 CPU 对按键的一次闭合仅作一次处理,必须进行消抖。按键消抖有两种方式,一种是硬件消抖,另一种是软件消抖。通过开发板上的独立按键 K1 控制 D1 指示灯亮灭。
2022-11-12 14:38:52 305
原创 000_数码管
上图电路实际上是动态数码管电路,使用的是 2 个四位一体的共阴数码管组成,即 8 位数码管的段选数据 a-dp 全部并联一起引出,每位数码管的位选即公共端引出。段选------选择LED的那个段码亮(a,b,c,d,e,f,g,dp);通过74HC254控制。位选------选择哪个LED亮(LED1~LED8);通过74HC138控制。
2022-11-12 14:36:09 497
原创 sizeof和strlen的区别及使用详解
为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C语言在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便,如有不理解的可以看看另外关于一篇内存对齐的博客。最后的sizeof计算的是指针(sizeof(char *)) 的大小,为8。,这是计算的结果不再是类型所占内存的大小,数组名就退化为指针了。了是类型所占空间的字节数,
2022-10-28 17:10:59 267
原创 exit()函数介绍
函数名: exit()所在头文件:stdlib.h功能: 关闭所有文件,终止正在执行的进程。用法格式:void exit(int status)exit() 是电脑函数exit() 通常是用在子程序中用来终结程序用的,使用后程序自动结束,跳回操作系统。exit(0) 表示程序正常退出exit⑴/exit(-1)表示程序异常退出。exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束。
2022-10-28 17:10:29 2535
原创 进程的概念以及进程的创建
并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。子进程所独有的只有它的进程号,计时器等。此外,在可剥夺的操作系统中,当有更高优先级的进程就 、 绪时,调度程度将正执行的进程转换为就绪状态,让更高优先级的进程执行。: 任何进程( 除 init 进程)都是由另一个进程创建,该进程称为被创建进程的父进程,对应的进程号称为父进程号(PPID)。
2022-10-28 17:09:56 5586
原创 exec函数
/系统环境变量 int execl(const char * path , const char * arg , . . . /* (char *) NULL */);(1)execl和execv这两个函数是最基本的exec,都可以用来执行一个程序,区别是传参的格式不同。execl是把参数列表(本质上是多个字符串,必须以NULL结尾)依次排列而成(l其实就是list的缩写),execv是把参数列表事先放入一个字符串数组中,再把这个字符串数组传给execv函数。
2022-10-27 15:57:33 735
原创 fork和vfork的区别
vfork用于创建一个新进程,而该新进程的目的是exec一个新进程,vfork和fork一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,不会复制页表。因为子进程会立即调用exec,于是也就不会存放该地址空间。不过在子进程中调用exec或exit之前,他在父进程的空间中运行。为什么会有vfork。
2022-10-27 15:57:03 2005
原创 巧用可变参数宏、编译器内置宏和printf输出调试信息
我们在写程序的时候,总是或多或少会加入一些printf之类的语句用于输出调试信息,但是printf语句有个很不方便的地方就是当我们需要发布程序的时候要一条一条的把这些语句删除,而一旦需要再次调试的时候,这些语句又不得不一条条的加上,这给我们带来了很大的不便,浪费了我们很多的时间,也造成了调试的效率低下。所以,很多人会选择使用宏定义的方式来输出调试语句。
2022-10-27 15:37:35 391
原创 select函数详解
使用select函数可以完成非阻塞方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况—— 读写或是异常 。非阻塞方式:non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生,则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高。select函数调用过程:由上图知,调用select函数需要一些准备工作,调用后还需要查看结果。select可以同时监视多个文件描述符(套接
2022-10-27 15:36:56 16442 3
原创 C语言time()函数的用法
此函数会返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数(即格林尼治时间1970年1月1日00:00:00到当前时刻的时长,时长单位是秒)。:localtime()将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm返回。将变量t2的地址作为实参传递给time()函数,函数自动把结果传递给t2,不需要额外的赋值语句。:成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于error中。
2022-10-27 15:35:27 27064 2
原创 c和cpp实现CPU核上绑定固定线程
刚开始接触cpu_set_t时,对_S系列接口有疑问,不明白它存在的意义,明明自己malloc一个cpu_set_t就可以,然后使用各种非_S对其操作,为什么非要有_S系列接口呢?这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。就是进程要在某个给定的CPU上尽量长时间的运行而不被迁移到其他处理器的倾向性。将当前的pid绑定到4,5,6,7核上(大核核超大核)cpu_set_t用来描述CPU的集合,被。设置线程亲和性,将线程绑定到指定CPU核。cpuset:CPU核的集合。
2022-10-27 15:34:00 2435
原创 队列之单向队列
队列,是一种数据结构。顾名思义,就是像排队一样。日常生活中,排队是常见的事情,买票要排队、打饭要排队、坐车要排队……这么细数,貌似任何事都要排队。队列,是特殊的线性表。因为单链表、双链表,以及顺序线性表,都是没有限制操作位置的,而队列却有这个限制。规定队列只能从一端插入,另一端删除。插入的一端称为队尾,删除的一端称为队头。也就是说,先进队的数据,先出队,后进的数据后出,即所谓的FIFO。这就是它的特殊之处。
2022-09-29 16:11:27 844 1
转载 Linux内核数据结构】最为经典的链表list
很久之前研读过Linux的内核源码,看到其中的内核数据结构,对链表的实现叹为观止,是迄今为止我见过的最为经典的链表实现(不是数据内嵌到链表中,而是把链表内嵌到数据对象中)。现在再来回顾这个经典的数据结构。链表代码在头文件中声明(推荐Source Insight,源码版本:Linux-2.6.32.61,早期版本并没有引进这个list),其数据结构很简单有木有,直接就一个前后链表指针,前篇STL中list也有这么个结构。
2022-09-22 14:13:30 341
原创 GPIO的工作方式/STM32八种IO口模式区别
如图所示,推挽放大器的输出级有两个“臂”(两组放大元件),一个“臂”的电流增加时,另一个“臂”的电流则减小,二者的状态轮流转换。对负载而言,好像是一个“臂”在推,一个“臂”在拉,共同完成电流输出任务。对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。(7)GPIO_Mode_AF_OD 复用开漏输出。(8)GPIO_Mode_AF_PP 复用推挽输出。(6)GPIO_Mode_Out_PP 推挽输出。
2022-09-19 21:51:39 1026
原创 Ubuntu 下 NFS 和 SSH 服务开启
等待安装完成,安装完成以后在用户根目录下(或者你自己的工作目录)创建一个名为“linux”的文件夹,以后所有的东西都放到这个“linux”文件夹里面,在“linux”文件夹里面新建一个名为“nfs”的文件夹,打开/etc/exports 以后在后面添加如下所示内容:/home/sundp/workspace/linux/nfs *(rw,sync,no_root_squash)上述命令安装 ssh 服务,ssh 的配置文件为/etc/ssh/sshd_config,使用默认配置即可。
2022-09-17 13:48:54 404
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人