cvte嵌入式(Linux方向)笔试总结-提前批+正式批

本文涵盖了计算机科学的基础知识,包括设备驱动的分类、内存管理、数据存储形式、C++的重载与重写、程序运行模式、链表操作、内核子系统以及线程同步等概念。同时,通过实例代码解释了局部函数、数组参数、字符串处理和算法应用。此外,还讨论了64位操作系统下的字符串处理和抽象类的继承规则。内容深入浅出,适合计算机科学的学习和复习。
摘要由CSDN通过智能技术生成

百度
紫光
大疆
爱奇艺
科大讯飞
cvte
蔚来
大华
乐鑫
联发科

提前批

选择20道
(1)字符设备驱动和块设备驱动的区别
系统中能够随机(不需要按顺序)访问固定大小数据片(chunks)的设备被称作块设备,这些数据片就称作块。最常见的块设备是硬盘,除此以外,还有软盘驱动器、CD-ROM驱动器和闪存等等许多其他块设备。注意,它们都是以安装文件系统的方式使用的——这也是块设备的一般访问方式。
另一种基本的设备类型是字符设备。字符设备按照字符流的方式被有序访问,像串口和键盘就都属于字符设备。如果一个硬件设备是以字符流的方式被访问的话,那就应该将它归于字符设备;反过来,如果一个设备是随机(无序的)访问的,那么它就属于块设备。
块设备通过系统缓存进行读取,不是直接和物理磁盘读取。字符设备可以直接物理磁盘读取,不经过系统缓存。(如键盘,直接相应中断)

(2)键盘属于什么设备 字符型设备

(3)ARM处理器哪几种数据存储形式
ARM处理器有大端和小端形式

(4)int a=6;int *p = &a;int **q1 = &p;int &q2 = *p;请问各自数据多少以及合不合法

#include "stdafx.h"
#include<Windows.h>
#include<iostream>
using namespace std;
int main()
{
	int a = 6;
	int *p = &a;
	int **q1 = &p;
	int &q2 = *p;
	cout << "**q1 = " << **q1 << endl;
	cout << "q2 = " << q2 << endl;
	system("pause");
	return 0;
}

都合法

(5)双向链表拼接的时间复杂度 暂定O(1)
需要注意:
双向链表特点
  1.每次在插入或删除某个节点时, 需要处理四个节点的引用, 而不是两个. 实现起来要困难一些
  2.相对于单向链表, 必然占用内存空间更大一些.
  3.既可以从头遍历到尾, 又可以从尾遍历到头
区别:时间复杂度O(m+n) 是 线性阶 O(n),举例的算法:比如 长度m和长度n的链表 合并

(6)程序正常的工作模式是用户模式吗
通常写的C语言程序是在用户模式下运行的。操作系统的汇编部分在管理模式和系统模式运行,系统模式是为了解决操作系统在管理模式下不能访问用户模式下的部分寄存而设立的。其它的还有快速中断模式,快速中断模式,数据访问终止模式,定义指令终止模式。

(7)什么GPIO模式加上上拉才能高电平输出
开漏输出:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)
阅读文章:https://blog.csdn.net/santa9527/article/details/78842832

(8)C++的重载和重写,Base *b = &d;当基类和派生类有相同的函数名时,如何执行
(9)派生类与基类重名函数标为virtual而基类那边没有标时,是否对基类有重写效果 没有
(10)char *pl[] = {“CVTE”,”2020”,”GOOD”};puts(dp[1])打印出什么 2020
puts函数功能是将字符串输出到屏幕。输出时只有遇到 ‘\0’ 也就是字符串结束标志符才会停止。
测试代码

#include "stdafx.h"
#include<Windows.h>
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	char *lp[] = { "CVTE","2020","WELCOME" };
	puts(lp[1]);
	system("pause");
	return 0;
}

(11)改变内核打印优先级用什么命令(例echo 1 4 1 7 > /usr/sys/kernel/printk)
#echo 1 4 1 7 > /proc/sys/kernel/printk

(12)std的筛选排序等函数应用:partial_sort,set_difference,parational
STL set中有set_union(取两集合并集)、set_intersection(取两集合交集)、set_difference(取两集合差集)。

1、这几个函数的参数一样。
2、set_union(x1.begin(), x1.end(), x2.begin(), x2.end(), inserter(x, x.end())),前两个参数是集合x1的头尾,再依次是集合x2的头尾,最后一个参数就是将集合x1和集合x2取合集后存入集合x中。

(13)ps -u命令意思 查看指定用户所有进程
命令格式
ps命令基本格式为:
ps [options]
常用参数
-A 显示所有进程(同-e)
-a 显示当前终端的所有进程
-u 显示进程的用户信息
-o 以用户自定义形式显示进程信息
-f 显示程序间的关系
输出格式规划:
l :较长、较详细的将该 PID 的的信息列出;
j :工作的格式 (jobs format)
-f :做一个更为完整的输出。

• USER:该进程属于那个使用者账号的?
• PID :该进程的进程ID号。
• %CPU:该进程使用掉的 CPU 资源百分比;
• %MEM:该进程所占用的物理内存百分比;
• VSZ :该进程使用掉的虚拟内存量 (Kbytes)
• RSS :该进程占用的固定的内存量 (Kbytes)
• TTY :该进程是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
• STAT:该程序目前的状态,主要的状态有:
R :该程序目前正在运作,或者是可被运作;
S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号(signal) 唤醒。
T :该程序目前正在侦测或者是停止了;
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
• START:该进程被触发启动的时间;
• TIME :该进程实际使用 CPU 运作的时间。
• COMMAND:该程序的实际指令为什么?

(14)局部函数使用数组作为参数
功能测试代码

#include "stdafx.h"
#include<Windows.h>
#include<iostream>
using namespace std;

//1.局部函数在使用数组作为参数时,会将i数组的首地址(即数组名)传入作为参数,访问元素则用下标访问
//2.既然传入的是地址,所以我们不仅可以调用元素,还可以修改元素参数
//3.char i[20]的20形同虚设,等效于char i[]
int fun(char i[20])
{
	printf("局部函数i数组首地址 = %ld\n", i);
	i[1] = '0';
	cout << "Base fun act" << endl;
	return sizeof(i);
}



int main()
{
	char i[10] = {'1','9','8','0'};
	cout << "src sizeof(i[10])" << sizeof(i) << endl;
	printf("局部函数修改i[1]前的元素大小为:%c\n", i[1]);

	int res = fun(i);
	printf("局部函数修改i[1]后的元素大小为:%c\n", i[1]);

	//可以越界访问,但是数据后果不确定
	//cout << "src i[11]" << (int)i[11] << endl;
	
	//输出i数组的数组首地址不能使用cout直接输出,因为cout<<会重载使i会按顺序输出内容而不是首地址
	printf("main函数i数组首地址 = %ld\n", i);

	//可以知道其实传入局部参数的是数组的首元素地址
	cout << "fun->sizeof(i)=" << res << endl;
	
	system("pause");
	return 0;
}

编程2道(放在中间)
1.盒子里面n个球,每次可以拿1个或者2个,一共有多少种拿法
2.分解质因数
参考代码

#include "stdafx.h"
#include<Windows.h>
#include<iostream>
using namespace std;
int main()
{
	int num = 0;
	cin >> num;
	cout << num << "=";
	for (int i = 2; i < num; i++)
		while (!(num % i))//注意这里的!优先级比%大
		{
			cout << i << "*";
			num = num / i;
		}
	cout << num << endl;
	system("pause");
	return 0;
}

正式批

(1)linux的内核子系统包括哪些

Linux内核主要由5个子系统组成:进程调度(SCHED),内存管理(MM),虚拟文件系统(VFS),网络接口(NET),进程间通信(IPC)。

(2)i2c的设备地址范围 0~127 7位地址位 一位读写位

(3)下列哪个不需要线程同步 x=1?x=y?

(4)将cvte1复制为cvte2可以用下列哪些命令?

(5)抽象类的继承类不需要实现所有的纯虚函数?
纯虚函数要求在派生类中必须被重新定义,否则派生类依然是抽象类,无法创建对象。这样的要求带有一定的强制性,让程序员针对不同的派生类实现不同的函数,这是有必要的,可以防止遗漏和错误;

(6)64位操作系统下,char maxhub[]=”maxhub\0\0\x11\”; 11,6,8 (暂定)
测试代码

cout<<sizeof(maxhub)<<,<<strlen(maxhub)<<,<<sizeof(maxhub+1);
#include "stdafx.h"
#include <Windows.h>
#include<iostream>
#include<vector>
#include<set>
using namespace std;

int main()
{
	char maxhub[] = "maxhub\0\0\x11\\";
	cout << sizeof(maxhub) << "," << strlen(maxhub) << ","<<sizeof(maxhub + 1) << endl;
	system("pause");
	return 0;
}
  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值