嵌入式软件开发流程?
设计 实现 测试 维护
堆和栈的区别?
(1)存储内容不同
栈:在函数调用时,栈中存放的是函数中(最底下是函数调用后的下一条指令)的各个参数(局部变量)。它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。栈就像装数据的桶或箱子
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员分配。堆是一种经过排序的树形数据结构,每个结点都有一个值。堆像一棵倒过来的树
(2)管理方式上不同
栈:由系统自动分配并释放空间。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间,当对应的生存周期结束后栈空间被自动释放。
堆:需要程序员指定大小手动申请和手动释放,在C语言中使用malloc函数申请,使用free函数释放。
(3)空间大小不同
栈:获取空间较小。在Windows下一般大小是1M或2M,当剩余栈空间不足时,分配失败overflow。
堆:获得空间根据系统的有效虚拟内存有关,比较灵活、大。
堆和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a;系统会自动在栈上为其开辟空间。而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。
例子:
main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10); 堆//分配得来得10和20字节的区域就在堆区
p2 = (char *)malloc(20); 堆
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方
}
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;放在栈中。
而bbbbbbbbbbb是在编译时就确定的;放在堆中。
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
Volatile与Register的区别是?
用关键字volatile声明变量,是用来告诉编译器每次对此变量的引用都需要从内存地址中读取,即取消编译器对此变量的优化编译
当对一个变量频繁读写时,需要反复访问内存,从而花费大量的存取时间。为此,C语言提供了一种寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,从而提高了效率。对于循环次数较多的循环控制变量及循环体内反复使用的变量,均可以定义为寄存器变量。register int i,s = 0;只要用了register修饰符,对该变量的取地址操作是禁止的,不管事实上该变量是否被放入了寄存器内
内存和寄存器:
寄存器是CPU里的东西,内存是挂在CPU外面的数据总线上。
寄存器是中央处理器内的组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的。
访问内存时要在CPU的寄存器填上地址,再执行相应的汇编指令。这时CPU会在数据总线上生成读取或者写入内存数据的时钟信号,最后内存的内容会被CPU寄存器的内容更新(写入)或被读入CPU的寄存器(读取)。
ARM里的大端格式和小端格式分别是什么意思?
大端(big endian): 低地址存放高有效字节
小端(little endian): 低字节存放低有效字节
IIC协议:
多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性
一条是串行数据线SDA,一条是串行时钟线SCL。(IIC是半双工,而不是全双工)
IIC是真正的多主机总线,(而这个SPI在每次通信前都需要把主机定死,而IIC可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏。
传输速率在标准模式下可以达到100kb/s,快速模式下可以达到400kb/s。
连接到总线的IC数量只是受到总线的最大负载电容400pf限制。
在时钟的高电平周期内,SDA线上的数据必须保持稳定,数据线仅可以在时钟SCL为低电平时改变。
起始条件:当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始条件,结束条件:当SCL为高电平的时候,SDA线上由低到高的跳变被定义为停止条件,要注意起始和终止信号都是由主机发出的, 连接到 I 2 C 总线上的器件,若具有 I 2 C 总线的硬件接口,则很容易检测到起始和终止信号。 总线在起始条件之后,视为忙状态,在停止条件之后被视为空闲状态
每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答
参考www.cnblogs.com/zhangjiansh…
求中位数的程序:大小排序函数
/*可用于求n个数的中位数*/
#include <stdio.h>
#include <algorithm>
using namespace std;
int a[1024], n;
int main () {
``while (~``scanf (``"%d"``, &n)) {
``for (``int i = 0; i < n; i ++)
``scanf (``"%d"``, &a[i]);
``sort(a, a + n);
``if (n % 2 == 1)
``printf (``"%d\n"``, a[n/2]);
``else
``printf (``"%d\n"``, (a[n/2 - 1] + a[n/2])/2);
``}
``return 0;
}
中值滤波:冒泡排序再类似上面
滑动平均滤波:减去最旧值,加最新值,循环队列
连续排序:检测最新值在谁谁之间,前面数整体平移
PID:
PID的增量型公式:
PID=Uk+KP*【E(k)-E(k-1)】+KI*E(k)+KD*【E(k)-2E(k-1)+E(k-2)】
sizeof和strlen区别
最近在看c++,想计算输入字符串的长度时用的是sizeof(point)/sizeof(char) - 1 ;但是结果总是固定的3,后来我换成strlen()就可以了,于是百度了一下
sizeof和strlen的区别
strlen计算字符串的长度,以'\0'为字符串结束标志
sizeof是分配的数组实际所占的内存空间大小,不受里面存储内容
例如
char *str = "1111111abcd";
char str1[9] = {1};
sizeof(str) = 4; //是指指针所占的字节大小,在c/c++中一个指针占4个字节(32位系统)
sizeof(str1) = 9;
sizeof()是运算符,由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组的空间,返回值跟这些里面所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值含义如下:
数组-编译时分配的数组空间大小
指针-存储该指针所用的空间大小
类型-该类型所占的空间的大小
对象-对象的实际占用空间大小
函数-函数返回类型所占空间的大小
strlen()是函数,可以计算字符串的长度,直到遇到结束符NULL才结束,返回的长度大小不包含NULL
typedef signed char int8_t; // 标准表达方式 signed char 被等同于 int8_t;
typedef signed short int int16_t;
typedef signed int int32_t;//在32位环境里,int代表4个字节32位!!
typedef signed __int64 int64_t;
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned __int64 uint64_t;
预编译、编译、汇编、链接
局部变量能否和全局变量重名?
答案:能,局部会屏蔽全局。要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内
如何引用一个已经定义过的全局变量?
答案:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错
全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
答案:可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错
程序的局部变量存在于()中,全局变量存在于()中,动态申请数据存在于()中。
答案:栈;静态区;堆
队列和栈有什么区别?
答案:队列先进先出,栈后进先出
switch(c) 语句中c可以是int,long,char ,float ,unsigned int 类型。( 错,不能用实形 )
har str[ ]= "Hello"; char *p=str; int n=10; sizeof(str)=( ) sizeof(p)=( )sizeof(n)=( ) void func(charstr[100]){ } sizeof(str)=( ) 答案:6,4,4,4
设int arr[]={6,7,8,9,10}; int*ptr=arr; *(ptr++)+=123; printf("%d,%d",*ptr,*(++ptr));( ) 10分答案:8