打印

嵌入式C语言需要

[复制链接]
338|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiajs|  楼主 | 2017-9-9 21:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
huangchui| | 2017-9-9 21:53 | 只看该作者

static
l 静态变量作用范围在一个文件内 程序开始时分配空间结束时释放空间默认初始
化为0 使用时可改变其值
l 静态变量或静态函数 即只有本文件内的代码才可访问它它的名字变量名或函数
名在其它文件中不可见
l 在函数体内生成的静态变量它的值也只能维持
int max_so_far( int curr )//求至今本次调用为止最大值
{
static int biggest; //该变量保持着每次调用时的最新值它的有效期等于整个程序的有效期
if( curr > biggest )
biggest = curr;
return biggest;
}
l 在 C++类的成员变量被声明为static 称为静态成员变量意味着它为该类的所有实
例所共享也就是说当某个类的实例修改了该静态成员变量其修改值为该类的其它所
有实例所见而类的静态成员函数也只能访问静态成员变量或函数
l 类的静态成员变量必须在声明它的文件范围内进行初始化才能使用 private 类型的也不
例外如
float SavingsAccount::currentRate = 0.00154;
注currentRate 是类SavingsAccount 的静态成员变量

使用特权

评论回复
板凳
zhanghqi| | 2017-9-9 21:59 | 只看该作者

register
l 用 register 声明的变量称着寄存器变量在可能的情况下会直接存放在机器的寄存器
中但对32 位编译器不起作用当global optimizations 全局优化开的时候它会做
出选择是否放在自己的寄存器中不过其它与register 关键字有关的其它符号都对32
位编译器有效

使用特权

评论回复
地板
zhenykun| | 2017-9-9 22:01 | 只看该作者

auto
l 它是存储类型标识符 表明变量自动具有本地范围块范围的变量声明如for
循环体内的变量声明默认为auto 存储类型

使用特权

评论回复
5
wyjie| | 2017-9-9 22:54 | 只看该作者
extern
l 声明变量或函数为外部链接 即该变量或函数名在其它文件中可见被其修饰的变量
外部变量是静态分配空间的即程序开始时分配结束时释放用其声明的变量或
函数应该在别的文件或同一文件的其它地方定义实现在文件内声明一个变量或函
数默认为可被外部使用
l 在 C++中还可用来指定使用另一语言进行链接这时需要与特定的转换符一起使用
目前Microsoft C/C++仅支持”C”转换标记来支持C 编译器链接使用这种情况有两种
形式
u extern “C” 声明语句
u extern “C” { 声明语句块 }

使用特权

评论回复
6
yszong| | 2017-9-10 16:15 | 只看该作者

volatile
l 限定一个对象可被外部进程 操作系统硬件或并发线程等改变声明时的语法如

int volatile nVint;
这样的声明是不能达到最高效的 因为它们的值随时会改变系统在需要时会经常读写这个
对象的值只常用于像中断处理程序之类的异步进程进行内存单元访问

使用特权

评论回复
7
dengdc| | 2017-9-10 16:24 | 只看该作者
const
l const 所修饰的对象或变量不能被改变修饰函数时该函数不能改变在该函数外面声
明的变量也不能调用任何非const 函数在函数的声明与定义时都要加上const 放在函
数参数列表的最后一个括号后
l 在 C++中用const 声明一个变量意味着该变量就是一个带类型的常量可以代替
#define 且比#define 多一个类型信息且它执行内链接可放在头文件中声明但在C
中其声明则必须放在源文件即.C 文件中在C 中const 声明一个变量除了不能
改变其值外它仍是一具变量如
const int maxarray = 255;
char store_char[maxarray]; //C++中合法C 中不合法
l const 修饰指针时要特别注意例
char *const aptr = mybuf; // 常量指针
*aptr = 'a'; // Legal
aptr = yourbuf; // Error
const char *bptr = mybuf; // 指针bptr 指向常量数据
*bptr = 'a'; // Error
bptr = yourbuf; // Legal
l const 修饰成员函数时不能用于构造和析构函数

使用特权

评论回复
8
jiajs|  楼主 | 2017-9-10 16:26 | 只看该作者

本人新手看到最新的贴在上大家在定义变量的时候常常加上volatile 请问加上这个
目的是什么是否加上这个后变量存
放的位置就会发生变化谢谢大家

使用特权

评论回复
9
wuhany| | 2017-9-10 16:27 | 只看该作者

volatile 的本意是易变的
由于访问寄存器的速度要快过RAM 所以编译器一般都会作减少存取外部RAM 的优化

使用特权

评论回复
10
heweibig| | 2017-9-10 16:29 | 只看该作者
比如
static int i=0;
int main(void)
{
...
while (1)
{
if (i) dosomething();
}
}
/* Interrupt service routine. */
void ISR_2(void)
{
i=1;
}
程序的本意是希望ISR_2 中断产生时在main 当中调用dosomething 函数但是由于编译器
判断在main 函数里面没有修改过i 因此
可能只执行一次对从i 到某寄存器的读操作然后每次if 判断都只使用这个寄存器里面的i
副本导致dosomething 永远也不会被
调用如果将将变量加上volatile 修饰则编译器保证对此变量的读写操作都不会被优化肯
定执行此例中i 也应该如此说明

使用特权

评论回复
11
wuhany| | 2017-9-10 16:31 | 只看该作者

一般说来volatile 用在如下的几个地方
1 中断服务程序中修改的供其它程序检测的变量需要加volatile

使用特权

评论回复
12
wuhany| | 2017-9-10 16:34 | 只看该作者
2 多任务环境下各任务间共享的标志应该加volatile

使用特权

评论回复
13
lizye| | 2017-9-10 16:37 | 只看该作者
对,存储器映射的硬件寄存器通常也要加volatile 说明因为每次对它的读写都可能由不同意义

使用特权

评论回复
14
jiahy| | 2017-9-10 16:38 | 只看该作者

以上这几种情况经常还要同时考虑数据的完整性相互关联的几个标志读了一半被打断了
重写在1 中可以通过关中断来实
现2 中可以禁止任务调度3 中则只能依靠硬件的良好设计了

使用特权

评论回复
15
shimx| | 2017-9-10 16:40 | 只看该作者
“volatile”告诉编辑器,此变量是容易变化的,每次使用时都须重新读取值!

使用特权

评论回复
16
jiaxw| | 2017-9-10 16:42 | 只看该作者

volatile是针对编译器优化所作的妥协。

为了提高执行效率,编译器会尽可能把变量放到寄存器里,而不是存放在内存里。如果某全局变量有幸被放到寄存器里,则会带来如10楼所述之问题。为了避免此类问题,使用volatile关闭此优化。

使用特权

评论回复
17
jiajs|  楼主 | 2017-9-10 16:46 | 只看该作者
多谢,受益匪浅啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

940

主题

11975

帖子

6

粉丝