自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 linux内核结构以及内核模块编程

主要记录了linux内核结构以及linux内核模块编程,并举例实现了一个简单的hello.ko的驱动程序

2023-04-12 20:01:52 773 1

原创 Linux下解压与压缩命令

本文主要是总结题主在学习与工作中使用到的Linux环境下解压与压缩命令,内容不算很全,但是囊括了大部分需求场景,如有误笔之处,还请同学指正。

2022-11-06 14:54:43 4370

原创 DMA编程

主要介绍了DMA编程的基础

2022-11-05 13:21:37 1551

原创 内存与IO访问函数实例

主要进行了内存与IO访问函数的实例

2022-11-04 09:38:27 282

原创 内存与IO访问原理

主要介绍内存与IO访问的一些基础知识和原理

2022-11-03 17:29:10 489

原创 mmap函数详解(what?why?how?)

主要对mmap函数进行了较为详细的介绍

2022-11-02 15:12:42 8219

原创 信号量与自旋锁的简单介绍

主要介绍信号量与自旋锁

2022-11-01 11:08:19 275

原创 嵌入式面试题(五、Linux操作系统)

五、Linux操作系统1、Linux内核的组成部分Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。2、Linux系统的组成部分Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。3、用户空间与内核通信方式有哪些?1)系统调用。用户空间进程通过系统调用进入内核空间,访问指定的内核空间数据;2)驱动程序。用户空间进程可以使用封装后的系统调用接口访问驱动设备节点,以和运行在内核空间的驱动程序通信;3)共享内存mmap。在代码中调用接口

2022-05-30 09:15:00 2335

原创 嵌入式面试题(四、常见算法)

四:常见算法1、插入排序基本思想:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。时间空间复杂度:算法适用于少量数据的排序,时间复杂度为O(n^2),空间复杂度为O(1),是稳定的排序方法代码实现public static void insertionSort(int[] array){ int tmp; for(int i=1;i<array.length;i++){

2022-05-30 07:15:00 737

原创 嵌入式面试题(三、网络编程)

三、网络编程1、TCP、UDP的区别TCP—传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。UDP—用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。1)TCP是面向连接的,UDP是面向无连接的2)UDP程序结构较简单3)TCP是面向字节流的,UDP是基于数据报的4)TCP保证数据正确性,UDP可能丢包5)TC

2022-05-29 20:00:00 777

原创 嵌入式面试题(二、C/C++)

二、C/C++1、new和malloc1)malloc和free是c++/c语言的库函数,需要头文件支持stdlib.h;new和delete是C++的关键字,不需要头文件,需要编译器支持;2)使用new操作符申请内存分配时,无需指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地支持所需内存的大小。3)new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无需进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void*,需要通

2022-05-29 15:41:26 1298

原创 嵌入式面试题(一:进程与线程)

一、进程与线程1、什么是进程、线程,有什么区别?进程是资源(CPU、内存等)分配的基本单位,线程是CPU调度和分配的基本单位(程序执行的最小单位)。同一时间,如果CPU是单核,只有一个进程在执行,所谓的并发执行,也是顺序执行,只不过由于切换速度太快,你以为这些进程在同步执行而已。多核CPU可以同一时间点有多个进程在执行。2、多进程、多线程的优缺点说明:一个进程由进程控制块、数据段、代码段组成,进程本身不可以运行程序,而是像一个容器一样,先创建出一个主线程,分配给主线程一定的系统资源,这时候就可以在主

2022-05-29 15:31:35 817

原创 Linux应用编程和网络编程(13、exec族函数及实战)

1、exec族函数及实战1.1、为什么需要exec函数(1)fork子进程是为了执行新程序(fork创建子进程后,子进程和父进程同时被OS调度执行,因此子进程可以单独的执行一个程序,这个程序宏观上将会和父进程程序同时进行 )(2)可以直接在子进程的if中写入新程序的代码。这样可以,但是不够灵活,因为我们只能把子进程程序的源代码贴过来执行(必须知道源代码,而且源代码太长了也不好控制),譬如说我们希望子进程来执行ls-la命令就不行了(没有源代码,只有编译好的可执行程序)(3)使用exec运行新的可执行

2022-04-26 17:33:05 935

原创 Linux应用编程和网络编程(12、waitpid介绍)

1、waitpid介绍1.1、waitpid和wait的区别(1)基本功能一样,都是用来回收子进程(2)waitpid可以回收指定PID的子进程(3)waitpid可以阻塞式或非阻塞式两种工作模式1.2、waitpid原型介绍(1)参数(2)返回值1.3、代码实例(1)使用waitpid实现wait的效果ret = waitpid(-1, &status, 0);-1表示不等待某个特定PID的子进程而是回收任意一个子进程,0表示用默认的方式(阻塞式)来进行等待,返回值ret是本

2022-04-22 15:53:28 132

原创 Linux应用编程和网络编程(11、父进程wait回收子进程)

1、父进程wait回收子进程1.1、wait的工作原理(1)子进程结束时,系统向父进程发送SIGCHILD信号(2)父进程调用wait函数后阻塞(3)父进程被SIGCHILD信号唤醒然后去回收僵尸子进程(4)父子进程之间是异步的,SIGCHILD信号机制就是为了解决父子进程之间的异步通信问题,让父进程可以及时的去回收僵尸子进程(5)若父进程没有任何子进程,则wait返回错误1.2、wait实战(1)wait的参数status。status用来返回子进程结束时的状态,父进程通过wait得到st

2022-04-21 13:54:13 1122

原创 Linux应用编程和网络编程(10、进程的诞生和消亡)

1、进程的诞生与消亡1、进程的诞生(1)进程0和进程1(2)fork(3)vfork2、进程的消亡(1)正常终止和异常终止(2)进程在运行时需要消耗系统资源(内存、IO),进程终止时理应完全释放这些资源(如果进程消亡后仍然没有释放相应资源则这些资源就丢失了)(3)Linux系统规定:每一个进程退出时,操作系统会自动回收这个进程涉及到的所有资源(譬如malloc申请的内容没有free时,当前进程结束时这个内存会被释放;再譬如open打开的文件没有close的在程序终止时也会被关闭)。但是操作系

2022-04-21 11:12:14 149

原创 Linux应用编程和网络编程(9、父子进程对文件的操作)

1、父子进程对文件的操作1.1、子进程继承父进程中打开的文件(1)上下文:父进程先open打开一个文件得到fd,然后在fork创建子进程,之后在父子进程中各自write向fd中写入内容(2)测试结论是:接续写。实际上本质原因是父子进程之间的fd对应的文件指针是彼此关联的(3)实际测试时,有时候会看到只有一个(hello或world),但是实际上不是。原因是本身程序太短,只需要在程序中假如sleep函数即可保证。#include <stdio.h>#include <sys/ty

2022-04-21 03:00:00 640

原创 Linux应用编程和网络编程(8、fork创建子进程)

1、fork创建子进程1.1、为什么要创建子进程(1)每一个程序的运行都需要一个进程(2)多进程实现宏观上的并行1.2、fork的内部原理(1)进程的分裂生长模式。如果操作系统需要一个新进程来运行一个程序,那么操作系统会用一个现有的进程来复制生成一个新进程。老进程叫父进程,复制生成的新进程叫子进程(2)fork函数调用一次会返回2次,返回值等于0的就是子进程,而返回值大于0的就是父进程(3)典型的使用fork的方法:使用fork后然后用if判断返回值,并且返回值大于0时就是父进程,返回值等于0

2022-04-20 21:44:15 597

原创 Linux应用编程和网络编程(7、进程概念)

1、程序的开始和结束1.1、main函数由谁调用(1)编译链接时的引导代码。操作系统下的应用程序其实在main执行前也需要先执行一段引导代码才能去执行main,我们写应用程序时不用考虑引导代码的问题,编译链接时由链接器将编译器中事先准备好的引导代码给链接进去和我们的应用程序一起构成最终的可执行程序。(2)运行时的加载器。加载器是操作系统中的程序,当我们去执行一个程序时(譬如.a/.out ,譬如代码中用exec族函数来运行),加载器负责将这个程序加载到内存中去执行这个程序。(3)程序在编译链接时

2022-04-20 20:37:30 1598

原创 秋招求职总结分享

前言博主是某211渣硕光学工程专业,2022届应届毕业生,秋招的岗位为嵌入式软件开发工程师/C++软件开发工程师从实习到秋招,时间段大概为3月到12月,战线较长,大厂中厂小厂的offer都拿到了,包括:联发科、海康威视、大华、鼎桥通信、新华三、闻泰科技、道通科技、TCL、汇川技术等公司的offer,最后签下了某芯片公司的offer,目前仍在春招,寻找其他的工作计划,求职仍在进行中,在这里简单对自己的秋招进行个总结,实习经历的话,暂时未介绍,文章主要分为几个部分:背景篇:主要对自己的个人情况进行一个总结

2022-03-03 14:31:10 1816

原创 OLED显示驱动

1、接口方式介绍接口方式:并行接口方式(8080、6080)串行SPI接口方式(3线、4线)IIC接口方式(2线)注:本代码使用的是8080的并行接口方式,选择的开发板为正点原子stm32f103开发板2、OLED模块的信号线CS:OLED 片选信号。WR:向 OLED 写入数据。RD:从 OLED 读取数据。D[7:0]:8 位双向数据线。RST(RES):硬复位 OLED。DC:命令/数据标志(0读写命令,1读写数据)3、OLED模块读写过程(针对8080的并行接口方式)先根据

2021-12-30 10:24:41 4179

原创 Linux应用编程和网络编程(6、proc文件系统)

1、proc文件系统介绍1.1、操作系统级别的调试(1)简单程序单步调试(2)复杂程序printf打印信息调试(3)框架体系日志记录信息调试(4)内核调试的困境1.2、proc虚拟文件系统的工作原理(1)Linux内核是一个非常庞大、非常复杂的一个单独的程序,对于这样的一个程序来说调试是非常复杂的(2)像kernel这样庞大的项目,给里面添加/更改一个功能是非常麻烦的,因为你添加的一个功能可能会影响其他已经有的(3)为了降低内核调试和学习的难度,内核开发者们在内核中添加了一些属性专门用于调

2021-10-24 22:04:48 1102

原创 Linux应用编程和网络编程(5、Linux中的随机数)

1、Linux中使用随机数1.1、随机数和伪随机数(1)随机数是随机出现的,没有任何规律的一组数列(2)真正的完全随机的数列是不存在的,只是一种理想情况。我们平时使用到的随机数一般只能通过一些算法得到一个伪随机数序列(3)我们平时说到的随机数,基本都指的是伪随机数1.2、Linux中随机数相关API(1)连续多次调用rand函数可以返回一个伪随机数序列(2)srand函数可以用来设置rand 获取的伪随机序列的种子1.3、实战(1)单纯使用rand重复调用n次,就会得到一个0-RAND_M

2021-10-24 21:10:38 148

原创 Linux应用编程和网络编程(4、时间API)

1、时间的概念可查看相关博客了解链接:http://www.cnblogs.com/qiuyi21/archive/2008/03/04/1089456.html2、Linux系统中的时间2.1、jiffies的引入(1)jiffies是Linux内核中的一个全局变量,这个变量用来记录以内核的节拍时间为单位时间长度的一个数值。(2)内核配置的时候定义了一个节拍时间,实际上Linux内核的调度系统工作时就是以这个节拍时间为时间片的(3)jiffies变量开机时有一个基准值,然后内核美国一个节拍时

2021-10-24 13:57:33 241

原创 数据编码的MFC demo

1、项目功能1、实现了裸数据的解码2、实现了裸数据+JPEG数据的解码3、实现了裸数据+YUV数据的解码2、项目开发思路1、点击button按钮2、读取指定文件夹的原始数据3、找到原始数据的第一个magicno4、根据magicno找到一帧数据5、根据获取到的一帧数据,判断这帧数据是否正确(是否为完整的一帧数据)6、确定了数据的完整性,在判断数据类型并同时对数据进行分割7、解析数据8、保存数据3、数据解码流程3.1、裸数据(1)首先判断传入数据的长度是否正确(注意传入的数据前4

2021-10-22 08:28:25 177

原创 客户端与服务器通信项目6:C语言实现Linux下的ls-l命令

13、实现Linux下的ls-l命令/**获取模式类型,并转换成字符*/void getmode(int mode, char *str){ strcpy(str, "----------"); //目录 if(S_ISDIR(mode)) { str[0] = 'd'; } //字符文件 if(S_ISCHR(mode)) { str[0] = 'c'; } //块文件 if(S_ISBLK(mode)) { str[0] = 'b'; } //用户的读、

2021-10-21 14:04:20 138

原创 客户端与服务器通信项目5:C语言实现ls命令

12、实现Linux下的ls命令char *ls(char *dirname){ Dir* dir_ptr; //创建目录指针 struct dirent* direntp; //存放目录信息的结构体 static char buf[BUFFER_SIZE] = {0}; //用于存放文件列表信息 memset(buf, 0, BUFFER_SIZE); //打开一个目录,失败时返回空指针 if((dir_ptr = opendir(dirname)) == NULL) {

2021-10-21 11:03:30 181

原创 客户端与服务器通信项目4

11、服务器主要程序/***获取服务器配置信息*/int getconfig(server_config *m_config, char *path){ char linebuf[100] = {0}; char client_num[100] = {0}; char *p = NULL; FILE *fp = NULL; fp = fopen(path, "r"); if(NULL == fp) { perror("fopen"); return -1; } else

2021-10-20 17:12:44 172

原创 客户端与服务器项目3

10、客户端主要程序1、传输文件时读取标准输入:暂停、停止/***传输文件时读取标准输入:暂停、停止*/void *thread_function(void){ fd_set m_fdset; //待检查文件的描述符 struct timeval timeout = {1, 0}; //设置超时时间为1秒 //用select超时实现非阻塞读取标准输入 while(1) { //select函数不会修改timeout的值,所以每次循环都应该重新赋值 timeout.tv

2021-10-20 15:10:59 129

原创 客户端与服务器通信项目2

4、模块划分4.1、服务器模块及功能1、读取文件列表:获取服务器文件列表机文件详细信息2、读取服务器配置:读取服务器名称与最大可连接数量3、修改服务器配置:获取客户端发送的信息,并写入配置文件4、开始传输文件:向客户端发送文件5、暂停传输文件:暂停向客户端发送文件6、停止传输文件:停止向客户端发送文件7、多线程:同时响应多个客户端的连接,并处理响应的请求4.2、客户端模块及功能1、获取文件列表:接收服务器发送的文件列表信息,并打印2、读取服务器配置:接收服务器发送的配置信息,并打印3

2021-10-19 16:55:36 251

原创 客户端与服务器通信项目1

1、功能需求:1、实现客户端与服务器的基本通信2、客户端能够读取服务器的文件列表,并在客户端进行打印3、客户端输入对应的文件名称后,服务器能够将对应文件传输给客户端4、服务器在传输文件过程中,客户端可以开启、暂停和终止文件传输5、客户端能够获取服务器的配置参数,包括服务器名称和最多支持客户端连接数量6、客户端能够修改服务器的配置参数,并保存,重启后仍生效7、实现多线程处理机制,并行处理多客户端的访问注:使用静态链接库和Makefile脚本编译工程2、socket通信的过程Socket也就

2021-10-19 14:32:20 220

原创 链表打印(链表反转输出)

1、题目描述:输入一个链表的头节点,从尾到头反过来打印每个节点的值,链表定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;}2、测试用例功能测试(输入的链表有多个节点;输入的链表只有一个节点)特殊输入测试(输入的链表头结点指针为NULL)3、解答思路思路:遍历链表。但是遍历的顺序是从头到尾,可输出的顺序却是从尾到头。也就是说,第一个遍历的节点最后一个输出,而最后一个遍历的节点第一个输出。这个也可以看成栈,用栈来实现。每经过一个

2021-08-15 13:40:41 1630

原创 字符串替换相关题目(合并数组)

1、题目描述:有两个排序数组 A1 和 A2,内存在 A1 的末尾有足够多的空余空间容纳 A2。请实现一个函数,把 A2 中的所有数字插入到 A1 中,并且所有的数字是排序的。2、测试用例3、解答思路思路一:从头到尾扫描字符串,每次碰到空格字符的时候进行替换。但是由于是把1个字符替换成3个字符,就必须要把空格后面所有的字符后移2字节。思路二:在合并两个数组(包括字符串)时,如果从前往后赋值每个数字(或字符),则需要重复移动数字(或字符)多次,那么我们可以考虑从后往前复制,这样就能减少移动的次数,从

2021-08-15 09:42:06 127

转载 字符串的替换

1、题目描述:请实现一个函数,把字符串中的每个空格替换成"%20"。例如,输入“We are happy.”,则输出“We%20are%20happy.”2、测试用例输入的字符串包含空格(空格位于字符串最前面;空格位于字符串最后面;空格位于字符串中间;字符串中有连续多个空格)输入的字符串没有空格特殊输入测试(字符串是一个NULL指针;字符串是一个空字符串;字符串只有一个空格字符;字符串中有连续多个空格)3、解答思路思路一:从头到尾扫描字符串,每次碰到空格字符的时候进行替换。但是由于是把1个

2021-08-11 20:44:55 4528 1

原创 数组中查找数字(二维数组)

1、题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。2、测试用例:长度为n的数组中包含一个或多个重复的数字数组中不包含重复的数字无效输入测试用例(输入空指针;长度为n的数组中包含0~n-1之外的数字)3、解答思路:思路一:两层遍历,暴力解法,一个元素一个元素遍历是否等于前面的元素 复杂度分析:时间复杂度O(N^2),空间复杂度O(1)...

2021-08-10 19:22:44 523

转载 数组中重复的数字(数组元素个数大于数组长度)

1、题目描述:在一个长度为n+1的数组里所有数字都在1~n的范围内,所以数组内至少有一个数字是重复出现的。请找出这个数组中任意一个重复出现的数字,但不能修改数组,例如:如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者1。注:该方式2、测试用例长度为n的数组中包含一个或多个重复的数字数组中不包含重复的数字无效输入测试用例(输入空指针)3、解答思路思路:类似于二分法处理把1~n的数字从中间数字m分为两部分,前面一部分为1-m,后面一半为M+1_n。

2021-08-09 15:31:31 382 1

原创 数组中重复的数字(数组元素个数等于数组长度)

1、题目描述:在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7,的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数组2或者3。注:该方式2、测试用例长度为n的数组中包含一个或多个重复的数字数组中不包含重复的数字无效输入测试用例(输入空指针;长度为n的数组中包含0~n-1之外的数字)3、解答思路思路一:两层遍历,暴力解法,一个元素一个元素

2021-08-08 22:25:02 282 1

转载 Linux应用编程和网络编程(3、文件权限)

1、文件权限管理1.1、st_mode中记录的文件权限位(1)st_mode本质上是一个32位的数(类型就是unsigned int),这个数里的每一位对应着一个含义(2)文件类型和文件的权限都记录在st_mode1.2、ls -l打印出的权限列表(1)123456789一共9位,3个一组。第1组3个位表示文件的属主(owner、user)对该文件的可读、可写、可执行权限;第2组3个位表示文件所在的组(group)对该文件的权限;第3组3个位表示其他用户(others)对该文件的权限(2)属主就

2021-07-25 09:56:58 101

原创 Linux应用编程和网络编程(2、文件属性)

1、Linux中各种文件类型1.1、普通文件(1)文本文件。文件中的内容是由文本构成的,文本指的是ASCLL码字符,或其他码字符。文件中的内容本质上都是数字(不管什么文件内容本质上都是数字,因为计算机中本身就只有0和1),而文本文件中的数字本身应该被理解为这个数字对应的ASCLL码。常见的.c文件、.h文件、.txt文件等都是文本文件。文本文件的好处就是可以被人轻松读懂和编写。(2)二进制文件。二进制文件中存储的本质上也是数字,只不过这些数字并不是文字的编码数字,而是真正的数字。常见的可执行程序文件(

2021-07-24 15:43:00 135 2

转载 Linux应用编程和网络编程(1、文件IO_文件管理)

三、Linux系统之文件管理1、硬盘中的静态文件和inode(i节点)(2)一块硬盘可以分为两大区域:硬盘内容管理表项和真正存储内容的区域。操作系统访问硬盘时先去读取硬盘内容管理表,从中找到我们要访问的那个文件的扇区级别的信息,再用这个信息去查询真正存储内容的区域,最后得到我们要的文件。(3)操作系统最初拿到的信息是文件名,最终得到的是文件内容。第一步就是查询硬盘内容管理表,这个管理表中以文件为单位记录了各个文件的各种信息,每一个文件有一个信息列表,inode实质是一个结构体,这个结构体有很多元素,

2021-07-24 12:39:53 158

空空如也

空空如也

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

TA关注的人

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