【嵌入式笔试专题---经纬恒润】

笔试—经纬恒润嵌入式软件笔试

选择题

1、下面总线采用异步时序协议的是(14)

给的参考答案是1,实际这个有两个选项

1、USB

2、I2C

3、SPI

4、PCI

  1. USB (Universal Serial Bus):

    • USB 使用一个复杂的协议,涉及数据包、错误检查和许多其他功能。它不完全基于简单的同步或异步概念,但它确实有一个时钟线,但这个时钟并不总是用于每一个操作,所以它有时可以被视为异步的。
  2. I2C (Inter-Integrated Circuit):

    • I2C 使用一个明确的时钟线(SCL)和一个数据线(SDA)。由于它有一个专用的时钟线,数据传输是同步的。
  3. SPI (Serial Peripheral Interface):

    • SPI 至少有三条线:一个时钟线(SCLK),一个主设备到从设备的数据线(MOSI),以及一个从设备到主设备的数据线(MISO)。与 I2C 类似,由于 SPI 有一个专用的时钟线,它是同步的。
  4. PCI (Peripheral Component Interconnect):

    • PCI 是一个并行接口,它也有一个时钟信号。但是,与其他同步协议不同,PCI 采用异步时序,在某些操作中不需要时钟。

考察知识点:对各种总线的认识,同步,异步的外设都有哪些

以下为整理内容:

同步外设/协议:
  1. RAM (随机存取存储器): 数据传输与特定的时钟信号同步。
  2. SPI (Serial Peripheral Interface): 通过一个明确的时钟线(SCLK)与数据线同步。
  3. I2C (Inter-Integrated Circuit): 与 SPI 类似,它也使用一个明确的时钟线(SCL)进行同步。
  4. SATA (Serial AT Attachment): 用于磁盘驱动器和计算机间的数据传输,它是同步的。
  5. PCIe (Peripheral Component Interconnect Express): 用于连接各种设备到主板的高速接口,操作在一个同步的时钟下。
异步外设/协议:
  1. UART (Universal Asynchronous Receiver-Transmitter): 用于异步串行通信。
  2. USB (Universal Serial Bus): 尽管 USB 使用一个复杂的协议并包含时钟线,但数据传输是在异步模式下进行的。
  3. ATA (Advanced Technology Attachment, 通常称为 PATA, Parallel ATA): 这是一个并行接口,用于早期的硬盘驱动器和计算机间的数据传输,它是异步的。
  4. Ethernet (在某些模式下): 尽管 Ethernet 可能会有时钟同步,但数据包的发送是异步的。
  5. PS/2 (Personal System/2): 用于连接键盘和鼠标到计算机,它是异步的。

这些只是示例列表,实际上还有许多其他的同步和异步设备或协议。同步和异步的选择取决于特定应用的需求和设计约束。

2、设有int x=11;则表达式(X++*1/3)的值是? 3

(X++*1/3)

解答:

  1. X++ 是后置自增操作。这意味着它首先返回 X 的当前值,并随后将 X 的值增加 1。

在解析表达式之前,X 的值是 11。当使用后置自增操作时,它首先返回 11,然后 X 的值变成 12

  1. 然后,我们有乘法和除法操作。

在 C 语言中,乘法和除法具有相同的优先级,因此它们从左到右进行评估。

因此,先进行乘法运算,然后进行除法运算。

11 * 1 = 11

然后进行除法:

11 / 3 = 3 (因为我们用的是整数除法,结果也是整数)

所以,表达式 (X++*1/3) 的值是 3

注意:虽然表达式的值是 3,但 X 的值在表达式评估后是 12

考察点: 前自增与后自增, 算术运算符优先级,整数除法

  1. 前自增 (++variable):
    • 该操作首先增加变量的值,然后返回新的值。
    • 例如,假设我们有 int x = 5;,执行 int y = ++x; 之后,x 的值变为 6,y 的值也是 6。
  2. 后自增 (variable++):
    • 该操作首先返回变量的当前值,然后将变量的值增加 1。
    • 例如,假设我们有 int x = 5;,执行 int y = x++; 之后,x 的值变为 6,但 y 的值是 5(因为它接收了 x 的原始值)。

为了更好地理解,考虑以下代码片段:

int a = 5, b, c;

b = ++a;  // 前自增
c = a++;  // 后自增

在这个例子中:

  • b 的值是 6,因为前自增首先将 a 增加到 6,然后赋给 b
  • 虽然在给 c 赋值时,a 的值是 6,但由于使用的是后自增,所以 c 得到的值是 6。执行完这条语句后,a 的值变为 7。

总结:前自增首先增加值,然后进行其他操作;而后自增在进行其他操作后才增加值。在单独的语句中使用自增操作(例如 x++;++x;)时,两者的效果是相同的,但当它们作为表达式的一部分时,它们的行为和结果是不同的。

算术运算符优先级

  1. 括号 (()):
    • 优先级最高,总是首先计算括号内的表达式。
  2. 正负号、递增、递减 (+ (一元),- (一元),++, --):
    • -a, +a, a++, ++a, a--, --a
  3. 乘法、除法、取模 (*, /, %):
    • 它们的优先级相同,从左到右计算。
    • 例如,在 a * b / c 中,首先计算 a * b,然后用该结果除以 c
  4. 加法、减法 (+, -):
    • 它们的优先级低于乘法、除法和取模,但在两者之间是相同的,并从左到右计算。
    • 例如,在 a + b - c 中,首先计算 a + b,然后从该结果中减去 c

在实际编程中,为了增加代码的清晰度并避免可能的混淆或错误,建议使用括号来明确指定计算的顺序,即使这些括号在某些情况下可能是多余的。

当你在 C 语言(以及许多其他编程语言)中进行整数除法时,如 11 / 3,并且得到结果 3 而不是浮点数 3.6667...,这是在考察以下几个重要概念:

  1. 整数除法:在许多编程语言中,两个整数的除法默认是整数除法。这意味着结果会被截断成整数,任何小数部分都会被丢弃。
  2. 数据类型:这与数据的类型有关。在上述情况中,被除数和除数都是整数,所以结果也是整数。如果你想得到一个浮点数结果,至少有一个操作数必须是浮点数(例如,11.0 / 311 / 3.0)。
  3. 隐式类型转换:在某些语言中,当你混合使用整数和浮点数时,可能会发生隐式类型转换。了解这些转换是很重要的,否则可能会在不期望的时候得到错误的结果。
  4. 截断 vs 舍入:整数除法会截断任何小数部分,而不是四舍五入。

3.为了比较两个字符串s1和s2是否相等,应当使用(1)

1、if(strcmp(s1, s2)==0)

2、if(strcmp (&s1, &s2) ==0)

3、if(s1==s2)

4、if(s1=s2)

考察点:

  • 字符串在 C 语言中如何比较。
  • strcmp 函数的使用和语义。
  • 指针与实际数据之间的区别。
  • C 语言中的赋值和比较操作符。
1. 字符串在 C 语言中如何比较

在 C 语言中,字符串被视为字符数组,以空字符('\0')结尾。因为字符串只是字符数组,所以我们不能直接使用 == 运算符来比较两个字符串是否相等。我们需要使用特定的函数来进行字符-by-字符的比较。

  • 相关知识点

    • 字符数组和字符指针。
    • 字符串终止符('\0')。
2. strcmp 函数的使用和语义

strcmp 是 C 语言标准库 <string.h> 中的一个函数,用于比较两个字符串。

  • 语义:如果两个字符串相同,strcmp 返回 0。如果第一个字符串小于第二个字符串,返回一个负数;如果大于,则返回一个正数。
  • C 语言还提供了其他字符串比较函数,如 strncmp(比较字符串的前 n 个字符)、strcasecmp(忽略大小写的比较)等。
3. 指针与实际数据之间的区别

在 C 语言中,指针只是一个变量,它存储了一个内存地址。它可能指向一个数据元素(如 intchar)、数据结构或函数。当我们比较两个指针时,我们实际上是在比较它们指向的地址,而不是它们指向的内容。

  • 相关知识点

    • 指针的定义和初始化。
    • 指针算术。
    • 指向不同类型的指针。
    • 动态内存分配(如 mallocfree)。
4. C 语言中的赋值和比较操作符
  • 赋值 (=):这是一个操作符,用于将右侧的值赋给左侧的变量。例如,a = b; 会将 b 的值赋给 a
  • 比较 (==):这是一个关系操作符,用于比较两个变量的值是否相等。如果相等,它返回 1(真),否则返回 0(假)。
  • 常见错误:在 C 语言中,混淆 === 是初学者经常犯的一个常见错误,导致意外的程序行为。

4、C语言程序是由什么组成的? 1

1、一个主函数和若干子程序

2、若干子程序

3、函数

4、一些可执行语言

5、c语言程序的基本单位是 1

1、函数

2、字符

3、语句

4、程序行

6、使用哪个命令可以检测基本的网络连接:4

1、netstat

2、ifconfig

3、route

4、ping

以下是每个选项的解释以及它们的考察点:

  1. netstat: 这个命令显示网络连接、路由表、接口统计等。它主要用于检查当前设备上的网络连接的状态和统计信息。考察的是对系统当前网络连接和状态的检查和分析。
  2. ifconfig (在一些新版本的 Linux 系统上是 ip aip addr): 这个命令用于显示和配置网络接口。它可以告诉你关于你的网络接口的信息,例如 IP 地址、MAC 地址等。考察的是网络接口的配置和状态检查。
  3. route (在一些新版本的 Linux 系统上是 ip rip route): 这个命令用于显示和修改 IP 路由表。它可以让你知道数据包将如何从你的机器路由到其它位置。考察的是对网络路由的理解和配置。
  4. ping: 这个命令用于测试网络连接。它发送 ICMP Echo 请求到指定的网络地址,并等待回应。如果接收到回应,这意味着网络连接是好的。考察的是基本的网络故障排查和连接测试。

综上所述,这个题目考察的主要知识点是:

  • Linux 系统下的网络命令及其用途。
  • 对不同网络工具的功能和应用场景的理解。
  • 基础的网络故障排查和诊断能力。

7、下面代码段的输出是(20 10 20)

#include "stdio.h"
void func(void)
{
   
    static int tmp=10;
    printf("%d " ,tmp);
}

int main()

{
   
    int tmp=20;
    printf("%d ",tmp);
    func();
    printf("%d " ,tmp);
}

考察对局部变量、静态局部变量和变量作用域的理解

  1. 局部变量:在 main 函数中,有一个局部变量 tmp,它的作用域仅限于 main 函数。因此,当你在 main 函数中打印 tmp,它引用的是这个局部变量。
  2. 静态局部变量:在 func 函数中,变量 tmp 被声明为 static。这意味着,尽管 tmp 是一个局部变量,但它不会在函数调用结束后被销毁。它会保留其值,直到程序结束。每次调用该函数时,它不会重新初始化 tmp
  3. 变量的作用域和隐藏:尽管 funcmain 都有名为 tmp 的变量,但由于它们的作用域,它们是完全不同的变量。当 func 中的 tmp 被打印时,它引用的是 func 中的静态局部变量,而不是 main 中的局部变量。这是一个关于如何局部变量可以"隐藏"在其他作用域中具有相同名称的变量的示例。
  4. 函数调用:代码展示了如何从一个函数(这里是 main)调用另一个函数(这里是 func)。

所以,主要考察点是:

  • 了解局部变量的作用域和生命周期。
  • 了解静态局部变量的特性和用途。
  • 理解变量的作用域,以及在不同作用域中相同名称的变量是如何被处理的。
  • 基本的函数调用机制。

8.考察结构体对齐

#include "stdio.h"


struct Date{
   
char a;
int b;
int64_t c;
char d;
}; 

struct Date data[2][10];
  • 11
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值