由于在ucosII中主要用的是C语言,这样有利于移植,因为汇编语言对底层的直接操作是基于不同的平台的。所以按照我自己的学习步骤,我先对一些基础知识进行了相应的复习
。如C语言和数据结构。
先进行了C语言的相关复习,并自己做了一些相应的笔记.我的参考书目如下:
C程序设计语言(第二版 新版) 美 Brian W.Kernighan (这个人大家应该熟悉)
C陷阱与缺陷 第N版 美 Andrew Koenig(这个人大家也应该熟悉)
1.整数除法会有舍位操作,结果中任何小数部分都会被舍弃掉 ie.5/9 = 0
2.main函数中的变量是main函数的局部变量,其他函数不能直接进行调用和访问,(针对一般函数同样)函数中的每个局部变量仅在调用时存在,在函数执行完毕后消失(此点 不能应用在Keil编译器中,有所不同)。外部变量的定义在函数外部,其他函数可以进行访问(但是全局变量的应用应尽量减少),函数执行完后不会消失,定义外部变量后编译程序将为它分配存储单元。每个需要访问外部变量的函数中必须进行声明(关键字extern)。当使用extern进行声明的时候(1):当在当前文件中定义了外部变量,并在当前文件中的函数中进行使用时,无需用extern进行声明(即隐式声明),直接进行使用即可(2)若在多个文件中。当函数访问其他文件中的外部变量时,需要用extern进行显示声明。通常把外部变量全部放在头文件中。
3.常量表达式(如#define MAXLINE 1000)在编译时进行求值,而不在运行时进行求值
4.在关系运算符的使用中,对于&&和|| 应该注意(1)a && b:当a为假时,不再进行b的判断(2)a||b :当a为真时,不再进行b的判断(由此可以看到该运算符体现出了一种优先级的关系)
5.强制类型转换:(类型名)表达式
ie : (void *)0; char *p = (void *)0;
6.按位运算符(主要用于对某一位进行置一和清零)
7.a = a & 0x0f 可以写成a&=0x0f 这样写的好处是能够产生比较高效的代码,不习惯使用的也可以不用考虑
8.break与return :return 直接进行返回,不再执行函数中其他的部分(这样讲应该能理解),return的类型应该与函数的类型相一致 若函数为void 可以return;若为char,则return (char);(return 后面没有表达式时即不向函数返回值)
break跳出当前的循环,但是不一定跳出了函数,只是不再执行此次循环,也经常用于switch语句。
9.外部变量或函数的作用域从声明它的地方开始到其所在文件的末尾结束,同时如果外部变量定义之前使用该变量或不在同一文件中时,必须用extern进行声明。外部变量的初始化只能出现在定义中
10. 对于静态变量用static声明限定外部变量和函数,可以将其后声明的对象的作用域限定为编译源文件的剩余部分,通过static限定外部对象时,可以达到隐藏外部对象的目的。(即static声明的变量属于全局变量,但是只能用于该文件中,在其他的文件中不能对该变量进行访问,从而达到对外部文件的隐藏)当然static也可用于声明内部变量,static声明的局部变量的不同之处在于:static声明的变量不管函数是否被调用,该变量一直存在,一直占据存储空间,这样在每次进行相应函数的调用时,每次使用该变量的值并不应是你初始化的值,而是在你上次调用该函数后被赋予的值
11.C的预处理命令也很容易理解,在ucosII中也有大量的应用。好处当然是使程序更清晰,易于调试。ucosII也给出了很多的宏替换,更改这些宏可以在程序中利用#if语句对ucosII进行配置
12.typedef和#define的功能十分类似。但是由于typedef是由编译器解释的,因此他的文本替换功能超过预处理的能力
13.指针是C语言的特有的性质。
定义:指针是一种保存变量地址的变量。指针是一种变量,他也会占用存储空间。他的空间中存储的是某个其他变量的地址。查找指针变量,就能找到待找变量的地址,从而找到要找的变量的值。(当然地址其实也是一个数值)。指针与数组的联系,函数的联系很密切。如a[100],该数组的首地址就是a,*a指的就是a中存放的地址所指向的内容(因为*为取内容操作符),也即a[0].函数char Task();那么Task就是指向该函数首地址的指针。
14.通用指针类型void *;指向void类型的指针可以存放指向任何类型的指针,任何类型的指针可以转化为void *类型,并且在将它转换回原来的类型的时候不会丢失信息
至于结构体,我放在了数据结构中进行了总结