IAR中常用的 #pragma 命令和扩展关键字

pragma 命令

1、#pragma message(“ ”)

编译器编译到此处,在Build窗口中打印相应文本信息。

2、#pragma error “”

编译器编译到此处,在Build窗口中产生错误并打印其文本信息。

3、#pragma inline [=forced | never]

用这个指令是建议编译将这条指令后面的函数内联到调用它的函数的函数体中去。

当#pragma inline = forced,则强制让编译器对函数内联,如果内联不成功,会发出警告消息。

4、#pragma location = {address | register | NAME}

该指令用处

1)定位该指令之后的全局或静态变量到指定的absolute address上。其中变量必须定义为__no_init ============address(地址)

pragma location = address 等价于 @ address,其中变量也必须定义为__no_init 。

示例:

__no_init volatile char alpha @ 0xFF2000

运用绝对地址定位,还需注意地址的对齐问题。

2)定位该指令之后的变量到指定寄存器中,其中该变量必须声明为__no_init,同时该变量的作用域为整个文件。 =============register(寄存器R4-R11)

pragma location = register 等价于 @ register,其中变量也必须定义为__no_init

3)将该指令之后的函数或变量放置到一个指定的section中。其中,不要试图将那些通常放在不同section的变量放置在同一section中。

=============NAME(A user-defined section name; cannot be a section name predefined for use by the compiler and linker.

pragma location = section 等价于 @ section

示例

变量放置在自定义的section中。

__no_init int alpha @ “MY_NOINIT”; /* OK */

#pragma location=”MY_CONSTANTS”

const int beta; /* OK */

函数放置在自定义section中。

void f(void) @ “MY_FUNCTIONS”;

void g(void) @ “MY_FUNCTIONS”

{

}

#pragma location=”MY_FUNCTIONS”

void h(void);

5、#pragma required = symbol

#pragma required确保链接输出中包括某个符号所需的另一个符号。该指令必须放在紧邻第二个符号的前边。如果符号在应用中不可见,使用该指令。例如,如果仅通过某个变量所在的段对其进行间接引用,必须使用#pragma required。

eg:

const char copyright[] = “Copyright by me”;

#pragma required=copyright

int main()

{

/* Do something here. */

}

Even if the copyright string is not used by the application, it will still be included by the

linker and available in the output.

扩展关键字

__no_init

正常情况下,应用程序启动时,IAR运行时环境将全部全局和静态变量初始化为0。IAR C编译器支持声明不初始化的变量,使用__no_init类型限定符。声明__no_init的变量不需初始化。一些关键数据在系统复位(如看门狗复位或其他原因造成的复位)时的数值是不能改变的!在这种情况下可用__no_init限定。

__root

__root限定的函数和变量在即是没有被任何函数引用的情况下,它依然存在于目标代码中而不会被优化掉。

__task

被该关键字限定的函数在被调用时不会做寄存器保护,即没有寄存器入栈出栈操作。通常用在RTOS的启动函数中。

By default, functions save the contents of used preserved registers on the stack upon entry, and restore them at exit. Functions that are declared __taskdo not save all registers, and therefore require less stack space.

Because a function declared __taskcan corrupt registers that are needed by the calling function, you should only use __taskon functions that do not return or call such a function from assembler code.

The function maincan be declared __task, unless it is explicitly called from the

application. In real-time applications with more than one task, the root function of each task can be declared __task.

在IAR中实验了一下,发现编译器还是将寄存器进行了压栈操作,不知为何?

时间: 2024-10-13 12:19:26

IAR中常用的 #pragma 命令和扩展关键字的相关文章

软件测试工程师工作中常用的Linux命令

Linux系统有着众多的优点,比方开源.非商业版本免费.多任务多用户操作,因而Linux系统在非桌面范畴占有压倒性的市场份额.关于互联网技术工作者来说,控制常用的Linux命令也是一门必修课.下面罗列一些笔者在工作中常用的Linux命令. cd 切换目录 cd .. 返回上一层目录 cd . 进入当前目录 cd - 返回前一次的目录,即上一次的目录不是上一层目录 ls 查看文件与目录 用法: ls [参数][文件] 参数: ls –l 显示文件的权限和属性 ls –a 列出所有的文件,包含隐藏文

Tcl与Design Compiler (十三)——Design Compliler中常用到的命令(示例)总结

本文如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/  ,作者:IC_learner 本文将描述在Design Compliler中常用到的命令,这些命令按照流程的顺序进行嵌套讲解,主要是列举例子:大概的讲解布局如下所示: 大概有11个部分,下面我们逐个部分进行(简单的)介绍的举例. 1.tcl的命令和结构 tcl的命令和结构请参照第二节的内容: http://www.cnblogs.com/IClearner/p/6617207.

数据库中常用的删除命令

一.删除用户命令 drop user 和drop user cascade的区别: 1. Oracle中删除用户命令有两种:drop user XX: 和 drop user XX cascade: drop user XX ;必须是在该用户下没有任何对象才能使用该命令,否则会报错:如果用户下有对象,就得用drop user XX cascade ;来删除这个用户以及这个用户下的所有对象. 注:删除用户下的所有对象包括触发器.存储过程.表等,但不会删除表空间. 数据库中常用的删除命令,布布扣,b

【转】CentOS系统中常用查看日志命令

CentOS系统中常用查看日志命令 时间:2014-03-10 23:52来源:blog.csdn.net 作者:虎子 Linux IDE RedHat 防火墙活动 .cat tail -f 日 志 文 件 说    明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全相关的日志信息 /var/log/maillog 与邮件相关的日志信息 /var/log/cron 与定时任务相关的日志信息 /v

工作中常用的Linux命令(2):ipcs/ipcrm命令

ipcs 1. 命令格式 ipcs [resource-option] [output-format] ipcs [resource-option] -i id 2. 命令功能 提供IPC设备的信息 3. 使用方法 resource选项: ipcs -m 查看系统共享内存信息 ipcs -q 查看系统消息队列信息 ipcs -s 查看系统信号量信息 ipcs [-a] 系统默认输出信息,显示系统内所有的IPC信息 [[email protected] data]$ ipcs -a ------

工作中常用的Linux命令:目录

工作两三年,每天都和Linux打交道,但每每使用Linux命令的时候却会像提笔忘字般不知如何使用,常常查手册或到网上找资料.此系列文章主要是为了方便自己在使用命令时随时可查阅.鄙人才疏学浅,文中若有任何错误可在留言中指正,以供大家共同进步.学习的主要参考资料: 1. <Unix环境高级编程>.<shell脚本学习指南>... 2. 我使用过的Linux命令系列 3. 每天一个Linux命令 4. 网上的其他资料 1. 工作中常用的Linux命令(1):find命令 2. 工作中常用

开发过程中常用的Linux命令

做Java开发好几年了,部署JavaWeb到服务器上,一般都选择Linux,Linux作为服务器真是不二之选,高性能,只要熟悉Linux,操作快捷,效率很高. 总结一下工作中常用的Linux命令备忘: 一.文件操作相关命令 1.创建目录 mkdir software 2.创建多级目录 mkdir /opt/software/ -p 3.删除文件或目录 rm test.sh 此删除命令运行后需要输入y确认的交互过程 rm -f test.sh 直接强制删除不需要输入yes确定 rm -rf /op

我工作中常用的Git命令

本篇文章记录的是博主在现实工作中常用的Git命令....... 注:如果想了解更全面的Git命令请咨询度娘或者官方文档 克隆项目 git clone -b  要更新的分支名称(如:master)  http://用户名:密码@ 192.168.66.66/root/xxx.git 说明:    1.克隆前先创建好要存放项目的目录,路径尽量不要有中文 2.这里使用的是http协议的+指定分支名称+指定用户名和密码 2.更新项目   +   提交项目 博主强烈建议使用SourceTree等工具进行更

maven用途、核心概念、用法、常用参数和命令、扩展

http://trinea.iteye.com/blog/1290898 本文由浅入深,主要介绍maven的用途.核心概念(Pom.Repositories.Artifact.Build Lifecycle.Goal)介绍.用法(Archetype意义及创建各种项目).maven常用参数和命令以及简单故障排除.maven扩展(eclipse.cobertura.findbugs.插件开发).maven配置. 本文较长,可根据个人需要有选择性的查看,比如先看用法再回过头来看核心概念 1.maven