嵌入式知识

1.如何用c编写死循环?

  while(1){}或for(;;)

2.局部变量,全局变量,动态申请的数据分别储存在哪里?

局部变量存在于栈区;

全局变量存在与静态区;

动态申请数据存在于堆区;

3.关键字const有什么含义?

只读;使用const也许能产生更紧凑的代码;

使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改;

4.什么是预编译,何时需要预编译?

总是使用不经常改动的大型代码体;程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项,这种情况下,可以将所有文件预编译为一个预编译头。

预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。

5.局部变量能否和全局变量重名?

能,局部会屏蔽全局。

6.引用和指针的区别?

引用必须被初始化,指针不必;

引用初始化以后不能被改变,指针可以改变所指的对象;

不存在指向空值的引用,但是存在指向空值的指针;

7.一个32位的机器,该机器的指针是多少位?

指针是多少位只要看地址总线的位数就行了。32的数据总线,指针的位数就是4个字节。

8.以下的代码有什么问题?

int main(){

char a;                                     没有为str分配内存空间,将会发生异常,问题出在

char *str=&a;                           将一个字符串复制进一个字符变量指针所指地址。虽然可以

strcpy(str,"hello");                    输出结果,但因为越界进行内在读写而导致程序崩溃。

printf(str);

return 0;}

9.关键字static有哪3个明显的作用?

修饰局部变量;修饰全局变量;修饰函数(改变作用域,生命周期)

1.改变了生存周期;就是一个变量、函数从分配内存去表示到回收内存的过程;

2.改变了作用域;就是可以在哪些文件里可以使用该函数;

10.宏定义,输入2个参数并返回较小的一个

#define MIN(A,B)  ((A)<=(B)?(A):(B))

11.使用c语言中的#define来定义一个常量来表示一年有多少秒?

#define SECOND_PER_YEAR   (60*60*24*365)UL    ps:一定要加括号。

12.进程与线程的区别?

进程:资源分配的最小单位。

线程:程序运行/调度的最小单位。

进程有自己的地址空间,当一个进程建立,系统会为它分配地址空间,而线程是共享进程的数据,使用相同的地址空间。

一个进程中可能有多个线程,一个进程死掉不影响其他进程,一个线程死掉,整个进程都死了。

线程之间的通信更加方便,同一进程的线程共享全局变量,静态变量,而进程通信要以IPC方式进行;

(1)创建和销毁较频繁使用线程,因为创建进程花销大。

(2)需要大量数据传送使用线程,因为多线程切换速度快,不需要跨越进程边界。

  (3)安全稳定选进程;快速频繁选线程;

多进程、多线程同步(通讯)的方法:

进程间通讯:(1)有名管道/无名管道(2)信号(3)共享内存

(4)消息队列(5)信号量(6)socket

线程间通讯:(1)信号量(2)读写锁(3)条件变量(4)互斥锁(5)自旋锁

13.下列代码的问题

char *s1="hello";

char *s2="world";

char *s3=strcat(s1,s2);

s1与s2都为常量指针,其内容不可修改,运行就会产生段错误。

14.解释下列3个变量声明

int const *p; const修饰的是指针p,表示指针p的值不能改变,而地址可以改变。

int *const p;const修饰的地址是常量,不可改变,但是*p的值可以改变;

int const *p const;    只读,地址和值都不能改变。

15.TCP/IP包含哪些分段?

应用层(http,dns,https),传输层,网络层,链路层,物理层。(3次握手,4次挥手)

16.TCP和UDP协议的区别?

TCP面向连接,UDP是无连接的,发送数据之前不需要建立连接;

TCP提供可靠的服务;UDP不可靠;

UDP具有较好的实时性,支持一对一,一对多,多对一,多对多;

TCP只能是点对点的,对系统资源要求较多;

17.简述嵌入式系统的定义和发展的4个阶段?

定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适用应用系统对功能,可靠性,成本,体积,功耗严格要求的专用计算机系统。

4个阶段:无操作系统,简单操作系统,实时操作系统,面向internet阶段。

18.嵌入式系统的组成?

硬件层,中间层,系统软件层,应用软件层。

19.全局变量可不可以定义在可被多个.c文件包含的头文件中?

可以,在不同的c文件中以static形式来声明同名全局变量。

20.堆栈溢出一般是由什么原因导致的?

没有回收垃圾资源。

21.队列和栈的区别?

队列先进先出,栈后进先出。

22.Flash与内存?

flash掉电数据可保持,内存掉电数据会丢失;

23.看门狗

单片机工作时可能会有外界电磁场的干扰,定时喂狗,防止程序跑飞。

24.A/D电路原理

由采样,保持,量化,编码组成。

25.stm32的时钟系统

有4个独立时钟源:

HSI:8MHz,RC振荡器

HSE:外部时钟源,一般是8MHz

LSI:40kHz,RC振荡器

LSE:32.768kHz的石英晶体。

PLL:锁相环倍频输出,倍频后不得超过72MHz。

系统时钟->AHB分频器->各个外设分频倍频器->外设时钟的设置。

26.堆和栈的区别

(1)管理方式不同。栈由操作系统自动分配释放,无需我们手动控制;堆的申请和释放工作由程序员控制,容易产生内存泄漏;

(2)空间大小不同。每个进程拥有的栈大小要远远小于堆大小。

(3)生长方向不同。堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低。

(4)分配方式不同。堆都是动态分配的,没有静态分配的堆。栈有 2 种分配方式:静态分配和动态分配。静态分配是由操作系统完成的,比如局部变量的分配。动态分配由alloca()函数分配,但是栈的动态分配和堆是不同的,它的动态分配是由操作系统进行释放,无需我们手工实现。

(5)分配效率不同。栈由操作系统自动分配,会在硬件层级对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是由C/C++提供的库函数或运算符来完成申请与管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片。显然,堆的效率比栈要低得多。
27.推挽输出与开漏输出

推挽输出的工作原理是:当需要输出高电平时,上方P-MOS管导通,下方N-MOS管关闭。而若要输出低电平时,下方的N-MOS管导通,上方的P-MOS管关闭。当引脚高低电平切换时,两个MOS管轮流导通,一个负责灌电流,另一个负责拉电流,使得负载能力和开关速度都有很大的提高。

开漏输出的工作原理是:若要输出低电平,则N-MOS管导通,输出接地,输出低电平。若要输出高电平时,N-MOS管关闭,则既不输出高电平又不输出低电平,为高阻态。所以,需要外接上拉电阻,让上拉电阻提供高电平的驱动能力。因为内部管脚为高阻状态,所以,其具有“线与”特性,即将多个开漏极直接直接相连,只有所有的开漏极都是高阻状态,输出才为高电平,否则,为低电平。

在STM32中,除非必须使用开漏模式,一般习惯使用推挽输出。开漏输出一般应用在IIC,SMBUS等需要“线与”功能的总线电路中。

28.关键字volatile(易变的)作用。

防止编译器对代码进行优化,被修饰的变量值随时都可能被改变,需要程序每次从变量的地址去读取值。

29.什么是spi? 

 30.什么是iic?

31.pwm的工作原理?

32.什么是DMA?

33.什么是nvic?

嵌套向量中断控制器;用于为中断分组,从而分配抢占优先级和响应优先级。

34.冒泡排序

#include<stdio.h>    
void main()
{
    int n[10] = { 25,35,68,79,21,13,98,7,16,62 };
    int i, j, temp;
    for (i = 1; i <= 9; i++)
    {
        for (j = 0; j <= 9 - i; j++)
        {
            if (n[j] > n[j + 1])
            {
                temp = n[j];
                n[j] = n[j + 1];
                n[j + 1] = temp;
            }
        }
    }
    printf("排序过后的数顺序:\n");
    for (i = 0; i < 10; i++)
    printf("%-4d", n[i]);
    printf("\n");
}

35.数据类型长度

int型
int型是有符号的整形,值必须是整数,正整数、负数和0.一般来说一个int型会占用一个字长。

short int类型
也可以写成 short,占用的存储空间比int型少,常用于较小数值的场合来节省空间。与int型类似,short也是无符号整形。
long int
简写成 long ,占用的空间比int多,适用于大数值的场合,也是有符号类型
long long int
简写成long long,比long的空间更大,有符号类型
unsigned int
简写 unsigned ,用于非负的场合,无符号类型,可以表示更大的数

char类型
char用来存字符,但是从技术层面来看,char是整数类型,因为char实际存储的是整数而不是字符,用ASCII来处理字符,无符号类型。

float类型
单精度浮点数,可以存放8个字节
double类型
双精度,可以存放16个字节

打印不同进制的数:
八进制:%o
十进制:%d
十六进制:%x
显示不同进制的前缀:
八进制:%#o
十进制:%#x
十六进制:%#X

各个类型所占空间大小
long long 占64位:
long 占 32位:
shart 占16位;
int 占16位或32位,具体以计算机的自然字长而定;
char 占8位;
float 占 32位;
duoble 占64位
 

36.RS-232与RS-485对比
1、抗干扰性:RS485 接口是采用平衡驱动器和差分接收器的组合,抗噪声干扰性好。RS232 接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰。

2、传输距离:RS485 接口的最大传输距离标准值为 1200 米(9600bps 时),实际上可达 3000 米。RS232 传输距离有限,最大传输距离标准值为 50 米,实际上也只能用在 15 米左右。

3、通信能力:RS-485 接口在总线上是允许连接多达128个收发器,用户可以利用单一的 RS-485 接口方便地建立起设备网络。RS-232只允许一对一通信。

4、传输速率:RS-232传输速率较低,在异步传输时,波特率为 20Kbps。RS-485 的数据最高传输速率为 10Mbps 。

5、信号线:RS485 接口组成的半双工网络,一般只需二根信号线。RS-232 口一般只使用 RXD、TXD、GND 三条线 。

6、电气电平值:RS-485的逻辑"1"以两线间的电压差为+(2-6) V 表示;逻辑"0"以两线间的电压差为-(2-6)V 表 示 。在 RS-232-C 中任何一条信号线的电压均为负逻辑关系。即:逻辑"1",-5 - -15V;逻辑"0 " +5 - +15V 。

37.父进程与子进程

父进程调用fork()以后,克隆出一个子进程,子进程和父进程拥有相同内容的代码段、数据段和用户堆栈。父进程和子进程谁先执行不一定,看CPU。所以我们一般我们会设置父进程等待子进程执行完毕。

38.什么是上下文切换?
有进程上下文,有中断上下文。

进程上下文:一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容,当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。

中断上下文:由于触发信号,导致CPU中断当前进程,转而去执行另外的程序。那么当前进程的所有资源要保存,比如堆栈和指针。保存过后转而去执行中断处理程序,快读执行完毕返回,返回后恢复上一个进程的资源,继续执行。这就是中断的上下文。

39.在1G内存的计算机能否malloc(1.2G)?为什么?

是有可能的。因为malloc函数可以向程序的虚拟空间申请一块虚拟地址空间,与物理内存没有直接关系。

40.extern ”c“的作用

在C++中使用c的已编译好的函数模块,存在于C++文件中。

41.内存溢出,内存碎片,内存越界,内存泄漏?

溢出:申请的空间太大,系统资源不够。

碎片:没有被用到的内存空间(分为外部和内部)

越界:写入的数据超出所申请的空间。

泄露:申请内存后,没有进行释放。

42.inline函数

43.内存四区

堆,栈,代码区,全局区

44.使用32位编译情况下,给出判断所使用机器大小端的方法

#include<stdio.h>

int main(){
  union w
  {
      int a;
      char b;
  }c;
  c.a = 1;
  if(c.b == 1)
   printf("小端存储\n");
  else
   printf("大端存储\n");
 return 0;
}
45.Linux内核的五个子系统

进程调度,内存管理,虚拟文件系统,网络接口,进程间通讯。

46.Linux系统的4个主要部分

内核,shell,文件系统,应用系统

47.用户空间于内核通信方式有哪些?

48.一个程序从开始运行到结束的完整过程

预处理,编译,汇报,链接

49.死锁的原因与条件

原因:资源系统不足,进程运行推进的顺序不合适,资源分配不当

条件:互斥条件:一个资源每次只能被一个进程使用。

          请求与保持条件:一个进程因请求资源而堵塞时,对以获得的资源保持不放。

          不剥夺条件:进程已获得的资源在未使用完之前,不能强行剥夺。

          循环等待条件:若进程之间形成一种头尾相接的循环等待资源关系。

50.硬链接与软链接

硬链接:物理索引,移动或删除原始文件时,链接不会被破坏。

软链接:相当于快捷方式,专门指向某个文件。

51.中断怎么发生,中断处理流程

请求中断>响应中断>关闭中断>保留断点>中断源识别>保护现场>中断服务子程序>恢复现场>中断返回

52.linux命令

1、改变文件属性的命令:chmod (chmod 777 /etc/squid
运行命令后,squid文件夹(目录)的权限就被修改为777(可读可写可执行))
2、查找文件中匹配字符串的命令:grep
3、查找当前目录:pwd
4、删除目录:rm -rf 目录名
5、删除文件:rm 文件名
6、创建目录(文件夹):mkdir
7、创建文件:touch
8、vi和vim 文件名也可以创建
9、解压:tar -xzvf 压缩包
打包:tar -cvzf 目录(文件夹)
 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值