您的位置:首页 > 其它

在毕设中遇到的值得一记的小问题

2015-05-18 20:33 183 查看
最近两个月在做“基于ucos的导航接收机的研究”,其中要用到恩智浦的LPC3250芯片,基于ARM9内核。所用的编译器是IAR7.10。一下是我在做毕业设计当中遇到的一些小问题,但是不找到又很困扰。这些小问题都能在编译器手册、芯片手册、C语言书籍中找到。声明一下,本人还只是一个菜鸟,见笑了。

1、#pragma system _include

告诉编译器,如果“system”已经build,那么就把和它相关的某些内容包含在内。这个#pragma 指令很重要,在嵌入式C中,很好的使用它会让代码更紧凑高效。但我还是一个菜鸟,还不会灵活使用。

2、typedef struct

{

unsigned char no0:1;



unsigned char no7:1;

}

这段代码实现位段的功能,位段的成员是一个或多个位的字段,这些不同的字段实际上是存储在一个或多个整型变量中。位段可以根据不同的类型声明为8位的(unsigned char)、16位的(unsigned short int)、32位的(unsigned int)、64位的(unsigned long int)。在这个项目中,使用位段定义寄存器,再结合union实现对寄存器的每一位的访问。

3、@关键字

这是编译器的操作符,在IAR手册的327页。作用:alternatively the #pragma location directive, can be used for placing global and static variables at absolute addresses。翻译过来的意思是:也可以使用#pragma location,将全局或者静态变量放在一个内存中的绝对地址中。具体的可以查阅手册。

4、RSEG

RSEG section [:type][:flag][(align)]

IAR汇编器的指令,在IAR汇编手册中的P67,P75页。

SECTION的作用与此类似。

5、PUBLIC

汇编器的指令,export full 32-bit values,export symbol to other modules.

6、DEFINE

汇编器指令,Use DEFINE to define symbols that should be known to the module containing the

directive . After the DEFINE directive, the symbol is known。意思是:使用define指令定义必须被包含这条指令的模块识别的变量,define指令后,这个表示服就是已知的了。

7、IMPORT EXTERN

汇编器指令。两者的作用相同,import an extern symbol.

8、?XXX和_XXX

前者表示仅能由汇编访问的外部标号

后者表示可由C语言访问的标号

9、module

编译器指令,声明模块,能够被linker包含,参与链接,在一个文件中仅能有一个module。

10、##和#

在宏定义中##表示把位于它两边的符号连接成一个符号。它允许宏定义从分离的文本片段创建标识符。

#使宏定义中的变量被预处理器当做字符串使用。#argument被当成argument。

11、匿名的union和struct中成员的引用。

匿名本是C++支持,而C不支持,但是IAR将此特性拓展到C中,但在编译C程序时,要加上“-e”选项,而此选项是编译器默认的。

匿名的union和struct的成员是可以直接访问的,不需要经过union或struct名,并且本来就没有名字。

12、#ifdef __cplusplus

extern “c”{}

#endif

C++环境才会定义__cplusplus,告诉编译器下面是C语言函数(因为C++和C语言函数的编译转换不一样,主要是C++中存在重载)

暂时只有这些,但是会慢慢增加慢慢积累。在一开始,我觉得这些只是小问题,不足一记,但是就是这些小问题让我在编写代码经常出错、在阅读他人的代码时经常止步不前。菜鸟就是菜鸟啊,没有能力还不认真学,这是牢记了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: