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

来源:互联网 发布:第一台女程序员 编辑:程序博客网 时间:2024/06/06 21:25

最近两个月在做“基于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++中存在重载)

暂时只有这些,但是会慢慢增加慢慢积累。在一开始,我觉得这些只是小问题,不足一记,但是就是这些小问题让我在编写代码经常出错、在阅读他人的代码时经常止步不前。菜鸟就是菜鸟啊,没有能力还不认真学,这是牢记了。

0 0
原创粉丝点击