嵌入式软件开发 必须掌握的知识点(二)(有错还望指点^_^)
2011-10-20 15:09
417 查看
1、 嵌入式系统的主要组成部分
1)硬件设备;2)嵌入式操作系统;3)应用软件;2、一条语句实现“判断一个数X为2的 n 次幂”
if(x&(x-1)==0){
}
3、linux系统的设备分类
1)字符设备;2)块设备;3)网络设备;http://hi.baidu.com/%C4%A7%B7%BD%D0%A1%D5%F2/blog/item/67d9ef18f334924f42a9adec.html
4、C语言运算符优先级
同一优先级的运算符,运算次序由结合方向所决定。http://www.slyar.com/blog/c-operator-priority.html
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | |
() | 圆括号 | (表达式)/函数名(形参表) | |||
. | 成员选择(对象) | 对象.成员名 | |||
-> | 成员选择(指针) | 对象指针->成员名 | |||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
(类型) | 强制类型转换 | (数据类型)表达式 | |||
++ | 自增运算符 | ++变量名/变量名++ | 单目运算符 | ||
-- | 自减运算符 | --变量名/变量名-- | 单目运算符 | ||
* | 取值运算符 | *指针变量 | 单目运算符 | ||
& | 取地址运算符 | &变量名 | 单目运算符 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof(表达式) | |||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 余数(取模) | 整型表达式/整型表达式 | 双目运算符 | ||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式<表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式<=表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | 双目运算符 | ||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | |
/= | 除后赋值 | 变量/=表达式 | |||
*= | 乘后赋值 | 变量*=表达式 | |||
%= | 取模后赋值 | 变量%=表达式 | |||
+= | 加后赋值 | 变量+=表达式 | |||
-= | 减后赋值 | 变量-=表达式 | |||
<<= | 左移后赋值 | 变量<<=表达式 | |||
>>= | 右移后赋值 | 变量>>=表达式 | |||
&= | 按位与后赋值 | 变量&=表达式 | |||
^= | 按位异或后赋值 | 变量^=表达式 | |||
|= | 按位或后赋值 | 变量|=表达式 | |||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左向右顺序运算 |
5、strcpy(s1,s2)字符串处理函数
http://tech.163.com/06/0628/09/2KMP8QP60009159Q.htmlvoid GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf( str );
}
GetMemory( char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完
char *str = NULL; GetMemory( str );
后的str仍然为NULL;
void GetMemory( char **p, int num )
{
*p = (char *) malloc( num );
}
void Test( void )
{
char *str = NULL;
GetMemory( &str, 100 );
strcpy( str, "hello" );
printf( str );
}
传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句
*p = (char *) malloc( num );
后未判断内存是否申请成功,应加上:
if ( *p == NULL ) { ...//进行申请内存失败处理 }
6、sizeof与strlen
http://www.cnblogs.com/carekee/articles/1630789.html1)、sizeof
sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
**************
2)、strlen
strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
short (array[5])[2][3];
cout<<sizeof(array)<<" ";
cout<<sizeof(array[0])<<" ";
cout<<sizeof(array[0][0])<<" ";
cout<<sizeof(array[0][0][0])<<endl;
结果为:60 12 6 2
7、linux内核中的链表与普通的链表有什么区别
http://www.linuxidc.com/Linux/2011-09/43483.htm内核链表是一个双向链表,但是与普通的双向链表又有所区别。内核链表中的链表元素不与特定类型相关,具有通用性。
kernel list展示的是内核链表的结构,normallist展示的是普通链表的结构。head是链表头,p1,p2,p3是链表节点。从图中可以看出普通链表的p1的next指针是指向的结构体p2的地址,p2的pre指针指向p1结构体的地址。而内核链表的p1的next指向的是p2结构体中包含pre和next部分的地址,的p2的pre指向的是p1结构体中包含pre和next部分的地址。依此类推,这就是区别。内核结构元素不与特定类型结构相关,任何结构体都可通过内核的添加成为链表中的节点。
8、ARM指令集中的除法运算
http://www.xbgk.com/ComWeb/WebTpOne/Tech_Show.asp?Uid=Xb88888888&id=3071在嵌入式软件编程中,为了节省CPU运行时间,应尽可能避免使用除法。对环形缓冲区的处理可以不用除法。如果不能避免除法运算,那么应尽可能使用除法程序同时产生商n/d和余数n%d的好处。对于重复对一除数d的除法.预先计算好s=(2k一1)/d,用乘以s的2k位乘法来代替除以d的k位无符号整数除法,可大大减少由于直接使用除法操作引入的指令周期数
相关文章推荐
- 嵌入式软件开发 必须掌握的知识点(三)(有错还望指点^_^)
- 嵌入式软件开发 必须掌握的知识点(一)(有错还望指点^_^)
- 进入软件开发行业必须要掌握的基础知识(2005-5-18)
- 每一个软件开发人员绝对必须掌握的关于 Unicode 和字符集的最基础的知识
- 嵌入式软件开发——嵌入式软件工程师应聘知识点
- 软件开发必须掌握的十大技术
- 嵌入式软件开发——嵌入式软件工程师应聘知识点
- 嵌入式系统Linux内核开发工程师必须掌握的三十道题
- [转帖]嵌入式LINUX开发必须掌握的命令集
- 每一个软件开发人员绝对必须掌握的关于 Unicode 和字符集的最基础的知识
- 粤嵌:嵌入式系统开发新手必须掌握的技能
- 软件开发必须掌握的十大技术(转)
- 每一个软件开发人员绝对必须掌握的关于 Unicode 和字符集的最基础的知识
- 嵌入式系统Linux内核开发工程师必须掌握的三十道题
- 嵌入式系统Linux内核开发工程师必须掌握的三十道题
- 加入嵌入式系统软件开发人员需掌握技能
- 每一个软件开发人员绝对必须掌握的关于 Unicode 和字符集的最基础的知识 (转)
- 嵌入式软件开发应掌握的技能汇总
- 写软件开发需求你必须掌握的规格
- 每一个软件开发人员绝对必须掌握的关于 Unicode 和字符集的最基础的知识